동기/비동기 & 블로킹/논블록킹
Last updated
Last updated
참고 링크
프로그래밍에서 웹 서버 혹은 입출력(I/O) 을 다루다 보면 동기/비동기 & 블로킹/논블로킹 이라는 용어들을 접하게 된다.
동기/비동기, 블로킹/논블로킹 이 두 개념은 표현 형태는 비슷하게 보일지라도, 서로 다른 차원에서 작업의 수행 방식을 설명하는 개념이다.
동기/비동기는 요청한 작업에 대한 완료 여부를 신경써서 작업을 순차적으로 수행할지 아닌지에 대한 관점이다.
블로킹/논블로킹은 단어 그대로 현재 작업이 block(차단, 대기) 되느냐 아니냐에 따라 다른 작업을 수행할 수 있는지에 대한 관점이다.
동기/비동기는 완료 여부!
블로킹/논블로킹은 차단 or 제어권 여부!
동기는 요청한 작업에 대해서 완료 여부를 따져 순차대로 처리하는 것을 의미한다.
비동기는 요청한 작업에 대해서 완료 여부를 따지지 않기 때문에, 자신의 다음 작업을 그대로 수행하게 된다.
비동기는 요청한 작업의 완료 여부를 확인하지 않고, 자신의 그 다음 작업을 수행하기 떄문에 I/O 작업, API 요청과 같은 느린 작업이 발생할 때, 기다리지 않고 동시에 멀티 작업을 진행할 수 있다.
예를 들어, 웹 어플리케이션에서 결재 처리 시 결제 요청은 동기적으로 처리하여 완료 여부를 확인하지만, 결제 완료 후 영수증 이메일 전송이나 포인트 적립과 같은 부수적인 기능은 비동기로 처리해 성능을 최적화 할 수 있다.
동기와 비동기를 요청한 작업에 대해 완료 여부에 대한 차이라고 설명했다. 이를 쉽게 설명하면 여러개의 요청 작업을 순서대로 처리하느냐, 아니냐에 따른 차이로 보면 된다.
요청한 작업에 대한 응답을 반드시 받아야 다음 작업을 수행한다는 말이다.
따라서 동기 작업은 요청한 작업에 대해 순서가 지켜지는 것을 말하는 것이고, 비동기 작업은 순서가 지켜지지 않을 수 있다는 것을 말한다.
블로킹과 논블로킹은 단어에서 알 수 있듯이 다른 요청의 작업을 처리하기 위해 현재 작업을 block(차단, 대기) 하냐 안하냐의 유무를 나타내는 프로세스의 실행 방식이다.
동기/비동기가 전체적인 작업에 대한 순차적인 흐름 유무라면, 블로킹/논블로킹은 전체적인 작업의 흐름 자체를 막냐 안막냐로 볼 수 있는 것이다.
예를 들어, 파일을 읽는 작업을 생각해보자.
파일을 다 읽을 때까지 대기한다면 블로킹 방식
파일을 다 읽지 않아도 다른 작업을 할 수 있다면 논블로킹 방식
비동기와 논블로킹의 개념이 혼동될 수 있다.
결국은 비동기나 논블로킹이나 추구하는 결과는 비슷하게 보일 수 있다.
이는 시점과 관련된 이론적인 개념이라 실제 코드에서 경계를 구분하기가 애매하다..
블로킹/논블로킹을 보다 명확하게 구분하기 위해서 '제어권' 이라는 단어를 쓴다.
제어권은 간단히 말해 함수의 코드나 프로세스의 실행 흐름을 제어할 수 있는 권리 같은 것이다.
호출된 함수로 제어권을 넘겨주면 블로킹
호출된 함수로 제어권을 넘겨주지 않는다면 넌블로킹