CS

[OS] 동기와 비동기

그레고리력 2021. 4. 3. 20:28

동기와 비동기라는 개념은 OS에서만 쓰이는 개념은 아니지만 자주 언급되는 내용으로 간단히 정리하고 넘어가겠습니다.

동기(Synchronous)란?


  • 동기란 말그대로 동시에 일어난다는 뜻입니다.
  • 요청과 결과가 동시에 처리되고 요청과 처리가 순서대로 일어날 때 동기적 처리라 합니다.
  • 따라서 비동기란 요청 순서에 따라 처리되지 않는 경우 등의 경우를 말합니다.

동기와 비동기 장단점


동기

  • 동기적 처리는 작업의 순서가 중요한 경우 사용되며 설계가 간단하고 직관적입니다.
  • 다만 한 가지 일이 끝날 때까지 다른 일을 못하므로 해당 작업 처리 시간이 길어질 때 다른 일을 못한다는 단점이 있습니다.
  • system call을 보낸 후 응답을 받을 때까지 대기 상태에 있다 응답을 받은 후 종료

비동기

  • 반대로 비동기 작업의 경우 어떤 작업의 종료까지 기다리지 않고 상태를 저장한 후 다음 작업을 수행할 수 있습니다.
  • 따라서 다수의 작업 처리가 가능해 I/O 요청이 많거나, 빠른 응답속도를 요구하는 경우 적합합니다.
  • 반면 작업간 전환 시 추가 작업이 필요하기 때문에 전체적인 수행 속도는 느릴 수 있습니다.
  • 비동기는 system call을 보낸 후 실행 여부와 관계없이 바로 응답을 받음

비동기, 동기 관련 용어


동기에 대한 개념을 알고 있더라도 일반적으로 사용하는 용어가 아닌 다른 용어를 사용한다면 전문성에 의심을 받을 수 있습니다.
따라서 비동기, 동기에 관련된 용어를 살펴보겠습니다.

입출력

  • 동기식입출력 : 요청한 프로그램이 입출력이 완료될 때까지 다음 명령을 실행할 수 없는 경우
  • 비동기식입출력 : CPU의 제어권을 입출력 연산을 호출한 프로그램에게 곧바로 다시 부여(처리 가능한 작업부터 처리)

sync vs async

  • 호출되는 함수의 작업 완료를 누가 신경쓰는지
  • 호출되는 함수에 callback을 전달하고 작업 완료여부를 신경쓰지 않으면 비동기
  • 호출하는 함수의 작업 완료 후 리턴을 기다리거나, 호출되는 함수로부터 바로 리턴을 받더라도 작업 완료 여부를 호출하느 함수 스스로 계속 확인하면 동기

Blocking vs Non-blocking

  • 호출되는 함수가 바로 리턴하는지 마는지(제어권)에 대한 문제
  • 함수 호출 후 요청을 보낸 후 바로 리턴되면 non-blocking
  • 함수 호출 후, 기대되는 행위를 마친 후 리턴되면 blocking되었다고 표현
  • 애플리케이션 실행 시 운영체제 대기 큐에 들어가면서 요청에 대한 system call이 완료된 후에 응답을 보낼 경우 blocking
  • 애플리케이션 실행 시 운영체제 대기 큐에 들어가지 않고, 실행 여부와 관계없이 바로 응답을 보낼 경우 non-blocking

non-blocking vs asynchronous

  • system call이 반환될 때 실행된 결과와 함께 반환될 경우 non-blocking
  • system call이 반횐될 때 실행된 결과와 함께 반환되지 않는 경우 asynchronous
  • asynchronous는 요청에 대해 처리 완료의 여부와 관계없이 바로 응답한다. 이후 운영체제에서 응답할 준비가 완료되는 시점에 응답한다.
  • asynchronous는 별도의 스레드로 실행하고 완료되면 호출측에 알려줌
  • non-blocking은 요청에 대해 바로 응답할 수 있는 경우 응답을 하고, 바로 응답하기 힘든 경우 에러를 반환한다. 에러를 받을 경우 데이터를 정상적으로 받을 때까지 계속해서 요청을 다시 보낸다.
  • 비동기형 통지모델에서 Notify의 적극적인 주체는 커널이 되며, 유저 프로세스는 수동적인 입장에서 자신이 할일을 하다가 통지가 오면 그때 I/O 처리를 하게 된다.

synchronous vs blocking

  • 시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수가 아니면 synchronous(다른일 할 수 있음)
  • 시스템의 반환을 기다리는 동안 대기 큐에 머무는 것이 필수이면 blocking(다른 일 못 함)

동기, 논블럭
  • NonBlocking-Sync는 호출되는 함수는 바로 리턴하고, 호출하는 함수는 작업 완료 여부를 신경쓰는 것
  • 호출하는 메서드가 호출되는 메서드 쪽에 작업 완료 여부를 계속 문의
비동기, 블럭
  • Blocking-Async는 호출되는 함수가 바로 리턴하지 않고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않는 것

블록, 논블록은 제어권에 대한 차이(제어할 수 없는 대상의 처리방법, 논블럭은 제어권이 호출자에게 바로 넘어감)
동기는 시간에 대한 관점(함수 a의 끝과 b의 시작을 맞추거나 제어권의 반환과 결과값의 전달을 맞출 때)