I/O Models
- blocking I/O vs. nonblocking I/O
■ blocking I/O
: I/O 작업은 유저 영역에서 직접 수행할 수 없고, 커널 영역에서만 가능하다. 따라서 I/O 작업을 하기 위해서는 커널에 I/O 작업을 요청해야한다.
: I/O 작업이 진행되는 동안 유저 영역 (process)의 작업은 중단한채 대기해야한다. 이처럼 I/O 동작 (데이터를 받을 준비, 데이터를 커널 영역에서 유저 영역으로 복사 등)으로 인해 프로세스가 block 상태가 되는 것을 blocking 된다고 한다.
■ nonblocking I/O
: I/O 작업을 진행하는 동안 유저 프로세스의 작업을 중단시키지 않는다.
: 유저 프로세스가 커널의 read를 기다리는 것이 아니라 system call을 이용하여 반복적으로 요청하고, 이에 대한 버퍼값이 존재하면 유저 영역으로 복사해준다.
: 반복적인 system call로 리소스가 남용
- I/O multiplexing (select, poll): non-blocking 모델의 문제를 해결하기 위해 고안
: I/O 처리가 필요한 파일 디스크립터 등을 가려내서 알려준다.
- signal driven I/O (epoll, SIGIO), RTS(Real-Time Signal)■ Reactor Pattern
: synchronous, non-blocking I/O handling and relies on an event notification interface■
Proactor Pattern
asynchronous, non-blocking I/O operations, as provided by interfaces such as POSIX AIO
:
- synchronous I/O vs. asynchronous I/O (POSIX aio_functions)
: 동기(synchronous)와 비동기(asynchronous)는 서로 메시지를 주고받는 상대방이 어떤 방식으로 통신을 하는가에 대한 개념이다.
: I/O 통지모델에서 대화하는 주체들은 커널과 프로세스이다. 프로세스는 커널에게 I/O처리를 요청하고, 커널은 프로세스에게 I/O 상황을 통지한다. 우선 I/O 요청은 반드시 동일하게 처리될 수 밖에 없는 부분이고, 결국에 커널이 프로세스에게 어떤 방식으로 통지하느냐에 따라 동기형이냐 비동기형이 결정될 것이다.
■ synchronous I/O
: 동기형 통지모델의 프로세스는 커널에게 지속적으로 현재 I/O 준비 상황을 체크한다.
: 즉 커널이 준비되었는지를 계속 확인하여 동기화 하는 것이다. 따라서 동기형 통지모델에서 Notify를 적극적으로 진행하는 주체는 유저의 프로세스가 되며 커널은 수동적으로 유저 프로세스의 요청에 따라 현재의 상황을 보고한다.
■ asynchronous I/O
: 비동기형 통지모델은 일단 커널에게 I/O작업을 맡기면 커널의 작업 진행사항에 대해서 프로세스가 인지할 필요가 없는 상황을 말한다.
: 유저의 프로세스가 I/O 동기화를 신경쓸 필요가 없기에 비동기형이라고 부를 수 있다. 따라서 비동기형 통지모델에서 Notify의 적극적인 주체는 커널이 되며, 유저 프로세스는 수동적인 입장에서 자신이 할일을 하다가 통지가 오면 그때 I/O 처리를 하게 된다.- I/O Model 비교
'Programing > Server Model' 카테고리의 다른 글
서버 모델 - I/O multiplexing (0) | 2016.02.22 |
---|---|
서버 모델 - Synchronous Blocking I/O (0) | 2016.02.22 |
서버 모델 - 리눅스 소켓 프로그래밍(3) (0) | 2016.02.22 |
서버 모델 - 리눅스 소켓 프로그래밍(2) (0) | 2016.02.18 |
서버 모델 - 리눅스 소켓 프로그래밍(1) (0) | 2016.02.18 |