프로그래밍을 하거나 컴퓨터 과학을 학습할 때, 동기와 비동기 그리고 블로킹과 논블로킹이란 단어들을 쉽게 접할 수 있다. 다만 '동기==블로킹', '비동기==논블로킹'이란 개념을 쉽게 가질 수 있는데, 이는 잘못된 개념이다. 두개념들 사이에는 서로 연관관계가 없고, 별개의 개념이다. 두 개념은 서로 다른 관점을 가지고 있다. 간단히 정리하자면 다음과 같다.
- 동기 vs 비동기 : 처리해야 할 작업들을 어떠한 흐름으로 처리 할 것인가에 대한 관점 (2개이상의 주체)
- 블로킹 vs 논블로킹 : 처리되어야 하는 작업이 전체적인 작업 흐름을 막느냐 안막느냐에 대한 관점 (2개이상의 대상)
이렇게 두 개념이 작업에 대해 서로 바라보는 관점이 다르기때문에 이 두 개념은 비동기+논블로킹, 동기+논블로킹, 비동기+블로킹, 동기+블로킹 이렇게 공존할수도 있다.
동기(Synchronus)와 비동기(Asynchronous)
동기와 비동기의 차이는 호출되는 함수의 작업 완료를 신경쓰는지의 여부차이이다. 즉 작업을 수행하는 2개이상의 대상에 대해 다음 작업이 요청되는 시간과 관련이 있다.
동기
- 현재 작업의 응답이 끝남과 동시에 다음 작업이 요청
- 함수를 호출하는 곳에서 호출되는 함수가 결과를 반환할 때까지 대기
- 작업 완료 여부를 계속해서 확인
비동기
- 현재 작업의 응답이 끝나지 않은 상태에서 다음 작업이 요청
- 함수를 호출하는 곳에서 결과를 기다리지 않고, 다른 함수(callback)에서 결과를 처리
- 작업 완료 여부를 확인하지 않음
블로킹(Blocking)과 논블로킹(Non-Blocking)
블로킹과 논블로킹의 차이는 제어권을 어떻게 처리하는지에 대한 차이이다. 즉, 2개 이상의 작업 대상에 대해 제어권을 가져와 작업흐름을 막는지 안막는지와 관련이 있다.
블로킹
- 제어권이 호출된 함수로 넘어감
- 제어권을 가지게된 호출된 함수가 작업을 모두 끝낸 후 값과 제어권을 원래함수로 리턴
- 기존 함수는 제어권이 없는 상태라 아무작업도 안함
논블로킹
- 함수가 호출되어도 제어권은 그대로 있음(실제로는 제어권을 넘겨주지만 바로 돌려받음)
- 기존 함수가 제어권을 가지고 있기에 다른 작업을 수행 가능
동기와 비동기, 블로킹과 논블로킹의 조합 예시
아래는 간단한 예시이다. 상위 프로세스로써 선생님, 하위 프로세스로써 학생들을 예로 들어보았다.
동기 + 블로킹
요청받은 함수의 작업이 끝나야 제어권 돌려받음 + 요청자는 결과가 나올때까지 계속 확인
선생님 : 입실
학생1 : 1번문제 푸는중...
선생님 : 학생 확인
학생2 : 2번문제 푸는중...
선생님 : 학생 확인
학생3 : 3번문제 푸는중...
선생님 : 학생 확인
선생님 : 퇴실
동기 방식이기에 선생님은 학생들의 작업 완료 여부를 신경쓰고, 블로킹 방식이기에 학생들의 작업이 완료되지 않으면 선생님은 다른 작업을 할 수 없다.
동기 + 논블로킹
제어권은 바로 돌려줌 + 요청자는 결과가 나올때까지 계속 확인
선생님 : 입실
학생1 : 1번문제 푸는중...
선생님 : 학생 확인, 딴짓
학생2 : 2번문제 푸는중...
선생님 : 학생 확인, 딴짓
학생3 : 3번문제 푸는중...
선생님 : 학생 확인, 딴짓
선생님 : 퇴실
동기 방식이기에 선생님은 학생들의 작업 완료 여부를 신경쓰고, 논블로킹 방식이기에 학생들의 작업 완료 여부와 상관 없이 선생님은 다른 작업을 할 수 있다.
비동기 + 블로킹
요청받은 함수의 작업이 끝나야 제어권 돌려받음 + 결과는 요청받은 함수가 알려줌
선생님 : 입실
학생1 : 1번문제 푸는중...
학생2 : 2번문제 푸는중...
학생3 : 3번문제 푸는중...
선생님 : 퇴실
비동기 방식이기에 선생님은 학생들의 작업 완료 여부를 신경쓰지 않고, 블로킹 방식이기에 학생들의 작업이 완료되지 않으면 선생님은 다른 작업을 할 수 없다.
비동기 + 논블로킹
제어권은 바로 돌려줌 + 결과는 요청받은 함수가 알아서 돌려줌
선생님 : 입실
선생님 : 퇴실
학생1 : 1번문제 푸는중...
학생2 : 2번문제 푸는중...
학생3 : 3번문제 푸는중...
비동기 방식이기에 선생님은 학생들의 작업 완료 여부를 신경쓰지 않고, 논블로킹 방식이기에 학생들의 작업 완료 여부와 상관 없이 선생님은 다른 작업을 할 수 있다.
출처
https://cotak.tistory.com/136#%EB%B-%--%EB%-F%--%EA%B-%B-%--%-B%--%EB%B-%--%EB%A-%-C%ED%--%B-
https://musma.github.io/2019/04/17/blocking-and-synchronous.html
https://joooing.tistory.com/entry/%EB%8F%99%EA%B8%B0%EB%B9%84%EB%8F%99%EA%B8%B0-%EB%B8%94%EB%A1%9C%ED%82%B9%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9
https://deveric.tistory.com/99
https://siyoon210.tistory.com/147
https://velog.io/@nittre/%EB%B8%94%EB%A1%9C%ED%82%B9-Vs.-%EB%85%BC%EB%B8%94%EB%A1%9C%ED%82%B9-%EB%8F%99%EA%B8%B0-Vs.-%EB%B9%84%EB%8F%99%EA%B8%B0
https://cotak.tistory.com/136