CS/Operating System

블로킹/논블로킹과 동기/비동기 처리 방식

olsohee 2024. 4. 1. 18:23

블로킹(Blocking) / 논블로킹(Non-Blocking)

블로킹(Blocking)과 논블로킹(Non-Blocking)은 I/O 작업을 처리하는 방법이다.

  • 블로킹: I/O 작업을 요청한 스레드는 I/O 작업이 완료될 때까지 봉쇄 상태가 되어 대기한다.
  • 논블로킹: I/O 작업을 요청한 스레드는 I/O 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행한다.

즉, 운영체제 관점에서 살펴보면 다음 블로그(https://olsohee.tistory.com/150)에서 설명하는 동기식 입출력 방식이 블로킹 방식이고, 비동기식 입출력 방식이 논블로킹 방식이다.

 

그리고 주의할 점은 블로킹 방식에서 I/O 작업을 요청한 스레드가 봉쇄 상태가 되었더라도, 그동안 CPU는 다른 스레드를 실행한다는 것이다.

네트워크 통신 과정에서의 블로킹/논블로킹

블로킹

스레드가 소켓을 통해 데이터를 수신하려고 할 때 블로킹 모드의 read 시스템 콜을 호출한다. 그러면 CPU 제어권이 운영체제로 넘어가게 되고, I/O 작업이 이뤄지는 동안 스레드는 봉쇄 상태로 대기한다. 

즉, 소켓의 receive 버퍼에 데이터가 들어올 때까지 read() 시스템 콜을 호출한 스레드는 대기한다.

논블로킹

반면 논블로킹 방식에서는 스레드가 read 시스템 콜을 호출하면, 운영체제는 I/O 작업이 완료되지 않았더라도 즉시 응답을 반환한다. 따라서 응답을 받은 스레드는 다음 작업을 수행한다.

동기(Synchronous) / 비동기(Asychronous)

Syn은 그리스어로 '함께'라는 뜻이고 chrono는 '시간'이라는 뜻이다. 즉, 동기(Synchronous)는 작업 시간을 함께 맞춰서 실행한다는 뜻으로, 요청한 작업에 대해 완료 여부를 따져 순차적으로 처리하는 것을 말한다. 반면 비동기(Asynchronous)는 A라는 접두사가 붙어 부정하는 형태로, 요청한 작업에 대해 완료 여부를 따지지 않고 다음 작업을 수행하는 것을 말한다.

비동기 처리의 성능

비동기는 요청한 작업에 대해 완료 여부를 신경쓰지 않고 다음 작업을 수행하기 때문에 동기에 비해 더 좋은 성능을 보인다. 비동기는 I/O 작업과 같이 느린 작업이 발생했을 때, I/O 작업의 완료를 기다리지 않고 I/O 작업과 동시에 다른 작업을 처리한다. 예를 들어, 웹 애플리케이션에서 데이터베이스 쿼리를 수행하는 작업이 있다고 가정하자. 만약 이 작업을 동기적으로 수행하면, 쿼리에 대한 데이터베이스 응답이 올 때까지 해당 스레드는 대기해야 한다. 하지만 비동기 방식으로 수행하면 데이터베이스에서 응답이 올 때까지 기다리는 동안에도 해당 스레드가 다른 요청을 동시에 처리할 수 있게 된다. 

문맥에 따른 동기 / 비동기

비동기 처리 = 멀티 스레드라고 생각하면 안된다. 멀티 스레딩은 비동기 처리의 한 종류이다. 즉, 동기/비동기의 개념이 광범위하게 사용되어 여러 개념과 헷갈릴 수 있는데, I/O 작업에서의 동기/비동기 처리를 문맥에 따라 생각해보자.

동기

  • 블로킹
    • I/O 작업이 일어나는 동안 해당 스레드는 봉쇄 상태로 대기하기 때문에 동기식 처리 방식이라고 할 수 있다.
  • I/O 작업을 요청한 스레드가 I/O 작업의 완료까지 챙겨야 하는 경우

비동기

  • 멀티 스레드
    • 여러 스레드가 여러 작업을 나누어 처리한다.
    • 그러나 멀티 스레드로 인해 컨텍스트 스위칭 비용과 race condition 문제가 발생할 수 있다.
  • 논블로킹
    • I/O 작업이 일어나는 동안 해당 스레드는 다음 작업을 처리한다. 이는 CPU 작업과 I/O 작업을 동시에 할 수 있기 때문에, 논블로킹을 통해 싱글 스레드로도 비동기 처리가 가능한 것이다. 
    • 논블로킹을 잘 활용하면 스레드를 적게 사용하면서 전체 처리량을 늘릴 수 있다. 
  • I/O 작업을 요청한 스레드가 I/O 작업의 완료를 챙기지 않아도 되는 경우 (noti, callback)
  • 메시지 큐를 사용하는 경우
    • 다음 그림에서 A는 B에게 위임할 작업을 메시지 큐를 통해 전달한다. 그리고 A는 마저 자신의 다음 작업을 처리하기 때문에 비동기 처리라고 할 수 있다.
    • 이를 통해 B에서 작업을 처리하다가 오류가 발생하더라도 A에게까지 영향을 미치지 않는다. 


Reference

'CS > Operating System' 카테고리의 다른 글

인터럽트와 입출력 방식  (1) 2024.04.06
스케줄러  (0) 2024.04.02
디스크 관리  (0) 2024.03.05
메모리 관리 기법 - 페이징 기법  (0) 2024.02.29
가상 메모리와 메모리 관리 기법  (0) 2024.02.29