首页 > 代码库 > 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复用