首页 > 系统相关 >Linux下io模型

Linux下io模型

时间:2024-09-09 19:51:47浏览次数:5  
标签:异步 io 模型 阻塞 发送 内核 IO Linux 数据包

目录

一.  阻塞式IO:最常见、效率低、不耗费cpu

udp丢包​编辑

tcp粘包

tcp拆包

二.非阻塞io:轮询、耗费CPU,可以处理多路IO

概念

设置非阻塞的方式

1.通过函数自带参数设置

2.通过设置文件描述符的属性,把对应属性设置为非阻塞

三.  信号驱动IO/异步IO:异步通知方式,需要底层驱动的支持


一.  阻塞式IO:最常见、效率低、不耗费cpu

阻塞I/O 模式是最普遍使用的I/O 模式,大部分程序使用的都是阻塞模式的I/O 。

缺省情况下(及系统默认状态),套接字建立后所处于的模式就是阻塞I/O 模式。

学习的读写函数在调用过程中会发生阻塞相关函数如下:

•读操作中的read、recv、recvfrom

读阻塞--》需要读缓冲区中有数据可读,读阻塞解除

•写操作中的write、send

写阻塞--》阻塞情况比较少,主要发生在写入的缓冲区的大小小于要写入的数据量的情况下,写操作不进行任何拷贝工作,将发生阻塞,一旦缓冲区有足够的空间,内核将唤醒进程,将数据从用户缓冲区拷贝到相应的发送数据缓冲区。

注意:sendto没有写阻塞

1)无sendto函数的原因:

sendto不是阻塞函数,本身udp通信不是面向链接的,udp无发送缓冲区,即sendto没有发送缓冲区,send是有发送缓存区的,即sendto不是阻塞函数。

2)UDP不用等待确认,没有实际的发送缓冲区,所以UDP协议中不存在缓冲区满的情况,在UDP套接字上进行写操作永远不会阻塞。

•其他操作:accept、connect

udp丢包

tcp粘包

tcp拆包

TCP粘包、拆包发生原因:

发生TCP粘包或拆包有很多原因,常见的几点:

1、要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包

2、待发送数据大于MSS(传输层的最大报文长度),将进行拆包(到网络层拆包 - id ipflags )。

3、要发送的数据小于TCP发送缓冲区的大小,TCP将多次写入缓冲区的数据一次发送出去,将会发生粘包

4、接收数据端的应用层没有及时读取接收缓冲区中的数据,将发生粘包

粘包解决办法:

解决问题的关键在于如何给每个数据包添加边界信息,常用的方法有如下:

1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度,这样接收端在接收到数据后,通过读取包首部的长度字段,便知道每一个数据包的实际长度了。

2、发送端将每个数据包封装为固定长度,这样接收端每次从接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。

3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。

4、延时发送

二.非阻塞io:轮询、耗费CPU,可以处理多路IO

概念

•当我们将一个套接字设置为非阻塞模式,我们相当于告诉了系统内核:“当我请求的I/O 操作不能够马上完成,你想让我的进程进行休眠等待的时候,不要这么做,请马上返回一个错误给我。”

•当一个应用程序使用了非阻塞模式的套接字,它需要使用一个循环来不停地测试是否一个文件描述符有数据可读(称做polling)。

•应用程序不停的polling 内核来检查是否I/O操作已经就绪。这将是一个极浪费CPU 资源的操作。

•这种模式使用中不普遍。

设置非阻塞的方式

1.通过函数自带参数设置

2.通过设置文件描述符的属性,把对应属性设置为非阻塞

#include <unistd.h>
#include <fcntl.h>

int fcntl(int fd, int cmd, ...);
...代表不定参,可能有也可能没有,根据需求来。
功能:
   获取/改变文件属性(linux中一切皆文件)
参数:
	fd:文件描述符
	cmd:设置的命令
		F_GETFL  //获取文件的属性
		F_SETFL  //设置文件的属性
	第三个参数:由第二个参数决定,set时候需要设置的值,get时候填0

返回值:
	文件状态标志(文件的属性)  
	-1 :失败

三.  信号驱动IO/异步IO:异步通知方式,需要底层驱动的支持

异步通知:异步通知是一种非阻塞的通知机制,发送方发送通知后不需要等待接收方的响应或确认。通知发送后,发送方可以继续执行其他操作,而无需等待接收方处理通知。

1. 通过信号方式,当内核检测到设备数据后,会主动给应用发送信号SIGIO。

2. 应用程序收到信号后做异步处理即可。应用程序需要把自己的进程号告诉内核,并打开异步通知机制。

//1.设置将文件描述符和进程号提交给内核驱动
//一旦fd有事件响应, 则内核驱动会给进程号发送一个SIGIO的信号
   fcntl(fd,F_SETOWN,getpid());

//2.设置异步通知
    int flags;
    flags = fcntl(fd, F_GETFL); //获取原属性
    flags |= O_ASYNC;       //给flags设置异步   O_ASUNC 通知
    fcntl(fd, F_SETFL, flags);  //修改的属性设置进去,此时fd属于异步
    
//3.signal捕捉SIGIO信号 --- SIGIO:内核通知会进程有新的IO信号可用
//一旦内核给进程发送sigio信号,则执行handler
    signal(SIGIO,handler);

阻塞IO(Blocking IO)

非阻塞IO(Non-blocking IO)

信号驱动IO(Signal-driven IO)

同步性

同步

非同步

异步

描述

调用IO操作的线程会被阻塞,直到操作完成

调用IO操作时,如果不能立即完成操作,会立即返回,线程可以继续执行其他操作

当IO操作可以进行时,内核会发送信号通知进程

特点

最常见、效率低、不耗费cpu,

轮询、耗费CPU,可以处理多路IO,效率高

异步通知方式,需要底层驱动的支持

适应场景

小规模IO操作,对性能要求不高

高并发网络服务器,减少线程阻塞时间

实时性要求高的应用,避免轮询开销

标签:异步,io,模型,阻塞,发送,内核,IO,Linux,数据包
From: https://blog.csdn.net/qq_64136247/article/details/142066205

相关文章

  • Git Extensions:一个.NET开源的 Git 图形用户界面(GUI)工具
    前言今天大姚给大家分享一个.NET开源、免费的用于管理Git存储库的独立图形用户界面(GUI)工具,它还与Windows资源管理器和 MicrosoftVisualStudio(2015/2017/2019/2022)集成:GitExtensions。Git新手指南:从基础到实践的全方位教程功能介绍图形用户界面:提供一个友好的......
  • Visual Studio 2019 安装 DevExpress21.2 问题记录
    如题,VisualStudio2019Enterprise安装 DevExpress21.2。安装完DevExpress21.2后,使用 DevExpress_Universal_Patch_v2.4.8工具激活,手动选择了VisualStudio的路径,但是还是提示找不到路径。因此这种方式行不通... 于是乎,在网上找到了解决方案。找到 DevExpres......
  • [MX-X3-T5 & RiOI-4] Countless J-Light Decomposition Solution
    看题以为自己会了,写代码的时候发现有细节没考虑清楚,复杂度写挂了以为被卡常了,调用并查集函数还手残打错了,浪费大半个下午。NOI之后属于越训越菜了QwQ。回到这个题,首先这个题当\(i\)固定时做法是显然的,我们自底向上考虑,每次一定是ban掉连向当前最长链最大子树的\(i\)条边......
  • 【0326】Postgres内核之 VACUUM (FULL)构建所有要 VACUUM 的 relation(s) list(17)
    上一篇:【0325】Postgres内核之VACUUM(FULL)创建BufferAccessStrategyobject(16)1.构建vacuum关系表(reltaions)List在上一篇文章中讲解了Postgres内核创建缓冲区策略对象,之后初始化给全局指针变量vac_strategy。接下来Postgres将通过vacuum()函数的参数,以确认用户......
  • SciTech-Mathmatics-Probability+Statistics-Population-Sampling-Population vs. Sam
    Difference:Populationvs.SampleBYZACHBOBBITTPOSTEDONNOVEMBER27,2020Ofteninstatisticswe'reinterestedincollectingdatasothatwecananswersomeresearchquestion.Forexample,wemightwanttoanswerthefollowingquestions:Whatis......
  • Reflection 70B 解析
    1.Reflection70B背景与发布Reflection70B由HyperWrite推出,基于Meta的Llama3.1-70BInstruct模型。它使用了一种新的自我纠错技术,并在第三方基准测试中表现优异,超越了其他开源模型。速记句:Reflection70B是基于Llama3.1的全新开源模型,具有强大的纠错能力......
  • AI界的新王者:HyperWrite的Reflection 70B模型横空出世
    在人工智能的世界里,每一天都可能发生惊天动地的变化。就在昨天,我们还在为某个模型的强大性能惊叹不已,今天,一个新的"王者"就已经闪亮登场了。各位看官,请允许我隆重介绍:来自HyperWrite公司的Reflection70B模型!......
  • 上交团队发布PathoDuet:面向H&E和IHC病理切片的自监督学习基础模型|文献精析·24-09-09
    小罗碎碎念本期主题:HE&IHC今天分享的文献于2024年7月31日发表于MedicalImageAnalysis,目前IF=10.7,作者来自上海交大。作者类型姓名单位单位翻译第一作者ShengyiHuaQingYuanResearchInstitute,ShanghaiJiaoTongUniversity,Shanghai200240,China清源研究院,......
  • 【win/mac】Adobe的专业音频编辑软件Adobe Audition (AU)2024版本下载与安装
    目录一、软件简介二、安装步骤1.下载2.安装软件三、常用快捷键1.文件操作2.播放与录制3.视图与缩放一、软件简介AdobeAudition是一款由Adobe公司开发的专业音频编辑软件,广泛用于音频后期制作,包括混音、剪切、修复、录制和处理等。该软件以其强大的功能和用户......
  • 基于GIS、RS、VORS模型、CCDM模型、geodetecto、GWR模型集成的生态系统健康的耦合协调
       将用案例实训,教授如何集成多源数据,依托ArcGISPro和R语言环境,采用“活力-组织力-恢复力-贡献力”(VORS)模型定量测算生态系统健康指数(EHI);如何从经济城镇化(GDPD)、人口城镇化(POPD)和土地城镇化(ULP)构建城镇化指数(UL)测算模型;如何定量测算长时序城镇化水平及生态系统健康状况,利用......