티스토리 뷰

Blocking/Non-Blocking과 Sync/Async는 비슷한 모양새 이지만, 서로 완전히 다른 개념입니다.


Blocking과 Non-Blocking은 '프로세스(또는 쓰레드)가 멈춰서 다른 작업을 할 수 없는 방식인지?' 를 말합니다.


예를 들어 Blocking 모델을 사용하는 일반적인 소켓은 recv 함수를 호출할 경우 프로세스(또는 쓰레드) 자체가 Blocking 상태에 빠집니다. 마치 Sleep을 호출한 것 처럼, I/O 작업이 모두 완료되기 전까지 다른 아무런 작업도 할 수 없습니다.


하지만 Non-Blocking 모델을 사용하는 소켓의 경우, I/O 작업의 종료 유무에 상관 없이, 결과값을 바로 반환 합니다.

당장 내게 들어온 데이터는 없지만, 언젠간 들어올 것이라고 가정하고 우선 로직을 계속 진행 시키는겁니다. 그렇기에 결과값은 항상 '언젠간 I/O 작업이 끝나겠지, 우선 너는 다른 로직 처리하면서 기다려~' 입니다.


그렇다면 Sync와 Async는 뭘까요?


Non-Blocking 모델 같은 경우 언젠가 I/O 작업이 완료될 거라고 믿고는 있지만, 그것이 언제 끝날지는 알 수가 없습니다. 하지만, 우리는 이 I/O 작업 완료 시점을 꼭 알아야하죠. Blocking 모델이야 I/O 작업이 완료되기 전까지는 한발짝도 움직이지 않으니 상관이 없습니다


따라서 커널에서 I/O 작업이 완료 되었을 경우 프로세스가 통지를 받을 수 있어야 하는데, Sync와 Async는 이 통지를 어떻게 할 것인지에 대한 방식을 말합니다.


Sync 통지 모델의 경우 프로세스 단에서 I/O 작업의 완료를 지속적으로 확인하는 방식입니다.

쉽게 말하자면, 아까 내가 들어올거라고 가정한 데이터가 들어왔는지를 수동으로 체크하는 방식인 것입니다.

어떤 쓰레드에서 while 문을 돌면서 recv 된 데이터가 있는지 없는지 체크하는 등의 작업을 예로 들 수 있습니다.


Async 통지 모델의 경우, I/O 작업의 완료를 커널에서 직접 알려줍니다.

즉, 프로세스에서는 I/O 작업의 완료 시점을 신경 쓸 필요가 없다는 것입니다. I/O 작업이 완료되면 커널이 프로세스에 직접 알려줄 것이고, 프로세스는 완료된 I/O 작업에 대한 올바른 처리에만 신경을 쓰면 된다는 것이죠.


설명이 어렵지 않았으면 좋겠네요. 궁금한 점이 있으신 분들은 댓글 남겨주세요.


댓글