• 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 비교


참고: http://ozt88.tistory.com/20


+ Recent posts