IO 网络模型
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,贝叶斯滤波与Kalman估计、多传感器信息融合,机器学习,人工智能,控制理论等相关领域的知识和技术。关注公粽号 《机器和智能》 回复关键词 “python项目实战” 即可获取美哆商城视频资源!
博主介绍:
CSDN优质创作者,CSDN实力新星,CSDN内容合伙人;
阿里云社区专家博主;
华为云社区云享专家;
51CTO社区入驻博主,掘金社区入驻博主,支付宝社区入驻博主,博客园博主。
专栏:《智能优化算法》
阻塞I/O
①当上层应用app1调用recv
系统调用时,如果对等方没有发送数据(缓冲区没有数据),上层应用app1将阻塞(默认行为,被linux内核阻塞);
②当对等方发送了数据,linux内核recv
端缓冲区,有数据后,内核会把数据copy
给用户空间。然后上层应用app1解除阻塞,执行下一步操作。
非阻塞I/O
①上层应用程序app2将套接字设置成非阻塞模式。
②上层应用程序app2轮询调用recv
函数,接受数据。若缓冲区没有数据,上层程序app2不会阻塞,recv
返回值为-1,错误码是EWOULDBLOCK
。
③上层应用程序不断轮询有没有数据到来。会造成上层应用忙等待。大量消耗CPU。很少直接用。应用范围小,一般和selectIO复用配合使用。
I/O复用
①上层应用程序app3调用select
机制(该机制有linux内核支持,避免了app3忙等待。),进行轮询文件描述符的状态变化。
②当select
管理的文件描述符没有数据(或者状态没有变化时),上层应用程序app3也会阻塞。
③好处select
机制可以管理多个文件描述符
④select
可以看成一个管理者,用select
来管理多个IO。
一旦检测到的一个I/O或者多个IO,有我们感兴事件,发生,select
函数将返回,返回值为检测到的事件个数。进而可以利用select
相关api函数,操作具体事件。
⑤select函数可以设置等待时间,避免了上层应用程序app3,长期僵死。
⑥和阻塞IO模型相比,selectI/O复用模型相当于提前阻塞了。等到有数据到来时,再调用recv
就不会发生阻塞。整个系统性(app和linux内核协议栈配合更好了)能优化、提供了。
信号驱动I/O
① 上层应用程序app4建立SIGIO
信号处理程序。当缓冲区有数据到来,内核会发送信号告诉上层应用程序app4。
②上层应用程序app4接收到信号后,调用recv
函数,因缓冲区有数据,recv
函数一般不会阻塞。
③这种用于模型用的比较少,属于典型的“拉模式”。即:上层应用app4,需要调用recv
函数把数据拉进来。
异步I/O
①上层应用程序app5调用aio_read
函数,同时提交一个应用层的缓冲区buf;调用完毕后,不会阻塞。上层应用程序app5可以继续其他任务。
②当tcpip协议缓冲区有数据时,linux主动的把内核数据copy
到用户空间。然后再给上层应用app5发送信号;告诉app5数据有了,赶快处理吧。
③典型的“推模式”。
④ 效率最高的一种形式,上层应用程序app5有异步处理的能力(在linux内核的支持下,言外之意:处理其他任务的同时,也可支持IO通讯)。
...
???重要????关注下方公粽号 《机器和智能》 回复关键词 “python项目实战” 即可获取美哆商城视频资源!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!