【计算机网络】高级IO初步理解
IO:表示 输入 输出
当对方把连接建立好,但是不发数据
而我是一个线程,正在调用 read 来读,就会阻塞,一直等数据发送过来
即读取条件不满足的情况下,read或recv 只会等待
无论是有数据时的拷贝 ,还是没有数据时的等待
两者的时间成本,全都算到了用户头上
在用户的角度,IO= 等+数据拷贝
单位时间内, 等的比重越低, IO效率越高
当IO条件满足时,称为 IO事件就绪
如:钓鱼假设分为两步 , 钓鱼 = 等 + 钓
在鱼竿的钩子上挂一个鱼漂,浮在水面上,用来恒定鱼竿下水的深度
当鱼漂上下摆动时,就可以知道当前有鱼上钩了
1. 张三一般喜欢专注于一件事, 所以当张三钓鱼等待时,就会一直盯着鱼漂看 是否有鱼上钩
过了一段时间,鱼漂动了,张三拉动鱼竿,将鱼钓上来了,放入桶中
继续刚才钓鱼的动作
张三在钓鱼的过程中,只盯着鱼漂看,不干其他事情
2. 李四天生好动, 所以当李四钓鱼时,就不怎么看鱼漂,会左顾右看的张望
当发现鱼咬钩后,就把鱼钓上来,放入桶中
继续刚才钓鱼的动作
李四在钓鱼的过程中,除了看鱼漂,还做其他事情
3. 王五比较特别, 当王五钓鱼时,在鱼竿的顶部放上一个铃铛,等待鱼上钩
等待过程中,王五做着自己的事情
当王五听到铃铛响了时,就拉动鱼竿,将鱼钓上来了,放入桶中
继续刚才钓鱼的动作
王五在钓鱼的过程中,不看鱼漂,只听铃铛来判断是否有鱼上钩
4. 赵六是周围的首富,开皮卡来钓鱼,皮卡上装了10根鱼竿 (首富是来体验生活的)
使用10根鱼竿一起钓鱼,赵六就从前往后 依次查看 是否有鱼漂在动
5. 田七是方圆500公里的首富 (田七比赵六有钱)
田七很忙,每天都有各种会议要开,而且田七并不是想钓鱼,而是喜欢吃鱼
所以就 让司机小王帮忙去钓鱼
当鱼桶满了后,给田七打电话,就会来人把鱼带走
小王在钓鱼时,田七也正在开会
张三和李四钓是一样的,差别在等待鱼上钩的方式不同
张三为 鱼漂不动,他不动
李四为 鱼漂不动,会立马返回去做其他事情
张三的钓鱼方式 称为 阻塞IO
(数据没有就绪,调用的read接口不会返回)
李四的钓鱼方式 称为 非阻塞IO
(检测一次若没有数据,则会立马返回,过一段时间可以再次检测)
王五在鱼还没有钓上来之前,就知道当铃铛响了,就应该拉动鱼竿
王五的钓鱼方式 称为 信号驱动IO
赵六一次管理多个鱼竿,赵六的钓鱼方式称为 多路复用或多路转接
在这几个人中,赵六的钓鱼效率比较高
因为赵六的鱼竿比较多,所以鱼上钩的概率大 即等待时间比较短
所以赵六的钓鱼效率比较高
前四个人都要钓鱼的过程,所以都称为 同步IO
田七没有参与钓鱼的过程,没有等 ,也没有钓,只是 发起钓鱼的过程
田七的钓鱼方式 称为 异步IO
钓 可以看作 数据拷贝
张三 李四 等人 可以看作 进程
田七可以看作是一个进程,司机小王可以看作是操作系统
鱼竿可以看作 文件描述符
鱼 可以看作是 数据
鱼咬钩 或 鱼漂动 、铃铛响 可以看作 IO事件就绪
一个进程 在文件描述符上读取数据时,若数据没有就绪,当前进程只能挂起等待
直到有IO时间就绪,数据才可以拷贝到对应的上层
阻塞IO:数据没有就绪,调用的read接口不会返回
通过使用 read 函数 从键盘中读,当代码写好时,若什么也不输入,则什么也不显示 则为阻塞IO
输入 man 2 read
从一个文件描述符 中 去读count个数据 到 buf缓冲区中
若获取成功,则返回 字节数据
若获取 为0,则表示读到文件结尾
若获取为-1,则表示失败,并设置错误码
0表示标准输入流
从标准输入流中 读buffer数组大小的数据 发送到 buffer中
运行可执行程序后,一直不输入,则导致read在等待,直到有数据输入才进行数据拷贝
非阻塞IO:检测一次若没有数据,则会立马返回 做其他事情,过一段时间可以再次检测
通过使用 read 函数 从键盘中读,当代码写好时,就是不输入
通过这样的方式,模拟读取条件不满足的情况下,read只会等待的情况
在上述阻塞IO的代码的基础上 进行修改
输入 man fcntl
第一个参数为 文件描述符
第二个参数 表示 你要对文件描述符干什么
获得/设置文件状态标记(cmd=F_GETFL或F_SETFL)
通过设置文件状态标记,就可以将一个文件描述符 变为 非阻塞
使用 F_GETFL,将当前文件描述符的属性取出来
使用 F_SETFL,将文件描述符 状态进行设置,并加上一个 O_NONBLOCK (非阻塞) 参数
若函数返回 -1,则表示失败
创建一个函数 setnonblock,将文件描述符设置为非阻塞状态
先使用F_GETFL,获取对应文件描述符的属性
若获取失败,则返回错误原因和错误码
若获取成功,则使用 F_SETFL 将文件描述符状态设为非阻塞状态
在主函数main中,将标准输入流改为非阻塞状态
并根据read的三种返回值,分别设置 返回提示 : 读取成功、文件结尾 和 读取错误
当将标准输入流设置为非阻塞状态后
再次运行可执行程序,直接就会读取失败
在调用read时,发现数据没有就绪 (当前读取检测速度太快,还没有输入,就报错了)
所以一旦底层数据没有就绪,就以出错的形式返回,但是不算真正的出错
但这样就没办法区分是真正出错还是 底层没有数据了
所以就通过出错码 进行进一步判断
EAGAIN 和 EWOULDBLOCK 都是系统设置的,错误码都是11
用于判断没出错,但是以出错的形式返回 的错误码
若为真,则下次继续检测即可
若IO被信号中断,则重新检测
非阻塞IO,是可以做到 当检测数据没有就绪 时,就返回做一些其他事情
定义一个 包装器 其参数为void 返回值为void ,并将其重命名为 func_t 类型
定义一个vetcor数组 ,其类型为 func_t
设置三个任务,分别为PrintLog OperMysql CheckNet
在创建LoadTask函数,将任务分别插入到funcs数组中
在主函数main中,调用 LoadTask函数 以此加载任务
创建一个 HandlerALLTask函数,用于遍历 vector数组 ,数组元素为任务
当数据没有就绪时,就返回 处理任务
#include
#include
#include
#include
#include
#include
#include
using namespace std;
//任务
void PrintLog()//打印日志
{
cout<<“这是一个打印日志例程”<<endl;
}
void OperMysql()
{
cout<<“这是一个操作数据库的例程”<<endl;
}
void CheckNet()
{
cout<<“这是一个检测网络状态的例程”<<endl;
}
using func_t =function<void(void)>;
vector<func_t> funcs;
void LoadTask()
{
funcs.push_back(PrintLog);
funcs.push_back( OperMysql);
funcs.push_back(CheckNet);
}
void HandlerALLTask()
{
//遍历vector数组
for(auto& func:funcs)
{
func();
}
}
void SetNonBlock(int fd)//将文件描述符设为非阻塞
{
int fl=fcntl(fd,F_GETFL);//获取当前文件描述符的指定状态标志位
if(fl<0)//获取失败
{
cerr<<"error string: "<<strerror(errno)<<"error code: "<<errno<<endl;
}
fcntl(fd,F_SETFL,fl | O_NONBLOCK);//将文件描述符状态设为非阻塞状态
}
int main()
{
char buffer[64];
SetNonBlock(0);//将标准输入流 改为非阻塞状态
LoadTask();//加载任务
while(true)
{
//0表示标准输入流
ssize_t n=read(0,buffer,sizeof(buffer)-1);//检测条件是否就绪
if(n>0)//读取成功
{
buffer[n-1]=0;
cout<<"echo# "<<buffer<<endl;
}
else if(n==0)//读到文件结尾
{
cout<<"end file"<<endl;
}
else//读取失败
{
if(errno==EAGAIN || errno ==EWOULDBLOCK)
{
//若为真,说明没出错,只是以出错返回
//底层数据没有准备好,下次继续检测
HandlerALLTask();//遍历数组 处理任务
sleep(1);
cout<<"data not ready"<<endl;
continue;
}
else if(errno == EINTR)
{
//IO被信号中断,需要重新检测
continue;
}
else //真正的错误
{
cout<<"read error"<<"error string: "<<strerror(errno)<<"error code: "<<errno<<endl;
break;
}
}
sleep(1);
}
return 0;
}
mytest:mytest.cc
g++ -o $@ $^ -std=c++11
.PHONY:clean
clean:
rm -f mytest
高级 IO_ 高级 IO思维导图_
10-01
为了方便大家学习 高级 IO,准备了一份 高级 IO思维导图
了解cpu IO 网络 应用
03-29
了解CPU 了解 IO设备,协议栈 了解集群,了解内存,了解网络 PPT
IO多路复用之select实例
04-23
本示例演示了使用select函数处理多路 IO复用。本示例在ubuntu + Qt下编译通过的,仅提供学习使用。
总结网络 IO模型与select模型的Python实例讲解
09-21
同步、异步、阻塞、非阻塞,当这些网络 IO名词堆到一起时难免使编程初学者感到困惑,这里我们就来为大家总结网络 IO模型与select模型的Python实例讲解:
网络 io使用实例 select,poll,epoll
03-08
网络 io的使用实例 1.阻塞 2.多线程 3.select 4.poll, 5.epoll
网络编程+ IO实现快递管理系统
01-20
这是完整的项目资源包,主要是针对本地文件的存储小系统。我不知道有啥bug,希望大家指正
IO多路复用之select——完整代码
02-10
三种 IO多路复用机制: 一:select 二:poll 三:epoll
以上三种IO多路复用的完整代码,皆可以在我的资源列表中获取下载:
资源列表:http://download.csdn.net/user/qiulanzhu
【Linux】 高级 IO --- 多路转接,select,poll,epoll
自己所得一切,皆非所配
09-05 1327
五种 IO模型,编写select_server,poll_server,epoll_server服务器代码, 理解epoll模型的底层原理,总结select poll epoll三者的优缺点……
高级 IO详解——五种 IO模型
waywt1的博客
09-19 601
任何的 IO过程中,都包含两个步骤,等待数据与拷贝数据。而且在实际的应用场景中,等待消耗的时间往往都远高于拷贝的时间。让 IO更高效,最核心的办法就是让等待的时间尽量少。所以,高效的 IO本质就是,减少单位时间内,”等“的比重。
<HarmonyOS第一课>ArkTS 开发 语言介绍——闯关习题及答案
学无止境
10-07 654
1.循环渲染ForEach可以从数据源中迭代获取数据,并为每个数组项创建相应的组件。( 对 )2.@Link变量不能在组件内部进行初始化。( 对 )1.用哪一种装饰器修饰的struct表示该结构体具有组件化能力?( A )B. @Entry2.用哪一种装饰器修饰的自定义组件可作为页面入口组件?( B )B. @Entry1.下面哪些函数是自定义组件的生命周期函数?( ABCDE )2.下面哪些装饰器可以用于管理自定义组件中变量的状态?
黄土高原生态环境治理探讨PPT模板.pptx
10-07
黄土高原生态环境治理探讨PPT模板.pptx
simulink仿真ASKFSK.pdf
10-07
simulink仿真ASKFSK.pdf
新闻发布论文,供毕设参考
10-07
本系统是一个基于ssm的在线新闻发布系统,采纳B/S架构,通过运用mysql这个关系型数据库来存储数据,Tomcat作为使用服务器,Jsp作为页面 开发技术;其 开发主要包含数据库表结构设计,数据库操作层、逻辑层、控制层,前端页面的 开发,采纳Mysql为底层存储数据库、java编程作为 开发言语。本系统主要分为门户和后台,门户主要是用户的注册登录,首页不同类型新闻的展示,以及对新闻的评论;后台主要是管理员的登录,系统菜单、角色的维护,用户的信息维护,新闻信息的维护以及评论的维护。 开发完成后,能够作为一个小型的新闻发布系统。
1.04 浮动和和盒模型
10-07
1.04 浮动和和盒模型
元旦新年计划与愿景PPT模板.pptx
10-07
元旦新年计划与愿景PPT模板.pptx
64路继电器输入输出 IO板卡控制labView源码
10-07
1、波特率和板卡ID编号可自行设置。当忘记后带有复位按钮,可以长按恢复出厂设置 2、实时控制(发命令控制任何一路通断,也可以一次控制32个所有通道的通断状态) 3、延时通断(发命令控制任何一路延时接通或者延时断开,也可以一次控制32个统一延时) 4、定次间歇通断(发命令控制任何一路接通X秒断开Y秒,工作N次后停止。也可以一次控制32路统一动作) 5、发命令控制任意长度通道数轮换(发命令指定从A通道开始到B通道停止,每个接通X秒) 6、通电自动轮换(设置好开始A和结束通道B,每个的接通时间X,当通电后会自动运行,不需要电脑再发命令等待操作) 7、触发自动轮换(设置好开始A和结束通道B,每个的接通时间X,启动通道号C。当C通道采集触发后自动运行,不需要电脑再发命令等待操作,可实现用按钮触发工作或者传感器触发工作) 8、可以设置通信监测(当通信超时时,可以让所有通道接通或者断开,这样子保障实时控制的可靠性和安全性) 9、 输入(采集)和输出关联控制(可设置当采集有信号时,输出执行什么样的工作,详细参数下面第12条功能说明) 10、开关量采集(高电平触发,可设置当有变化时自动给232或者485
MBA论文答辩PPT模板展示.pptx
10-07
MBA论文答辩PPT模板展示.pptx
大型ERP系统INV详细设计说明书.docx
最新发布
10-07
大型ERP系统INV详细设计说明书
如何正确 理解网络 io与网络吞吐量
02-17
网络 IO(Input/Output)是指计算机与网络之间进行数据交换的能力,包括数据发送和接收的速度以及传输的稳定性。网络 IO通常以单位时间内传输的数据量(比如每秒传输的字节数)来衡量。
网络吞吐量是指网络传输数据的速率,即单位时间内传输的数据量。网络吞吐量可以受到多种因素的影响,比如网络拓扑结构、网络设备的性能、传输协议等。网络吞吐量通常使用比特/秒(bit/s)或字节/秒(byte/s)来衡量。
正确理解网络IO和网络吞吐量需要注意它们的区别。网络IO通常用来描述设备或应用程序的性能,而网络吞吐量则用来描述整个网络的性能。网络IO强调的是数据的传输速度和稳定性,而网络吞吐量强调的是整个网络的传输能力。在优化网络性能时,需要综合考虑网络IO和网络吞吐量的影响,并采取相应的措施来提高网络性能。
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交
热门文章
- 通讯录(静态+动态) 20412
- 【linux】冯诺依曼体系|操作系统|管理本质 5938
- 百度面试题——迷宫问题(超详细解析) 5581
- linux的基本指令(中) 4875
- linux基本指令(上) 3809
分类专栏
-
计算机网络 15篇
-
算法刷题 9篇
-
linux 42篇
-
C++ 32篇
-
MySQL 1篇
-
数据结构 22篇
-
纪念日 1篇
-
c语言 19篇
最新评论
您愿意向朋友推荐“博客详情页”吗?
-
强烈不推荐
-
不推荐
-
一般般
-
推荐
-
强烈推荐
提交
最新文章
- 【计算机网络】高级IO——select
- 【计算机网络】数据链路层
- 【计算机网络】IP协议(下)
2023
10月 2篇
09月 10篇
08月 5篇
07月 8篇
06月 15篇
05月 12篇
04月 13篇
03月 10篇
02月 13篇
01月 8篇
2022年58篇
目录
- 文章目录
- 1. 什么是IO?
-
- 什么是高效 IO?
- 2. IO的五种模型
-
- 五种IO模型的概念理解
-
- 同步IO与异步IO
- 整体理解
- 3. 阻塞IO
- 4. 非阻塞IO
-
- setnonblock函数
- 为什么非阻塞IO会读取错误?
- 对错误码的进一步判断
- 检测数据没有就绪时,返回做一些其他事情
- 完整代码
-
- mytest.cc
- makefile
青花锁: 在鱼竿的钩子上挂一个鱼漂,浮在水面上,用来恒定鱼竿下水的深度 当鱼漂上下摆动时,就可以知道当前有鱼上钩了
北飞的山羊: 支持大佬好文分享
秋说: 博主的内容讲的很详细清晰,图文并茂,三连支持博主继续创作出更加优质的文章,
秋说: 博主的内容讲的很详细清晰,图文并茂,三连支持博主继续创作出更加优质的文章,