【网络编程】网络IO模型2-非阻塞式IO

上一章请戳:【网络编程】网络IO模型1-阻塞式IO

非阻塞式IO的原理

非阻塞IO(non-blocking IO)其实就是把socket()函数设置成non-blocking模式。直接这么说不是很好理解,但是我们如果清楚,网络编程用到的很多原理,和linux的application与linux 内核之间的交互是相通的,就比较容易想象。当有个application跟linux的kernel函数读取数据的时候,如果kernel没有把数据准备好,kernel也不会block 掉 application的进程,而是会立刻返回一个error,说自己被准备好。然后application就可以再次发送一个请求read的操作,等kernel中的数据准备好了,用户再给它发一个系统调用,kernel就会把拷贝的值返回给用户。

非阻塞式IO的返回值和相关设置函数

在非阻塞式IO,就是用户不断地对kernel主动询问数据准备好与否。不同的返回值代表不同的状态。返回值大于0就是接受数据完备,返回的就是接受的字节数。等于0就是断开,-1而且errno等于EAGAIN,表示recv还没完成。而不等于EAGAIN,则说明recv遇到系统错误。

函数fcntl()可以将句柄fd设置成非阻塞状态。

fcntl(fd, F_SETFL, O_NONBLOCK)

通过这个接口,以及服务器循环调用recv()接口,我们可以让服务器只用一个线程,但是可以从多个连接中检测从客户端传来数据是否有送达到。

对于socket,我们一般采用以下两个函数,setblocking(False) 或者 ConfigureBlocing(false)

非阻塞式IO的缺点

然而,我们不推荐使用非阻塞IO,因为循环调用recv()会对cpu产生很多负担。并且,在这个方案中recv()只是在检测操作是否完成,操作系统里还有更好的函数select()的多路复用模式,可以一次性检测连接有哪些连接是活跃的。Apache有用到select()

下一篇将重点介绍多路复用IO (IO multiplexing)。

参考

文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值