🤖 Computer Science

I/O: Input/Output

정의

데이터의 입출력
  • 파일을 읽고 쓰거나
  • 네트워크로 데이터를 주고 받는 것
  • 입출력 장치와 데이터를 주고 받는 것

종류

  • network(socket)
    • 네트워크 통신은 socket을 통해 데이터가 입출력된다.
  • file
  • pipe
  • device

작동

  • 모든 입출력 명령은 특권 명령
  • 사용자 프로그램은 어떻게 I/O를 하는가
    • System Call
      • 사용자 프로그램은 운영체제에게 I/O 요청
    • Trap을 사용하여 Interrupt Vector의 특정 위치로 이동
    • 제어권이 Interrupt Vector가 가리키는 Interrupt Service Routine으로 이동
    • 올바른 I/O 요청인지 확인 후, I/O 수행
    • I/O 완료시, 제어권을 System Call 다음 명령으로 옮김

동기식 I/O VS 비동기식 I/O

notion image

동기식 I/O(Synchronous I/O)

  • I/O 요청 후, 작업이 완료된 후에 제어가 사용자 프로그램에 넘어감
  • 구현 1
    • I/O가 끝날 때까지 CPU를 낭비
    • 매 시점 하나의 I/O만 가능
  • 구현 2
    • I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음
    • I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움
    • 다른 프로그램에 CPU를 줌

비동기식 I/O(Asyncronous I/O)

  • I/O가 시작된 후, 작업이 끝나기를 기다리지 않고, 제어가 사용자 프로그램에 즉시 넘어감

특징

  • 두 경우 모두 I/O가 끝나면 Interrupt로 알려줌

Block I/O VS Non-Block I/O

Block I/O

notion image
I/O 작업을 요청한 프로세스/스레드는 요청이 완료될 때까지 블락됨

Socket에게 Block I/O란?

notion image
버퍼가 비워질 때까지 블락됨

Non-Block I/O

notion image
프로세스/스레드를 블락시키지 않고 요청에 대한 현재 상태를 즉시 리턴
블락되지 않고 즉시 리턴하기 때문에 스레드가 다른 작업을 수행할 수 있다.

Non-Block I/O 이슈

I/O 작업 완료를 어떻게 확인할 것인가?

Non-Block I/O 결과 처리 방식

  1. 완료됐는지 반복적으로 확인
    1. 완료된 시간과 완료를 확인한 시간 사이의 갭으로 인해 처리 속도 저하 가능성
    2. 완료됐는지 반복적으로 확인하는 것은 CPU 낭비
  1. I/O Multiplexing(다중 입출력) 사용
    1. notion image
    2. 관심있는 I/O 작업들을 동시에 모니터링하고 그 중에 완료된 I/O 작업들을 한번에 알려줌
    3. 종류
      1. select
      2. poll
      3. epoll
        1. linux
      4. kqueue
        1. macOS
      5. IOCP: I/O completion port
        1. Windows
    4. 사례
      1. 네트워크 통신에서 많이 사용
  1. Callback/signal 사용
    1. notion image
    2. 종류
      1. POSIX AIO
      2. LINUX AIO
  1. io_uring
    1. linux

출처