这是本书最重要的内容。也是我最开始想要读本书的目的。
这里提到的IO复用,即select,poll,epoll也即Reactor
一个说法是1994年前后,UNIX分为两个阵营,AT&T的SVR4和BSD的BSD4.x,这两家的IO复用不完全兼容,
SVR4采用poll而BSD采用select,而ACE用面向对象的技术屏蔽了这一点,实现了统一的Reactor接口。
1.I/O模型
图6.6画地非常之好,所以感觉一图足以。
阅读这个内容,最好是先man select,看看它的参数以及返回值的意义。I/O复用的概念就好容易了解。
看了信号的内容,信号驱动式I/O就很容易理解了。
主要分为两个阶段,①数据从网络到内核②数据从内核到用户进程
而同步IO在②中都是阻塞的。异步IO在两个阶段都不会阻塞。
2.select
3.poll
其实2,3的内容man一下,参数就明白了。
看一下书中的例子,就更清楚了。
值得注意的是
4.epoll
技术,poll比select的一大提升是使用的描述符个数,不再受到FD_SETSIZE的限制,
而且这个数量是程序员要向内核动态指定。
但本质上poll和select都是只通知有消息来到,你根本不具体地知道,来到的是你所关注的哪一个消息。
所以处理上select和poll一旦有消息来到,需要程序员对所有关注的消息穷举查看。这是极度低效率的。
我没有具体查看epoll的资料,不过好像是epoll不仅告诉你有消息来了,还告诉你是哪一个消息,这样你可以直接找到那一个连接,处理就是。
5.shutdown与close的区别
shutdown也会发送FIN消息。
如果你只是关闭了,写半边,那么你仍然可以读,可以收消息,随后收到对端的FIN,然后断开TCP连接。
然而,如果使用close,你既关闭了写的功能,也关闭了读的功能。你向对方发送了FIN之后,对方就不能再向你write了,write第一次,内核会向对方发送一个RST,write第二次,就方的进程就会收到信号SIGPIPE然后终止了。