首页 > 代码库 > UNP_03_I/O复用

UNP_03_I/O复用

  一个连接的socket描述符的状态 : 写就绪(或非就绪)、读就绪(或非就绪)。   当socket函数对该socket描述符进行I/O操作,如从socket读数据,向socket写数据时,  如果该socket 处于非就绪状态,那么在默认情况下,不论是从socket,还是向socket写数据,那么socket函数都会被阻塞,直到socket处于就绪状态,这些socket I/O处理函数才会返回。

 

  这就会造成一些问题,如当一个进程在读一个处于socket读未就绪的套接字时,那么他会被阻塞,除非这个socket变为读就绪状态,否则程序无法做其他任何处理。  然而 socket可以是全双工的, 一个socket套接字可能在读未就绪时,它的写是就绪的。 如果被阻塞在读未就绪状态,那么就无法处理该socket套接字的写I/O操作。

  I/O复用就是 监控进程中一个或多个socket套接字,当其中的某一个或几个变为就绪状态时,能够通知进程,并让进程做相应地处理,而不至于一直被不就绪的socket阻塞下去。

 

  一般而言,如果I/O处于读未就绪(即无数据可读)时, 对于阻塞式I/O,会被阻塞; 处于写未就绪(如缓冲区可供写入的数据的内存小于将要写入的数据大小)  

 

  Unix下有5种 I/O模型:

  1. 阻塞式I/O

  2. 非阻塞式I/O

  3. I/O复用 ( select , poll)

  4. 信号驱动式I/O (SIGIO)

  5. 异步I/O  (POSIX的 aio_ 系列函数)

 

I/O操作可分为两个阶段: 

  1. 等待数据阶段

  2. 将数据从内核复制到用户空间阶段

前4种I/O模型的区别主要在于第一阶段, 而它们第二阶段是一样的。

UNP_03_I/O复用