[운영체제] 동기(Sync)와 비동기(Async), Blocking과 Non-blocking
동기와 비동기, 블로킹과 논-블로킹 너무 헷갈려
운영체제를 공부하다 보면 동기(Syncronous)와 비동기(Asynchronous), 블로킹(Blocking), 논-블로킹(Non-blocking)에 대해 들어볼 수 있다. 이 개념들은 언뜻 보면 매우 헷갈리기 때문에 한 번 정리가 필요하다고 생각했다.
검색해 보니 좋은 글들이 많아 이해가 쉬웠다. 이를 종합해서 설명해 보겠다.
[그림 1]은 IBM DeveloperWorks Library에 게재된 Boost application performance using asynchronous I/O라는 글에서 사용된 도표이다. 해당 게시글은 2006년에 Linux의 Asynchronous I/O(AIO)에 대해 설명하는 글이다.
AIO는 쉽게 말해 프로세스가 여러 개의 I/O 작업을 블록(Block)하거나 완료될 때까지 기다릴 필요 없이 시작할 수 있도록 하는 것이다. 즉, Non-Blocking 이면서 Asynchronous 하다.
아직 이해가 되지 않아도 괜찮다. 하나하나 천천히 알아보자.
블로킹(Blocking) / 논-블로킹(Non-blocking)
배구에는 블로킹(Blocking)이라는 기술이 있다. 상대방의 공격을 막아 공이 넘어오지 못하게 막는 기술이다.
이처럼 블로킹(blocking)은 뭔가 막히는, 제한되는 상황을 뜻하는 단어이다. 여기서 제어권을 공이라 생각하면 편하겠다.
블로킹(Blocking)은 자신의 작업을 진행하다 다른 주체의 작업이 시작되면 그 작업이 끝날 때까지 기다리는 것을 뜻한다. 즉, 호출된 함수가 자신의 작업을 끝낼 때까지 제어권을 가지고 호출한 함수에게 제어권을 바로 돌려주지 않는 것을 의미한다.
앞으로 치킨 집에 포장 주문을 하러 온 상태를 예로 들어보겠다. 손님은 주문을 하기 전 스마트폰으로 뉴스를 보고 있었다고 하자.
블로킹(Blocking) 예시
손님 : (뉴스를 보다가) 치킨 한 마리 포장해 주세요
점원 : 네, 조금만 기다려주세요 (치킨을 튀기기 시작)
손님 : (가만히 자리에 서서 치킨이 포장되기를 기다린다)
점원 : 다 됐습니다.
손님 : 감사합니다^^ (다시 뉴스를 본다)
반면, 논-블로킹(Non-blocking)은 다른 주체의 작업이 시작돼도 기다리지 않고 바로 자신의 작업을 하는 것을 뜻한다.
즉, 호출된 함수가 자신의 작업을 끝내지 않았더라도 호출한 함수에게 제어권을 바로 돌려주는 것을 의미한다.
논-블로킹(Non-blocking) 예시
손님 : (뉴스를 보다가) 치킨 한 마리 포장해 주세요
점원 : 네, 조금만 기다려주세요 (치킨을 튀기기 시작)
손님 : (다시 뉴스를 본다)
점원 : 다 됐습니다.
손님 : 감사합니다^^
동기(Sync) / 비동기(Async)
동기(Sync)는 호출된 함수의 수행 결과 및 종료를 호출한 함수가 계속해서 신경 쓰는 상태를 뜻한다.
동기(Sync) 예시
손님 : (뉴스를 보다가) 치킨 한 마리 포장해 주세요
점원 : 네, 조금만 기다려주세요 (치킨을 튀기기 시작)
손님 : 포장 다 됐나요?
점원 : 아직이요
손님 : 지금은 다 됐나요?
점원 : 아직이요 ㅡㅡ
손님 : 지금은요????
점원 : 다 됐습니다.
손님 : 감사합니다^^
반면, 비동기(Async)는 호출된 함수의 수행 결과 및 종료를 호출한 함수가 신경 쓰지 않고 호출된 함수 혼자 직접 신경 쓰는 경우를 뜻한다.
비동기(Async) 예시
손님 : (뉴스를 보다가) 치킨 한 마리 포장해 주세요
점원 : 네, 조금만 기다려주세요 (치킨을 튀기기 시작)
손님 : (치킨이 다 되든 말든 신경 안 씀)
점원 : 치킨 다 됐습니다.
손님 : 감사합니다^^
동기(Sync) & 블로킹(Blocking)
동기(Sync)이면서 블로킹(Blocking)인 경우는 어떤 걸까?
예를 들면 다음과 같다.
동기(Sync) & 블로킹(Blocking) 예시
손님 : (뉴스를 보다가) 치킨 한 마리 포장해 주세요
점원 : 네, 조금만 기다려주세요 (치킨을 튀기기 시작)
손님 : (가만히 자리에 서서 치킨이 포장되기를 기다리며) 치킨 다 됐나요?
점원 : 아직이요
손님 : 지금은요?
점원 : 다 됐습니다.
손님 : 감사합니다^^ (다시 뉴스를 본다)
여기서 손님은 자신의 일은 하지 못하고 치킨이 다 됐는지에 대해서만 궁금해하고 있다.
이러한 상황이 동기&블로킹 상태이다.
동기(Sync) & 논-블로킹(Non-blocking)
동기(Sync)이면서 논-블로킹(Non-blocking)인 경우는 어떤 걸까?
예를 들면 다음과 같다.
동기(Sync) & 논-블로킹(Non-blocking) 예시
손님 : (뉴스를 보다가) 치킨 한 마리 포장해 주세요
점원 : 네, 조금만 기다려주세요 (치킨을 튀기기 시작)
손님 : (다시 뉴스를 보며) 치킨 다 됐나요?
점원 : 아직이요
손님 : (다시 뉴스를 보며) 지금은요?
점원 : 다 됐습니다.
손님 : 감사합니다^^
여기서 손님은 자신의 일(뉴스 보기)를 하면서 동시에 치킨이 다 됐는지를 궁금해하고 있다.
이러한 상황이 동기&논-블로킹 상태이다.
비동기(Aync) & 블로킹(Blocking)
비동기(Async)이면서 블로킹(Blocking)인 경우는 어떤 걸까?
예를 들면 다음과 같다.
비동기(Async) & 블로킹(Blocking) 예시
손님 : (뉴스를 보다가) 치킨 한 마리 포장해 주세요
점원 : 네, 조금만 기다려주세요 (치킨을 튀기기 시작)
손님 : (가만히 자리에 서서 치킨이 포장되기를 기다린다, 치킨에 관심이 없다)
점원 : 다 됐습니다.
손님 : 감사합니다^^
여기서 손님은 자신의 일은 하지 못하고 기다린다. 이때 치킨이 다 됐는지에 대해 관심은 없다.
이러한 상황이 비동기&블로킹 상태이다.
비동기(Aync) & 논-블로킹(Non-blocking)
비동기(Async)이면서 블로킹(Non-blocking)인 경우는 어떤 걸까?
예를 들면 다음과 같다.
비동기(Async) & 블로킹(Non-blocking) 예시
손님 : (뉴스를 보다가) 치킨 한 마리 포장해 주세요
점원 : 네, 조금만 기다려주세요 (치킨을 튀기기 시작)
손님 : (뉴스를 다시 본다, 치킨에 관심이 없다)
점원 : 다 됐습니다.
손님 : 감사합니다^^
여기서 손님은 자신의 일은 하지 못하고 기다린다. 이때 치킨이 다 됐는지에 대해 관심은 없다.
이러한 상황이 비동기&논-블로킹 상태이다.
정리
정리하자면 동기/비동기는 다른 작업의 결과에 신경 쓰는지에 대한 여부, 블로킹/논-블로킹은 다른 작업이 진행되는 동안 제어권이 있는지 없는지에 대한 여부로 구분한다는 것이다.
참고
1. https://developer.ibm.com/articles/l-async/
2. https://musma.github.io/2019/04/17/blocking-and-synchronous.html