目录
本章节主要为大家介绍网络IO非阻塞及非阻塞IO多路复用
1 同步非阻塞IO介绍
1,1 非阻塞IO介绍
阻塞是由于socket文件的状态标识 默认是阻塞的,
通过函数进行查看
函数 man 2 recvfrom 进一步查看该函数的描述DESCRIPTION,在该函数中告诉我们查看fcntl 函数,我们进一步查看fcntl 函数 man 2 fcntl 查看该函数的DESCRIPTION,其中有一段是描述文件状态标志的fcntl(5, F_SETFL, O_RDWR|O_NONBLOCK) = 0 将socket设置为非阻塞
通过给fcntl函数传递参数来指定该socket为非阻塞的socket
通过以上介绍得知 阻塞和非阻塞时通过socket的状态来区分
1.2 非阻塞的特点
应用程序调用read等系统函数获取数据但没有数据时,直接返回,不必等待数据的到来,我们的应用程序是不需要等待数据的到来的,但是操作系统的内核还是需要等待处理的。
2,同步非阻塞IO的执行流程
3 非阻塞IO注意事项
同步非阻塞的特点是应用程序调用read等系统函数获取数据但没有数据时,直接返回
因为发起read调用且没有数据时直接就返回了,此时客户端socket向服务端发送了数据单我们的应用程序不知道的,这就是个问题所以同步非阻塞的socket需要在应用程序层面做一个read调用的轮询操作,例如 while(true){}来部简短的向内核缓冲区中去获取数据,直至获取到当内核缓冲区获取到数据以后,操作系统将数据从内核缓冲区拷贝到用户空间的过程也是是阻塞的。
4 IO多路复用介绍
4.1 IO多路复用模型概述
IO多路复用模型是一类IO模型的统称,在这一类模型下有不同的系统函数来帮助我们解决相应的问题有select模型,poll模型,epoll模型等等。
4.2 IO多路复用模型下的IO模型分类
IO多路复用模型下的IO模型分类IO多路复用提供了几种不同模型的不同系统调用函数可以用来检测socket的可读写状态。
select 平台一致性会好一些
poll
epoll 模型在linux上是比较成熟的,windows上是不行的
kqueue (K Q)
总结:
阻塞IO和非阻塞IO存在的共同问题:
应用程序不知道socket什么时候有数据了,所以当应用程序调用了read等系统函数在没有数据到来时,阻塞IO选择等待,非阻塞IO选择直接返回然后下次轮询能不能有一种方式知道socket中数据是否准备好了,准备好了再调用read等函数去读取数据,否则不发起读取数据的操作!!!
IO多路复可以为我们来解决这些问题
这就是IO多路复用为我们解决的问题检测socket数据状态,有效减少无意义的系统调用。