同步阻塞IO
在这个模型中,应用程序(application)为了执行这个read操作,会调用相应的一个system call,将系统控制权交给kernel,然后就进行等待(这其实就是被阻塞了)。kernel开始执行这个system call,执行完毕后会向应用程序返回响应,应用程序得到响应后,就不再阻塞,并进行后面的工作。
例如,“在调用 read 系统调用时,应用程序会阻塞并对内核进行上下文切换。然后会触发读操作,当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。然后应用程序就会解除阻塞(read 调用返回)。”
举一个浅显的例子,就好比你去一个银行柜台存钱。首先,你会将存钱的单子填好,然后交给柜员。这里,你就好比是application,单子就是调用的 system call,柜员就是kernel。提交好单子后,你就坐在柜台前等,相当于开始进行等待。柜员办好以后会给你一个回执,表示办好了,这就是 response。然后你就可以拿着回执干其它的事了。注意,这个时候,如果你办完之后马上去查账,存的钱已经打到你的账户上了。后面你会发现,这点很重要。
同步非阻塞IO
在linux下,应用程序可以通过设置文件描述符的属性O_NONBLOCK,I/O操作可以立即返回,但是并不保证I/O操作成功。
也就是说,当应用程序设置了O_NONBLOCK之后,执行write操作,调用相应的system call,这个system call会从内核中立即返回。但是在这个返回的时间点,数据可能还没有被真正的写入到指定的地方。也就是说,kernel只是很快的返回了这个 system call(这样,应用程序不会被这个IO操作blocking),但是这个system call具体要执行的事情(写数据)可能并没有完成。而对于应用程序,虽然这个IO操作很快就返回了,但是它并不知道这个IO操作是否真的成功了,如果想知道,需要应用程序主动地去问kernel。
这次不是去银行存钱,而是去银行汇款。同样的,你也需要填写汇款单然后交给柜员,柜员进行一些简单的手续处理就能够给你回执。但是,你拿到回执并不意味着钱已经打到了对方的账上。事实上,一般汇款的周期大概是24个小时,如果你要以存钱的模式来汇款的话,意味着你需要在银行等24个小时,这显然是不现实的。所以,同步非阻塞IO在实际生活中也是有它的意义的。
异步阻塞IO
和之前一样,应用程序要执行read操作,因此调用一个system call,这个system call被传递给了kernel。但在应用程序这边,它调用system call之后,并不等待kernel返回response,这一点是和前面两种机制不一样的地方。这也是为什么它被称为异步的原因。但是为什么称其为阻塞呢?这是因为虽然应用程序是一个异步的方式,但是select()函数会将应用程序阻塞住,一直等到这个system call有结果返回了,再通知应用程序。也就是说,“在这种模型中,配置的是非阻塞 I/O,然后使用阻塞 select 系统调用来确定一个 I/O 描述符何时有操作。”
所以,从IO操作的实际效果来看,异步阻塞IO和第一种同步阻塞IO是一样的,应用程序都是一直等到IO操作成功之后(数据已经被写入或者读取),才开始进行下面的工作。异步阻塞IO的好处在于一个select函数可以为多个描述符提供通知,提高了并发性。
关于提高并发性这点,我们还以银行为例说明。比如说一个银行柜台,现在有10个人想存钱。按照现在银行的做法,一个个排队。第一个人先填存款单,然后提交,然后柜员处理,然后给回执,成功后再轮到下一个人。大家应该都在银行排过对,这样的流程是很痛苦的。如果按照异步阻塞的机制,10个人都填好存款单,然后都提交给柜台,提交完之后所有的10个人就在银行大厅等待。这时候会专门有个人,他会了解存款单处理的情况,一旦有存款单处理完毕,他会将回执交给相应的正在大厅等待的人,这个拿到回执的人就可以去干其他的事情了。而前面提到的这个专人,就对应于select函数。
异步非阻塞IO
如图所示,应用程序提交read请求的system call,然后,kernel开始处理相应的IO操作,而同时,应用程序并不等kernel返回响应,就会开始执行其他的处理操作(应用程序没有被IO操作所阻塞)。当kernel执行完毕,返回read的响应,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。
比如银行存钱。现在某银行新开通了一项存钱业务。用户之需要将存款单交给柜台,然后无需等待就可以离开了。柜台办好以后会给用户发送一条短信,告知交易成功。这样用户不需要在柜台前进行长时间的等待,同时,也能够得到确切的消息知道交易完成。
从前面的介绍中可以看出,所谓的同步和异步,在这里指的是application和kernel之间的交互方式。如果application不需要等待 kernel的回应,那么它就是异步的。如果application提交完IO请求后,需要等待“回执”,那么它就是同步的。
而阻塞和非阻塞,指的是application是否等待IO操作的完成。如果application必须等到IO操作实际完成以后再执行下面的操作,那么它是阻塞的。反之,如果不等待IO操作的完成就开始执行其它操作,那么它是非阻塞的。
分享到:
相关推荐
植物病害分割系统源码&数据集分享
PHP开发的二级域名分发系统源码 已对接易支付 PHP7.2 需要安装SG11扩展 放进根目录 解压 然后 设置伪静态 一定要先设置伪静态 要不然404 最后打开你的域名直接进入安装步骤
微信小程序学易通(仿学习通)仅供学习参考
BP回归分析.xlsx
棒球运动物体检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
叶片检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]
Simpack与Abaqus联合仿真:车轨刚柔耦合模型建模全攻略,simpack与abaqus联合仿真教程 车轨刚柔耦合仿真教程 刚柔耦合模型 出simpack与abaqus联合仿真车轨刚柔耦合模型教程,包括柔性钢轨建模,fbi文件生成,钢弹簧浮置板搭建,轨道不平顺激励等,包括模型。 ,simpack; abaqus; 联合仿真; 车轨刚柔耦合; 柔性钢轨建模; FBI文件生成; 钢弹簧浮置板; 轨道不平顺激励; 刚柔耦合模型。,Simpack与Abaqus联合仿真车轨刚柔耦合模型教程
python脚本调用deepseek api 生成聊天机器人,前提需要自己购买api
魔众企业官网系统采用PHP+Mysql架构,是一款对SEO非常友好、功能全面、安全稳定、支持多终端展示并且使用起来极其简单的企业建站系统。 魔众企业官网系统,帮助企业完美展示自己的形象。 2022年08月17日魔众企业官网系统发布v5.1.0版本,增加了以下22个特性: ·[新功能] 文件上传切片最大2M,分片文件根据配置动态清除 ·[新功能] UEditorPlus升级到2.3.0 ·[新功能] 图标库新增 check-simple ·[新功能] Cookie库新增属性参数 ·[新功能] 登录界面全新改版大气美观 ·[新功能] 用户授权模块微信小程序优化 ·[新功能] 后台管理员角色新增备注字段 ·[新功能] 富文本组件新增 editor-ready 自定义事件 ·[新功能] Response新增停止执行抛出消息的方法 ·[新功能] Grid新增批量弹窗快捷操作方式 ·[新功能] Grid编辑操作名称可自定义 ·[新功能] Json组件增加高度可配置参数 ·[新功能] Type类型数据新增导出JS配置文件 ·[新功能] bodyProperties可为body标签增加属性 ·[系
"基于遗传算法GA的柔性作业车间调度问题(FJSP)求解方法研究及MATLAB代码实现",FJSP:遗传算法GA求解柔性作业车间调度问题(FJSP),提供MATLAB代码 ,FJSP; 遗传算法GA; 柔性作业车间调度; MATLAB代码; 求解。,FJSP的遗传算法GA求解MATLAB代码实现
2024免费毕业设计成品,包括源码+数据库+往届论文资料 启动教程:https://www.bilibili.com/video/BV11ktveuE2d 讲解视频:https://www.bilibili.com/video/BV1YfkHYwEME 二次开发教程:https://www.bilibili.com/video/BV1Cw2rY1ErC
.
java代码实现 心形输出
内容: 本研究观察并收集了来自苏珊沼泽图勒红潮汐恢复点(坐标:38.117843, -121.983199)的钩虾(Gammarus sp.),时间跨度为2021年1月至12月。所有观察和采集工作均在修复地点二级潮汐通道中不超过20厘米深的微咸水中进行,距离提供的GPS坐标0.25英里范围内。钩虾的采集是在加利福尼亚科学采集许可证编号S-201970002-20281-001下进行的。每月的野外观察和捕捉以5米的间隔在8个半永久性的20米样带上进行,这些样带设置在相同区域的芦苇和本地植物冠层中,其中0米表示潮汐通道边缘。我们通过使用火鸡吸管捕获离散的水池(约60克水)来测量浮游无脊椎动物的生物多样性。水样本经过0.125毫米滤网过滤后,用去离子水冲洗,并在玫瑰苯胺染色的70%乙醇溶液中保存。 该研究提供了5组数据集,详情请参见:"" ()。
基于S7-1200 PLC的西门子博途4×4立体车库控制系统:PLC组态仿真、电气原理图与IO表综合研究报告,基于plc的立体车库控制系统,西门子博途4×4立体车库控制系统,S7-1200PLC编程,wincc组态仿真,系统包括PLC组态仿真,电气原理图,PLC接线图,IO表,报告等 ,基于plc的立体车库控制; 西门子博途4x4立体车库控制系统; S7-1200PLC编程; wincc组态仿真; 控制系统组成(含PLC组态仿真); 电气原理图; PLC接线图; IO表; 报告,西门子S7-1200PLC驱动的立体车库控制系统开发与仿真研究
chromedriver-win32-135.0.7004.0 (Canary).zip
这款资源系统是一款基于PHP和MySQL开发的内容管理系统(CMS),广泛应用于资源分享、下载站点的搭建。该系统以简洁、高效、易用为特点,适合快速构建资源类网站。 核心功能 资源管理:支持多种资源类型(如软件、文档、视频等)的上传、分类、展示和下载。 用户系统:提供用户注册、登录、权限管理等功能,支持用户积分、等级制度。 SEO优化:内置SEO功能,支持自定义URL、关键词、描述等,提升搜索引擎排名。 模板管理:支持多套模板切换,用户可以根据需求自定义网站外观。 插件扩展:系统支持插件机制,用户可以通过安装插件扩展功能,如支付接口、社交分享等。 安全机制:内置防SQL注入、XSS攻击等安全机制,保障系统安全。 适用场景: 资源下载站 软件分享平台 文档分享站点 视频资源站
介绍: 在2025年,随着技术的不断进步和用户需求的多样化,社区平台的设计与功能也在不断演变。StarFree作为一款全新的唯美风格社区源码,凭借其独特的设计理念和强大的功能,迅速成为了开发者与用户关注的焦点。本文将为您详细介绍StarFree源码的特点、功能以及应用场景。 1. 唯美设计,极致视觉体验 StarFree源码以“唯美”为核心设计理念,采用了简约而不失优雅的UI设计。整体界面以柔和的色调为主,搭配流畅的动画效果,为用户带来极致的视觉享受。无论是社区主页、个人中心,还是帖子详情页,每一个细节都经过精心打磨,确保用户在浏览时感受到舒适与愉悦。 2. 模块化架构,灵活扩展 StarFree采用模块化架构设计,开发者可以根据需求自由组合或扩展功能模块。无论是社交互动、内容发布,还是用户管理,每个模块都独立且高效,便于二次开发与定制。这种设计不仅降低了开发难度,还提高了系统的可维护性。 3. 多端适配,无缝体验 StarFree源码支持多端适配,包括Web端、移动端(iOS/Android)以及小程序。无论用户通过哪种设备访问社区,都能获得一致且流畅的体验。源码内置响应式布局
支持TIA_Portal_V20的固件库,可以下载更新最新库。
树木检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]