IO multiplexing

eunsiver·2023년 5월 3일
0

운영체제

목록 보기
5/5

I/O

input/output, 데이터 입출력

I/O 종류

network(socket), file, pipe, device 등

socket

네트워크 통신은 socket을 통해 데이터 입출력
컴퓨터의 실행되는 각 프로세스가 데이터 주고 받으려면 프로세스가 소켓을 열고 소켓을 통해 주고 받는다.

backend server에서

네트워크 상의 요청자들과 각각 소켓을 열고 통신한다.

block I/O

I/O 작업을 요청한 프로세스, 스레드는 요청이 완료될 때까지 block

block I/O 문제

서버의 소켓이 read로 기다리고 있는데 해당하는 클라이언트의 소켓은 데이터를 보내지 않고 있다. 그러나 나머지 클라이언트들이 서버에 요청을 한다. 그러나 스레드는 저 소켓에 block이 되어 아무것도 처리하지 못하고 묶여있는 상태가 된다.
따라서 다른 쪽 소켓의 데이터가 들어왔다고 하더라도 처리하지 못한다. 그래서 소켓에 blocking 모드로 처리할 수 없다.

non-block I/O

프로세스/스레드를 block 시키지 않고 요청에 대한 현재 상태를 즉시 리턴

블락되지 않고 즉시 리턴하기 때문에 스레드가 다른 작업을 수행할 수 있다.

non-block I/O 이슈

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

  1. 완료됐는지 반복적으로 처리(앞의 그림과 동일)

    단점 1> 완료된 시간과 완료를 확인한 시간 사이의 갭으로 인해 처리 속도가 느려질 수 있음

    단점2> 완료 됐는지 반복적으로 확인하는 것은 비효율적이며 CPU 낭비가 발생.


해결 방법

I/O Multiplexing(다중 입출력) 사용

관심있는 I/O 작업들을 동시에 모니터링하고 그 중에 완료된 I/O 작업들을 한번에 알려준다.

I/O멀티플렉싱을 사용해서 System Call을 요청한다.
-> 두개의 소켓에 대해 non-blocking 모드로 읽으려고 하니 새로 들어오는 데이터가 있는지 알려주라.

한번의 시스템 콜로 여러 소켓들로부터 이벤트가 발생하면 한번에 처리할 수 있다.

I/O 멀티플렉싱 종류

select
poll
epoll(리눅스에서 사용)
kqueue(Mac OS에서 사용)
IOCP(I/O completion port)(윈도우에서 사용)

select와 poll은 성능면에서 좋지 않아 잘 쓰이지 않는다.


IO 멀티플렉싱은 네트워크 통신에 많이 사용


추가

  • Callback/signal(non-blocking)도 있으나 널리 사용되지 않음
  • 스레드 풀을 추가로 공부해보세요!(epoll과 연관)

참고

https://www.youtube.com/watch?v=mb-QHxVfmcs

profile
Let's study!

0개의 댓글