[운영체제] 동기와 비동기

VSFe·2022년 2월 24일
0

CS

목록 보기
5/5

지난 포스트에서는 여러 프로세스들의 동작을 관리하기 위한 스케쥴링에 대해 알아 보았다.

이번에는 하나의 프로세스에 초점을 맞춰보자. 하나의 프로세스에도 여러 작업이 진행되어야 할 수 있는데, 이 작업들을 어떻게 처리할 것인가?

동기 (Synchronous) 와 비동기 (Asynchronous)

동기와 비동기를 다룰 때면 항상 대표적으로 나오는 사진이다.

동기

요청이 들어온 순서에 맞게 하나씩 처리하는 방식이다. 순서에 맞춰 진행되는 장점이 있지만, 여러 가지 요청을 동시에 처리할 수 없다.

위 그림의 (a)처럼 커피 주문을 받고 나올 때까지 기다리는 것이 동기 방식의 예시라고 할 수 있다.

비동기

하나의 요청에 대한 응답을 바로 처리하지 않고, 여러 개의 요청을 동시에 처리할 수 있는 장점이 있지만 동기 방식보다 속도가 떨어질 수도 있다.

위 그림의 (b)처럼 점원 한명이 커피 주문을 받고 다른 점원이 커피를 건네주는 것이 비동기 방식의 예시다.

여기서 중요한 점이라면, 비동기 방식의 경우 먼저 들어온 작업이 먼저 끝난다는 보장을 할 수 없다는 점이다.

블로킹과 논블로킹

여기서 한발 더 나아가면, 블로킹 (Blocking)과 논블로킹 (Non-Blocking) 이라는 용어도 존재한다.

동기/비동기와 비슷할 수도 있지만 엄밀히 말하면 다른 개념인데, 이 두 용어는 다른 작업을 호출한 후 어떻게 동작하는가에 초점을 맞춘다.

  • 자신의 작업을 수행하다 다른 작업을 호출하였을 때, 이 작업의 시작부터 끝가지 기다렸다가 다시 자신의 작업을 수행한다면 우리는 이 작업을 블로킹 이라고 부른다.
  • 반대로, 다른 작업을 호출했다고 해도 자신의 작업을 계속한다면 우리는 이 작업을 논블로킹 이라고 할 수 있다.

유사한 것들의 비교

위에서도 이야기 했지만 동기/비동기와 블로킹/논블로킹은 완전히 다른 주제이다.

동기/비동기는 함수 호출 후 반환값이 바로 나오는지/아닌지에 대한 관점이며,
블로킹/논블로킹은 호출되는 함수의 작업 완료 여부를 누가 판단하냐에 대한 관점이다.

4가지 시나리오

결국, 동기/비동기와 블로킹/논블로킹은 다른 개념이기 때문에, 다음과 같이 4가지의 시나리오가 등장하게 된다.

  • 동기 + 블로킹: "한 작업이 종료될 때 까지 기다린 후 다른 작업을 수행하는" 동기의 특성과 "중간에 호출한 다른 작업의 주체가 작업하는 동안 기다릴 것" 이라는 비동기의 특성을 합한 경우로, 함수에서 다른 함수를 호출하는 경우/서버에서 DB에 쿼리를 날리는 경우 등이 있다.
  • 비동기 + 블로킹: 해당 조건의 경우, 비동기의 특성인 "한 작업이 종료될 때 까지 기다리지 않고 다른 작업을 시작함" 이 블로킹과 만나게 되는데, 이는 결과적으로 다른 작업이 끝날 때 까지 기다려야 하는 결과를 초래하기 때문에, 좋은 효율이 나오지 않는다.
  • 동기 + 논블로킹: 비동기 + 블로킹과 유사하게, 결과적으로 다른 작업이 끝날 때 까지 기다려야 한다.
  • 비동기 + 논블로킹: 일반적으로 해야 할 작업이 대규모이고, 동기가 필요하지 않을 때 효과적인 작업으로, 푸시메시지 전송이나 API 호출등에서 사용할 수 있다.
profile
아직 많이 공부 중...

0개의 댓글