동기와 비동기, 블로킹과 논블로킹
웹개발을 접해볼 일이 있었다면, 그 중에서도 특히 자바스크립트를 쓸 일이 있었다면 오늘의 주제는 반드시 접해봤을 것이다. 동기와 비동기, 블로킹과 논블로킹은 작업을 수행하는 주체 간의 처리 방식을 표현하는 용어들이다. 그러나 다른 개념임에도 종종 혼동되거나 의미 자체를 명확히 알지 못하는 경우가 많아 명확히 정리해보고자 한다.
블로킹과 논블로킹
잘 기억할 수 있도록 영어 단어 뜻 그대로 이해해보자면 블로킹은 막힌다는 뜻으로, 논블로킹은 막히지 않는다는 뜻으로 해석할 수 있다. 그런데 무엇이 막히고 막히지 않는다는 것일까? 바로 작업을 요청한 쓰레드이다. 위 그림을 살펴보면 블로킹의 경우, Kernel에 작업을 맡긴 Application이 Kernel의 작업이 끝날 때까지 다른 작업을 수행하지 않는 것을 알 수 있다. 그러나 논블로킹의 경우, Kernel에 작업을 맡긴 후 다른 작업을 수행하는 것을 확인할 수 있다. 이는 다르게 표현하자면 Application의 제어권이 요청을 수행하는 동안은 Kernel로 넘어간 것으로도 볼 수 있다. 따라서 이후에 설명할 동기와 비동기 개념과 구분되는 점은 제어권에 관한 개념이라는 점이다.
예시로 저녁식사를 준비할 때를 들 수 있겠다. 밥을 안치고 나서 밥이 다 될 때까지를 기다린다면 블로킹, 밥이 되는 동안 반찬 등 다른 요리를 하고 있다면 논블로킹으로 비유할 수 있을 것이다.
동기와 비동기
이번에도 영어 단어의 의미대로 먼저 이해해보자. Synchronous는 동기, 즉 동기화가 된다는 뜻으로 해석할 수 있고 Asynchronous는 비동기, 동기화가 이루어지지 않는다는 뜻으로 해석할 수 있다. 그렇다면 어떤 시점을 기준으로 이런 판단을 내리는 것일까? 바로 작업이 완료된 후 원래 작업 쓰레드에서 응답을 받은 시점이다. 위 그림에서 보면 블로킹과 논블로킹에 대해서는 가정하지 않았으므로 요청과 응답 사이에는 작업의 수행여부에 대해서 알 수 없다. 그러나 Synchronous의 경우, 응답을 받자마자 이후의 작업을 수행하는 것을 확인할 수 있다. 그러나 Asynchronous는 이를 보장하지 않는다. 위 그림에서는 다른 작업을 수행하고 있지만 사실 이후의 작업을 수행하는 것 역시 가능한 시나리오이다. 그렇지만 Asynchronous는 이를 보장하지 않는다는 점에서 Synchronous와 구분된다.
저녁 식사를 준비할 때 밥이 다 되면 밥을 퍼서 바로 밥그릇에 담는 것이 동기라면, 밥이 다 되어도 다른 일을 할 수 있는 것이 비동기이다.