《UNIX网络编程》读书笔记3---IO模型与IO复用以及shutdown

这是本书最重要的内容。也是我最开始想要读本书的目的。

这里提到的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然后终止了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值