[OS] Sync / Async / Blocking / Non-Blocking
프로그래밍을 시작한 사람들 중 동기 및 비동기에 대하여 많이 접해봤을 것이다.
Syncronous (동기) :동시 발생[존재]하는
Asynchronous(비동기) : 동시에 존재[발생] 하지 않는
이라는 단어의 뜻을 가지고 있으며, 단어만 보았을 때에는 이해가 바로 되지 않을 수 있다.
동기와 비동기는 특정 작업들이 있을 때, 작업 완료의 여부와 관련된 순서에 관한 것이고,
유사하지만 다른 개념인 Blocking / Non-block도 같이 알아볼 것이다.
Blocking/Non-blocking : 프로세스의 유휴 상태(제어권)에 관한 것
- Blocking : 호출된 함수가 자신의 작업을 모두 마칠 때까지 호출한 함수가 제어권 없이 대기
- Non-blocking : 호출된 함수가 리턴 후 호출한 함수에게 제어권을 넘겨주고, 호출한 함수가 다른 작업을 실시
Sync/Async : 프로세스의 작업 순서 보장에 관한 것
- Sync :호출되는 함수의 리턴의 여부와 관계 없이 호출되는 함수의 작업 완료를 호출 후 완료 시 작업 실시
- Async :호출되는 함수에게 callback을 전달 후 작업이 완료되면 호출되는 함수가 받은 callback을 실행
서로 다른 개념이기 때문에 다음과 같이 총 4가지의 경우의 수가 나올 수 있다.
- Blocking - Sync
- Non-blocking - Sync
- Blocking - Async
- Non-blocking - Async
다음의 예시를 보며 하나씩 알아보자
1. Blocking - Sync :
호출된 함수에게 제어권을 위임하여 종료될 때까지 대기를 한다.
2. Non-blocking - Sync :
호출된 함수가 빠르게 제어권을 반환하고 반복적으로 호출된 함수가 종료가 되었는지 호출을 한다.
3. Blocking - Async :
호출을 할 때 Callback 함수를 제어권과 함께 전송하여 Callback 호출이 이루어질때까지 대기한다.
4. Non-blocking - Async :
호출을 할 때 Callback 함수를 동봉하고 제어권은 호출한 함수가 가지고 있으며,
Callback 호출이 이루어지는 함수들부터 작용한다.
결국 비슷해 보이지만, 제어권의 주체 및 Callback함수와 그 순서에 따라
함수의 결과를 반환하는 순서가 나뉘는 것이고, Sync/Async와 Blocking/Non-blocking은
확실하게 다른 개념이라고 볼 수 있는 것이다.