1. I/O 모델의 이해
1.1 기본 개념
모든 I/O 작업은 두 단계로 이루어집니다:
- 데이터 준비 단계
- 커널이 데이터를 준비하는 과정
- 디스크 읽기, 네트워크 패킷 수신 등
- 시간이 오래 걸릴 수 있는 작업
- 데이터 복사 단계
- 준비된 데이터를 커널 공간에서 유저 공간으로 복사
- 메모리 복사 작업
- 상대적으로 빠른 작업
이 두 단계에서 프로세스가 어떻게 대기하고, 어떻게 완료를 확인하는지에 따라 I/O 모델이 구분됩니다.
1.2 분류 기준
1.2.1 프로세스의 대기 방식
- 블로킹(Blocking)
- 프로세스가 I/O 작업 동안 대기
- 작업이 완료될 때까지 다음 명령어를 실행하지 않음
- 자원 사용은 적지만 응답성이 떨어짐
- 논블로킹(Non-blocking)
- 프로세스가 I/O 작업과 관계없이 계속 실행
- I/O 작업의 진행 상태를 주기적으로 확인
- 더 나은 응답성을 제공하지만 자원을 더 많이 사용
1.2.2 작업 완료 확인 방식
- 동기(Synchronous)
- 프로세스가 직접 I/O 완료를 확인
- 명시적인 I/O 완료 체크 필요
- 프로세스가 I/O 작업의 결과를 즉시 처리
- 비동기(Asynchronous)
- 커널이 I/O 완료를 프로세스에 통지
- 완료 시 콜백이나 시그널로 알림
- 프로세스가 I/O 완료를 신경쓰지 않아도 됨
이러한 기준들의 조합으로 네 가지 주요 I/O 모델이 만들어집니다.
2. 블로킹 I/O (Blocking I/O)
1.1 동작 과정
- 시스템 콜 호출
- 애플리케이션이 recvfrom() 호출
- 제어권이 커널로 넘어감
- 프로세스는 블로킹 상태로 진입
- 데이터 대기
- 커널이 데이터 준비될 때까지 대기
- 이 시간 동안 프로세스는 계속 블로킹
- 프로세스는 다른 작업을 전혀 수행할 수 없음
- 데이터 복사 및 반환
- 데이터가 준비되면 커널 공간에서 유저 공간으로 복사
- 복사가 완료되면 시스템 콜이 반환됨
- 프로세스는 데이터 처리 시작