블로킹/논블로킹
호출자와 피호출자의 제어권과 관련
제어권: 코드의 실행 순서를 제어하는 권리로 제어권을 가진 함수는 코드 실행 후 자신을 호출한 함수로 이동한다.
블로킹 함수
논블로킹 함수
블로킹
1.
A함수가 B함수를 호출 (제어권 A → B)
2.
제어권이 넘어갔기 때문에 A함수는 실행을 중단하고 B함수 실행
3.
B함수 실행이 끝나면 다시 A함수로 제어권 이동
논블로킹
1.
A함수가 B함수 호출(제어권 이동X)
2.
제어권이 A함수에 있기 때문에 중단하지 않고 코드를 실행
제어권이 없는 함수가 어떻게 실행될 수 있을까?
이벤트 루프, 태스크 큐를 사용!
비동기 함수의 콜백함수는 태스크 큐에 푸시되어 기다리다가 콜 스택이 비어있으면 이벤트 루프에 의해 다시 콜 스택에 푸시되어 실행한다.
동기/비동기
작업을 수행하는 시점과 관련
동기, 비동기
동기
함수 1을 호출하고 처리 결과를 받아서 확인 후 2번 함수를 수행한다면 동기
비동기
함수 1을 호출하고 결과를 확인하지 않고 함수 2를 호출한다면 비동기
비동기 == 논블로킹??
일반적으로 동기와 블로킹, 비동기와 논블로킹이 연관되어 쓰이기 때문에 이 개념을 혼동할 수 있다.
비동기와 논블로킹의 차이:
console.log("시작");
setTimeout(() => {
console.log("1초 후에 실행됩니다!");
}, 1000);
console.log("끝");
// 결과
// 시작
// 끝
// 1초 후에 실행됩니다!
JavaScript
복사
자바스크립트의 setTimeout()를 예로 들면 이는 비동기, 논블로킹 함수이다.
setTimeout()의 결과가 제일 늦게 나온다. 순서의 관점 ⇒ 비동기
함수는 타이머 작업을 수행하기 위해 함수를 block하지 않고 백그라운드에서 별도로 처리 ⇒ 논블로킹
크로스오버 예시
두 명의 요리사가 피자, 파스타를 만들어 파는 레스토랑 예시
•
동기 - 블로킹
두 요리사는 각각 피자 또는 파스타 요리를 담당하고 있다. 이들이 요리할 때 반드시 순차적으로 처리해야 하는 부분이 있다. 가령 도우 반죽이 완성되어야 반죽을 오븐에 구울 수 있다. 요리사는 도우 반죽이 완성될 때까지 밀대를 놓을 수 없으며(블로킹), 반죽이 다 된 것을 확인한 후에 오븐에 넣을 수 있다(동기).
•
동기 - 논블로킹
피자 담당 요리사는 오븐에서 도우가 다 구워진 것을 확인한 다음, 꺼내서 토핑을 얹을 수 있다(동기). 하지만 그동안 다른 일을 할 수 없는 것은 아니다. 요리사는 주기적으로 남은 오븐 시간을 확인하고, 완료되지 않았다면 그동안 토핑을 만들 수 있다(논블로킹). 마침내 시간이 되어 도우가 구워졌다면 꺼내어 토핑을 얹는다.
•
비동기 - 논블로킹
피자 담당 요리사와 파스타 담당 요리사는 각자 맡은 요리만 할 뿐, 서로의 요리 과정에는 별 관심이 없다. 각자가 어떤 단계를 수행하고 있는지 확인하지 않고(비동기), 서로의 작업을 방해하지도 않는다(논블로킹). 다만 두 요리가 함께 나가야 한다면, 먼저 완성된 요리와 나중에 완성된 요리를 모아줄 주체가 필요하다.
•
비동기 - 블로킹
비동기와 블로킹은 특수한 상황으로 볼 수 있다. 피자 요리사와 파스타 요리사는 서로의 작업에 대해 확인할 필요가 없지만, 모종의 이유로 작업을 번갈아서 수행한다. 피자 요리사가 도우를 반죽하는 동안 파스타 요리사는 쉬고, 파스타 요리사가 면을 삶는 동안 피자 요리사는 쉬는 것이다.
정리
Q. 동기와 비동기, 블로킹과 논블로킹의 차이점은?
동기 / 비동기
작업을 수행하는 시점과 관련있다.
•
동기: 요청한 작업에 대해 완료 여부를 따져 순차대로 처리하는 것
•
비동기: 요청한 작업에 대해 완료 여부를 따지지 않고 다음 작업 수행
블로킹 / 논블로킹
호출자와 피호출자의 제어권과 관련있다.
•
블로킹: 요청받은 함수가 작업을 완료하면 요청자에게 제어권이 이동(요청한 작업을 마칠 때까지 기다려야한다.)
•
논블로킹: 요청받은 함수가 요청자에게 제어권을 바로 넘겨줌(요청한 작업을 즉시 마칠 수 없으면 바로 return)
Reference