동기/비동기, 블로킹/논블로킹, 멀티플렉싱 IO

jjin·2023년 11월 7일
0

동기/비동기, 블로킹/논블로킹

Synchronous

  • 모든 IO 요청, 응답 작업의 순서가 보장됩니다.
  • 작업 완료를 user space에서 판단하고 다음 작업을 언제 요청할지 결정합니다.
  • 일련의 파이프라인을 따라 처리되는 구조에서 효율적입니다.

Asynchronous

  • Kernel에 IO 작업을 요청해두고 다른 작업 처리도 가능합니다.
  • 작업 완료를 Kernel이 통보해줍니다.
  • 순서는 보장되지 않습니다.
  • 각 작업들이 독립적이거나, 작업 별 지연이 큰 경우 효율적입니다.
  • 작업이 완료되어도 바로 처리하지 않아도 됩니다.

Blocking

  • 요청한 작업이 완료될 때까지 Block하여 다른 작업 하지 않고 기다리다가 결과를 반환받습니다.

NonBlocking

  • 작업 요청 이후 결과를 대기하지 않습니다.
  • 중간에 완료되었는지 확인해볼 수 있습니다. (Polling)

4가지 조합

동기, 블로킹: Read/Write

작업의 결과를 기다리고 끝나면 바로 처리합니다.

User space에 있는 프로세스가 Kernel에게 IO 요청하는 System Call
이후 Block
처리가 완료되어 Kernel이 응답한 데이터가 User space의 버퍼에 반환
이후 Block 해제, 반환 데이터 처리.

  • 호출할 때마다 요청 Thread 생성.
  • IO 요청 많아지면 한 작업 당 한 번의 Context Switching이 발생, 비효율적
  • Block된 User 프로세스는 CPU를 사용하지 않고 Kernel 응답만 기다리는데, IO 작업은 CPU를 거의 쓰지 않으므로 CPU 사용 효율이 낮음.(idle time 길어짐)

동기, 논블로킹: O_NONBLOCK fd

작업의 결과를 기다리지 않지만, 끝나면 바로 처리합니다. 요청 순서가 보장됩니다.

socket 생성 시 O_NONBLOCK 옵션을 줌
해당 socket으로 IO System Call을 하면 Block되지 않고 즉시 결과를 반환받음.
아직 읽을 데이터가 없다면 바로 -1(errno)을 반환.

적절한 polling 주기가 필요함.
너무 길 때는 IO는 이미 완료되었는데 User 프로세스의 처리가 늦어지고,
너무 짧으면 Kernel이 return해주느라 IO 작업이 늦어질 수 있음.

동기는 직관적이지만 2개 이상 파일을 동시 처리 시 멀티 프로세스나 멀티 스레드로 동작해야 함. 동시성 문제가 발생함. 그러므로 Multiplexing이 각광 받게 됨.

비동기, 블로킹: 멀티플렉싱. select,poll,epoll/kqueue/iocp

작업의 결과를 기다리지만, 끝나면 바로 처리하지 않아도 됩니다.

Multiplexing: 하나를 여러 개처럼 보이게 함.
한 프로세스가 여러 파일을 관리.
파일은 프로세스가 Kernel에 진입하게 해주는 인터페이스.
c-s환경이라면 한 server가 여러 socket을 관리해 여러 client가 접속할 수 있게 하는 것. socket은 IP/Port를 가진 파일이므로.

비동기, 논블로킹: AIO

작업의 결과를 기다리지 않고 끝나도 바로 처리하지 않아도 됩니다.

Multiplexing

profile
진짜

0개의 댓글