동기 + blocking : [호출한] 함수가 [호출된] 함수의 실행이 완료될 때까지(return될 때까지) Thread1은
task2를 실행하지 않는다.
동기 + non-blocking : [호출한] 함수가 [호출된] 함수가 즉시 작업을 완료하지 못하면 즉시 return을 하여 코드 실행 제어
권을 다른 쓰레드에게 넘겨서 그 쓰레드는 [호출된] 함수의 실행이 완료될 때까지 다른 작업을 할 수가 있다.
이때, [호출한] 함수(쓰레드)는 주기적으로 [호출된] 함수에게 작업 완료 여부를 물어 본다
[호출된] 함수의 실행이 완료되면 비로서 return 값을 받아서 [호출한] 함수의 나머지 코드들을 실행을 한다.
(non-blocking은 Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO를 처리 가능하다.)
비동기 + blocking : [호출된] 함수는 실행이 완료될 때까지 return을 하지 않고 blocking을 걸어서,
다른 쓰레드가 다른 작업을 하지 못하도록 대기시킨다.
[호출된] 함수가 작업의 완료 여부를 책임지고 알린다.
비동기 + non-blocking : [호출된] 함수는 즉시 실행이 완료되지 못하면, 즉시 return을 하여서,
다른 쓰레드가 다른 일을 할 수 있게 한다.
[호출된] 함수가 작업의 완료 여부를 책임지고 알린다.
(non-blocking은 Thread 관점으로 본다면, 하나의 Thread가 여러 개의 IO를 처리 가능하다.)
정리
동기/비동기, blocking/non-blocking의 차이는?
사실 이렇게만 보면 동기랑 blocking이 비슷하고, 비동기랑 non-blocking이 비슷해보인다.
동기/비동기, blocking/non-blocking 두 그룹의 차이는 관심사가 다르다.
blocking/non-blocking
이 그룹은 호출되는 함수가 즉시 return하느냐 마느냐가 관심사이다.
호출된 함수가 바로 return해서 호출한 함수에게 제어권을 넘겨주고
호출한 함수가 다른 일을 할 수 있는 기회를 줄 수 있으면 non-blocking이다.
호출된 함수가 자신의 작업을 모두 마칠 때까지
호출한 함수에게 제어권을 넘겨주지 않고 대기하게 만든다면 blocking이다.
동기/비동기
이 그룹은 호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐가 관심사이다.
호출되는 함수에게 callback을 전달해서 호출되는 함수의 작업이 완료되면
호출되는 함수가 전달받은 callback을 실행하고, 호출한 함수는 작업 완료 여부를 신경쓰지 않는다면 비동기이다.
호출하는 함수가 호출되는 함수의 작업 완료 후 return을 기다리거나
호출되는 함수로부터 바로 return 받더라도 작업 완료 여부를 호출한 함수 스스로 확인하며 신경 쓴다면 동기이다.
'CS 잡지식' 카테고리의 다른 글
Netty의 멀티/싱글 쓰레드 동작 원리 (0) | 2023.09.27 |
---|---|
CORS 정책(Feat. 웹 사이트 보안 이슈, Referer) (0) | 2023.06.29 |
CallBack함수(feat. 비동기 처리의 [동기화] ) (0) | 2023.06.28 |
동기, 비동기 함수(FEAT. JS) (0) | 2023.06.26 |
@Tailable(feat.SSE Protocol...) (0) | 2023.06.26 |