• os
  • io

동기/비동기와 블로킹/논블로킹, I/O Multiplexing

동기·비동기와 블로킹·논블로킹이 서로 다른 관점임을 짚고, 네 가지 조합과 select·poll 기반 I/O Multiplexing을 정리한다.

시리즈 · 운영체제18 / 18
  1. 운영체제의 유형
  2. System Call과 Dual Mode
  3. 인터럽트와 폴링
  4. 프로세스와 PCB, 프로세스의 상태 변화
  5. 프로세스 주소 공간과 Stack이 높은 주소부터 할당되는 이유
  6. 스레드: 사용자·커널 수준 스레드와 Thread Pool, Fork-Join
  7. Context Switching
  8. 프로세스 스케줄링: 단계와 알고리즘
  9. Thread Scheduling: 경합 범위 PCS와 SCS
  10. 경쟁 상태와 상호 배제: Thread Safe, 데커·피터슨 알고리즘
  11. 뮤텍스와 세마포, 모니터
  12. 교착 상태: 발생 조건과 해결 방법
  13. 메모리 계층 구조와 캐시 메모리
  14. 메모리 관리: 주소 바인딩과 연속 메모리 할당
  15. 가상 메모리: Paging과 Segmentation, TLB
  16. 요구 페이징과 페이지 교체 알고리즘, Thrashing
  17. File Descriptor와 File System, I-Node
  18. 동기/비동기와 블로킹/논블로킹, I/O Multiplexing

동기와 비동기

  • Synchronous(동기): 작업에 순서가 있다. 호출한 작업의 완료를 기다린 뒤 다음으로 넘어간다.
  • Asynchronous(비동기): 작업에 순서가 없다. 호출한 작업의 완료를 기다리지 않고 바로 다음 코드를 실행한다.

블로킹과 논블로킹

I/O 작업을 처리하는 방식에 대한 개념이다.

  • Blocking: 입출력 작업이 완료될 때까지 대기한다. 완료되기 전에는 다른 작업을 수행하지 않으므로, 입출력이 길어지면 프로그램이 멈춘 것처럼 된다.
  • Non-Blocking: 입출력 작업이 완료될 때까지 대기하지 않고 다른 작업을 수행한다. 입출력이 길어져도 프로그램이 멈추지 않는다.

두 개념의 차이

구분 관점
동기 / 비동기 코드 흐름을 제어하는 방식
블로킹 / 논블로킹 스레드(프로세스)를 점유한 채 기다리는지 여부

둘은 서로 다른 관점이지만, 함께 조합되어 실제 동작 방식을 결정한다.

동기이면서 논블로킹, 비동기이면서 블로킹인 경우

  • 동기 + 논블로킹: 호출이 I/O 작업의 끝을 기다리지 않고 바로 반환되므로 그동안 스레드를 다른 일에 쓸 수 있다. 대신 작업이 끝났는지는 호출한 쪽이 계속 확인해야 한다.
  • 비동기 + 블로킹: 비동기로 요청해 놓고도 결과가 올 때까지 기다리는 형태라 효율적이지 않을 수 있다.

I/O Multiplexing

한 개의 프로세스가 여러 개의 I/O 작업을 다룰 수 있게 하는 기술이며, 비동기-블로킹 모델로 분류된다. 여러 파일 디스크립터를 한꺼번에 감시하면서, 그중 하나라도 준비될 때까지 대기하기 때문이다.

네트워크 소켓 통신에서 연결마다 프로세스를 만들면 프로세스를 생성하고 관리하는 데 많은 자원이 든다. I/O Multiplexing을 쓰면 프로세스를 여러 개 만들지 않고도 다수의 연결을 처리할 수 있다.

select

  • 세 개의 파일 디스크립터 집합을 인자로 받는다. 각각 읽기(수신) 대기, 쓰기(송신) 대기, 예외 상황 대기를 위한 집합이다.
  • 이 파일 디스크립터들을 모니터링하면서 입출력 상태의 변화를 감지한다.
  • 이벤트가 발생한 파일 디스크립터를 알려 준다.

poll

  • 파일 디스크립터의 배열을 인자로 받는다.
  • 배열에 있는 파일 디스크립터를 모니터링하면서 입출력 상태의 변화를 감지한다.
  • 이벤트가 발생한 파일 디스크립터를 알려 준다.