블로킹&논블로킹과 동기&비동기라는 두 개념의 차이에 대해 정리해봤다.
사실 두 개념을 조합해서 사용되기 때문에 비교되는 것이지, 동기와 비동기는 프로세스 수행 순서 보장에 대한 매커니즘이고, 블록과 논블록킹은 프로세세의 유휴 상태에 대한 개념으로 완전한 별개의 개념으로 관련이 없다고 한다.
블록킹(Blocking)과 논블록킹(Non-Blocking)
제어권을 어떻게 처리하느냐에 따라 달라진다. 제어권이란 자신(함수)의 코드를 실행할 권리같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.
Blocking
블로킹은 A함수가 B함수를 호출하면, 제어권을 A가 호출한 B 함수에게 넘겨주는 것이다. A는 B에게 제어권을 넘겨줬기 때문에 B함수의 실행이 끝날 때까지 실행을 잠시 멈춘다. B 함수의 실행이 끝나면 자신을 호출한 A에게 제어권을 돌려준다.
Non-Blocking
논블로킹은 A함수가 B함수를 호출해도 제어권을 그대로 자신이 가지고 있는 것이다. 이 경우에는 B함수가 실행되지만, 제어권은 A함수가 가지고 있기 때문에 계속해서 자신의 코드를 실행한다.
동기(Synchronous)와 비동기(Asynchronous)
동기와 비동기의 차이는 호출되는 함수의 작업 완료 여부를 신경쓰는지의 차이다.
Synchronous
동기는 A함수가 B함수를 호출한 뒤, B함수의 리턴값을 계속 확인하면서 관심을 갖는 것이다.
Asynchronous
비동기는 A함수가 B함수를 호출한 후, B함수의 작업 완료 여부를 신경쓰지 않는 것이다. A함수가 B함수를 호출할 때 콜백 함수를 함께 전달해서, 함수 B의 작업이 완료되면 함께 보낸 콜백 함수를 실행한다.
사실, 동기와 비동기라는 용어가 크게 와닿지는 않았다. 그동안 동기, 비동기라는 말을 사용하면서 의도했던 개념은 오히려 블로킹과 논블로킹에 가까웠던 것 같기도 하다. 아래의 블로그 글을 통해서 동기와 비동기에 대한 개념을 조금 더 잡을 수 있었다.
위의 블로그에서는 Synchro-를 사용하는 단어들은 동시에 똑같이 진행되는 느낌의 뉘앙스를 가지는 단어인데, 이 동시라는 단어는 동시다발적이라는 용법으로 사용되는 의미보다는 현재 작업의 응답과 다음 작업의 요청이 같이 발생이라고 설명한다.
그리고 현재의 작업의 응답이 발생함과 동시에 다음 작업을 요청한다는 것은 어떠한 순서를 가지고 진행된다는 것을 의미한다고 한다.
이러한 개념을 염두해두고 위의 설명을 다시 생각해보자.
동기는 A함수가 B함수를 호출한 뒤, B함수의 리턴값을 계속 확인하면서 관심을 갖는 이유는 B함수의 종료, 즉 응답이 발생함과 동시에 A함수의 다음 작업이 실행되야하기 때문이다! 그게 동기니까!
반대로, 비동기는 B함수가 언제 종료되든 관심이 없다. B함수의 응답과 A함수의 이어지는 작업이 같은 시점에 발생할 필요가 없기 때문이다.
A함수의 다음 작업에 B함수의 종료와 함께 이뤄진다는 말이 Blocking과 분명 헷갈리긴 한다. 하지만 앞서 설명했듯이 Blocking은 프로세스의 유휴 상태에 대한 개념이다. 비동기에서는 A함수가 B함수의 종료 시점에 이후 작업을 시작하기 위해 기다리고 있던, 다른 일을 하고 있던 상관이 없다. 관심의 범위가 아니란 뜻이다.
동기&비동기 + 블로킹&논블로킹 조합
동기/비동기와 블로킹/논블로킹을 헷갈리게 한 원흉, 이들의 조합에 대해서 알아보자.
Sync-Blocking
- A함수는 B함수의 리턴값에 관심을 갖는다. (동기)
- A함수는 B함수를 호출하고 제어권을 넘겨준 다음, B함수가 실행을 완료할 때까지 기다린다. (블로킹)
- EX) C나 JAVA의 코드 실행후 커맨드에서 입력받기
Sync-Nonblocking
- A함수는 B함수를 호출하고 제어권을 넘겨주지 않고 자신의 코드를 계속 실행한다. (논블로킹)
- 하지만 A함수는 B함수의 리턴값이 필요하기 때문에, 중간중간 B함수가 실행을 완료했는지 확인한다. (동기)
- EX) 게임에서 데이터 로드율 표시(데이터를 계속 물어봄. 제어권은 여전히 나한테 있어 화면에 로드율 표시됨)
Async-Nonblocking
- A함수는 B함수를 호출하고 제어권을 넘겨주지 않고 자신의 코드를 계속 실행한다. (논블로킹)
- B함수를 호출할 때 콜백함수를 함께 준다. B함수는 자신의 작업이 끝나면 A함수가 준 콜백 함수를 실행한다. (비동기)
- EX) Ajax 요청, js 비동기 콜백
Async-blocking
- A함수는 B함수의 리턴값에 신경쓰지 않고, 콜백함수를 보낸다. (비동기)
- 그런데, B함수의 작업에 관심없음에도 불구하고, A함수는 B함수에게 제어권을 넘기기 때문에, A함수는 자신과 관련없는 B함수의 작업이 끝날 때까지 기다려야한다. (블로킹)
- 이 조합은 거의 사용하는 경우가 없다.
참고
'Tech > 운영체제' 카테고리의 다른 글
[개발 한 스푼] CPU 스케줄링 알고리즘의 종류와 각각에 대해 아는대로 설명해주세요 (2023.01.08) (0) | 2023.01.08 |
---|---|
[운영체제] 가상 메모리 (0) | 2021.12.18 |
[운영체제] 페이징과 세그멘테이션 (0) | 2021.12.15 |
[운영체제] 메모리 관리 (0) | 2021.12.15 |