计算机网络 | 五种I/O模型

news/2024/7/7 22:08:07

在这里插入图片描述

欢迎关注博主 Mindtechnist 或加入【Linux C/C++/Python社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。


五种I/O模型

    • 阻塞I/O
    • 非阻塞I/O
    • I/O复用
    • 信号驱动I/O
    • 异步I/O


专栏:《网络编程》


阻塞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通讯)。

...

在这里插入图片描述
在这里插入图片描述



http://lihuaxi.xjx100.cn/news/1133166.html

相关文章

什么是独享数据库(Database per Microservice)?解决了什么问题?

独享数据库(Database per Microservice)是一种微服务架构模式,涉及为每个微服务创建单独的数据库。在这种模式下,每个微服务都有自己的数据库,这允许更大的可扩展性、灵活性和自治性。 使用这种模式,每个微…

[day28]算法训练

房屋偷盗 解题思路 动态规划,创建一个数组dp,dp[i]表示偷到第i家时最大的金额,由于偷到相邻两家时,报警器会进行报警,所以有对于dp[i]有两种可能:第一种不偷第i家,则结果为dp[i-1],第二种偷第…

设计模式-职责链模式

职责链模式 文章目录 职责链模式什么是职责链模式为什么要用职责链模式如何使用职责链模式总结 什么是职责链模式 将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上…

定风波、渡重山、至未来:2023中国数字能源生态大会开启的新旅程

全球碳中和的时代背景下,面向3060发展目标,新使命、新技术、新应用的到来,都给能源产业带来了持续变革的必要性与可能性。 2023年5月11日,在2023中国数字能源生态大会上,华为数字能源技术有限公司总裁侯金龙发表了“融…

如何使用SVG.js库中的mask()和clip()方法创建这两种元素,以及它们的常见属性和用法

SVG.js是一款轻量级的JavaScript库,用于创建交互式的可缩放矢量图形(SVG)动画。在SVG.js中,mask和clipPath元素是非常有用的功能,能够将SVG图像切割、裁剪并添加效果。本文将为您介绍SVG.js中的mask和clipPath元素的相…

QML APP开发套路(三):前/后端值传递(自定义值类型)

(1)前/后端交互内容 QML APP前后端交互的内容按目标(拍脑袋)可以分为2个部分: 方向内容后端(C) → 前端(QML)前端展示所需的数据,形式:简单类型…

电脑技巧:分享六个有趣好玩的网站,值得收藏

目录 1、Weavesilk 2、一键抠图 3、狗屁不通文章生成器 4、小霸王在线小游戏 5、世界名画在线拼图 6、寻找不动的emoji 今天小编给大家分享六个有趣好玩的网站,值得收藏! 1、Weavesilk Weavesilk是一个光线绘画网站,它不需要有任何绘画…

Linux -- 进程信号

文章目录 1. 信号量1.1 进程互斥概念1.2 认识信号量 2. 信号入门2.1 信号概念2.2 见一见2.3 signal()系统调用2.4 宏定义信号 3. 信号产生方式3.1 键盘产生信号3.2 系统调用产生信号3.3 软件条件产生信号3.4 硬件异常产生信号3.5 Core dump 4. 阻塞信号4.1 相关概念4.2 信号在内…