I/O 모델

도피·2021년 3월 12일

0. 개요

  1. I/O Blocking은 왜 일어나는가?
  2. 언제 I/O Blocking이 일어나나?
  3. 5가지 I/O 모델
    1) Blocking I/O 모델
    2) Nonblocking I/O 모델
    3) I/O Multiplexing 모델
    4) Signal Driven I/O 모델
    5) Asynchronous I/O 모델

1. I/O Blocking은 왜 일어나는가?

하드디스크를 통해 입출력 작업이 일어나는 시간보다 CPU가 훨씬 빠르게 동작하기 때문이다. 일반적으로 입출력 작업(하드디스크 접근)에 소요되는 시간이 CPU 작업에 소요되는 시간의 1400만배에 해당한다. 예를 들어 입출력 작업을 실행시키고 나면 프로세스는 1400만 CPU 사이클만큼 기다려야 한다.
따라서 입출력 작업을 실행하는 프로세스로부터 CPU를 뺏어 레디 큐에 있는 프로세스 하나를 선택하여 CPU를 할당해주는 Process/Context Switching이 일어나게 되는 것이다.

2. 언제 I/O Blocking이 일어나나?

1. Read할 때

  • 데이터를 읽으려 하는데 데이터가 아직 도착하지 않은 경우 데이터가 도착할 때까지 기다려야 함

2. Write할 때

  • 데이터를 전송하려는데 커널이 사용하는 버퍼 (inner buffer)가 꽉 차서 버퍼에 데이터를 쓰지 못하는 경우 버퍼가 빌 때까지 기다려야 함

3. 네트워크 프로그래밍 시 연결을 설정할 때

  • 서버 쪽 : accept() syscall을 통해 클라이언트로부터 연결 요청이 올 때까지 기다려야 함
  • 클라이언트 쪽 : connect() syscall을 통해 연결이 설정될 때까지 기다려야 함

위의 세 가지 경우에서 기다려야 할 때 (blocking) CPU를 다른 프로세스에게 할당하면 시스템의 성능이 향상된다.

3. 5가지 I/O 모델

0. 먼저 알아야 할 것

입력/출력 동작에는 일반적으로 2단계가 존재한다.

1) Read

  • 1단계. 외부로부터 데이터가 도착하여 커널 버퍼에 도착해야 함 : 오래 걸림
  • 2단계. 커널 버퍼에서 사용자 프로세스의 주소공간으로 데이터를 복사해야 함 : 오래 걸리지 않음

2) Write

  • 1단계. 커널 버퍼가 비길 기다림 : 오래 걸림
  • 2단계. 사용자 버퍼로부터 커널 버퍼로 데이터를 복사 : 오래 걸리지 않음

1. Blocking I/O 모델

입력(Read)의 경우를 예로 들어보자면, 1단계와 2단계가 일어나는 동안 계속 blocking 되어 기다리는 방식이다.
▶ 1단계와 2단계가 모두 완료될 때까지 blocking

2. Nonblocking I/O 모델

1단계가 일어나는 동안 다른 일들을 수행하는 것이 기본 아이디어이다. 다만 1단계가 완료되었는지 지속적으로 확인하는 과정이 동반된다. (polling)
이 경우 데이터가 준비되지 않았을 경우 커널 쪽에서 EWOULDBLOCK 오류를 리턴해준다.
▶ 2단계에서만 blocking

3. I/O Multiplexing 모델

여러 개의 파일 디스크립터로부터 입출력을 수행할 때 사용한다.

4. Signal Driven I/O 모델

커널에게 1단계가 완료될 경우 signal(신호)를 보내 알려달라고 하는 방식이다.
▶ 2단계에서만 blocking

5. Asynchronous I/O 모델

커널에게 1단계와 2단계 모두가 완료될 경우 signal(신호)를 보내 알려달라고 하는 방식이다.
▶ 1, 2단계 모두 blocking 필요 없음 (프로세스는 다른 일을 수행할 수 있음)

0개의 댓글