IO的几个模型

news2025/1/17 12:19:54

I/O模型名词介绍

说到I/O模型,都会牵扯到同步、异步、阻塞、非阻塞这几个词,以下讲解这几个词的概念。

阻塞和非阻塞

阻塞和非阻塞指的是一直等还是可以去做其他事。

阻塞(blocking):调用结果返回之前,调用者被挂起(当前线程进入非可执行状态,在这个状态,CPU不会分配时间片,线程暂停运行);

非阻塞(nonblocking):调用结果返回之前,调用者不会被挂起(当前线程还是可执行状态,CPU会分配时间片,线程还可以运行)

同步和异步

同步/异步关注的是消息通信机制

同步(synchronous):被调用者完成任务后,不会主动给调用者返回调用结果。

异步(asynchronous):被调用者完成任务后,会主动给调用者返回调用结果。

                  

       阻塞、非阻塞、多路IO复用,都是同步IO,异步必定是非阻塞的,所以不存在异步阻塞和异步非阻塞的说法。真正的异步IO需要CPU的深度参与。换句话说,只有用户线程在操作IO的时候根本不去考虑IO的执行全部都交给CPU去完成,而自己只等待一个完成信号的时候,才是真正的异步IO。所以,拉一个子线程去轮询、去死循环,或者使用select、poll、epool,都不是异步。

I/O模型类型

IO模型分为以下五类

  1. 阻塞I/O:所有过程全阻塞
  2. 非阻塞I/O:如果没有数据buffer,则立即返回EWOULDBLOCK
  3. I/O复用型(select和poll):在wait和copy阶段分别阻塞
  4. 信号驱动型I/O(SIGIO):在wait阶段不阻塞,但copy阶段阻塞(信号驱动I/O),即通知
  5. 异步I/O(AIO):完全无阻塞方式,当I/O完成时提供信号

阻塞I/O

说明:应用程序调用一个IO的recvfrom函数,会导致应用程序阻塞,进入阻塞状态后直到I/O操作结束才会返回;如果系统内核数据没有准备好,那就一直等待数据准备,因为是调用了recvfrom函数导致了应用程序阻塞,所以一直在等,做不了任何事情,内核数据准备好之后把数据从内核拷贝到用户空间,拷贝结束后,I/O函数返回成功指示。 注:其阻塞时在I/O操作阶段

非阻塞I/O

说明:用户线程发起IO请求时立即返回。但并未读取到任何数据,则返回字段为“EWOULDBLOCK”,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即“轮询”机制。 整个IO请求过程中,虽然用户线程每次发起IO请求后可以立即返回,但是为了等到数据。仍需要不断地轮询、重复请求、消耗了大量的CPU资源;是比较浪费CPU的方式,一般很少用这种模型,而是在其他模型中使用非阻塞IO这一特性。

I/O复用(select和poll)

说明:I/O复用模型会用到select或poll函数,在I/O复用模型中,并不是阻塞到I/O操作过程中,而是阻塞到select或者poll函数中; 以select为例:进程在select处阻塞,等待几个描述符中的一个变为可操作,如果没等待到就继续阻塞在第一阶段,如果等到了一个描述符变为了可操作,则调用recvfrom函数将数据拷贝到应用缓冲区。

信号驱动I/O(SIGIO)

说明:首先,我们允许套接口进行信号驱动I/O,并安装一个信号处理函数SIGIO,如果数据没有准备好,则立即返回结果,进程继续工作并不阻塞。当数据准备好时,系统内核会主动发送一个SIGIO信号给应用程序,应用程序收到信号后,可以在信号处理函数中调用I/O操作函数recvfrom进行数据处理。 信号驱动I/O模型的优点是当数据报到达时,可以不阻塞,主循环可以继续执行,只是等待处理程序的通知,或者数据已经准备好被处理,或者数据报已经准备好被读了。

异步I/O(AIO)

说明:当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态通知和回调通知来告诉调用者的输入输出操作。 用户可以直接对I/O执行读写操作,这些操作告诉内核用户读写缓冲区的位置,以及I/O操作完成之后内核通知应用程序的方式,就是上面讲的通过状态通知或者回调通知来告诉调用者。异步I/O的读写操作总是立即返回,但没有返回结果说是否阻塞,因为异步I/O操作真正的读写操作已由内核接管,内核自己对数据处理完成后生成一个信号,然后通知用户刚才交给自己的事件已经处理完成。

五种I/O模型的总结及比较

中文图示如下:

英文图示如下:

从两张图中我们可以看到,越往后,阻塞越少,理论上效率也是最优。 其中五种I/O模型中,前三种属于同步I/O,后两者属于异步I/O。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

环形链表笔记(自用)

环形链表 不管怎么样slow最多走半圈了, 快慢指针slow走一步,fast走两步最合适,因为假设fast和slow相差n每一次他们前进,就会相差n-1步,这样他们一定会相遇,如果是环形链表的话。 代码 /*** Definition for…

Vue 2的计算属性与侦听器

计算属性 vs 方法 vs 侦听器 计算属性的出现是为了解决模板内表达式太过复杂而变得难以维护。 假设我们知道长和宽&#xff0c;要计算一个矩形的面积&#xff0c;如果没有计算属性&#xff0c;我们可能像下面这样处理&#xff1a; <div id"app"><input t…

基于Java+SpringBoot+Vue的乌鲁木齐南山冰雪旅游服务网站【源码+论文+演示视频+包运行成功】

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推…

北京“三阳”凶猛,真会说来就到吗?

综合媒体最新报道&#xff0c;据北京疾控中心发布的第32周《传染病周报》称&#xff0c;8月7日-8月13日&#xff0c;呼吸道传染总报告数为6205例(新冠为主)&#xff0c;比上周猛增了71.6%&#xff01; 从30周到32周&#xff0c;北京呼吸道传染病分别增长了5.3%、20.6%、71.6%。…

VBA_MF系列技术资料1-157

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

ubuntu向日葵无法连接

近来收到部分用户小伙伴的反馈&#xff0c;在CentOS8、Ubuntu17.10或更高版本上使用向日葵个人版&#xff0c; 当其它设备远程控制自己的时候&#xff0c;控制界面会出现“连接已断开”或显示为黑屏的情况。 这其实是由于系统默认采用了wayland作为显示服务器的缘故&#xff0…

python Selenium

Selenium概述 Selenium是一个用于web应用程序测试的工具&#xff0c;模拟浏览器功能&#xff0c;自动执行网页中的is代码&#xff0c;实现动态加载 支持通过各种driver (FirfoxDriver,IternetExplorerDriver&#xff0c;OperaDriver&#xff0c;chromeDriver) 驱动直实浏览器完…

记一次mysql8 在linux上安装全过程

参照MYSQL官网官方文档安装 1、mysql官网 mysql官网 2、直接进入文档页 找到安装文档 3、找到自己系统对应的安装文档&#xff0c;选合适的安装方式&#xff0c;我这里使用的是YUM方式 a、开始安装之前需要替换yum仓库 具体步骤如下 b、将下载的文件上传至自己的服务器 如下…

安全(权限)框架Shiro概述及原理

1.1 Shiro是什么 Apache Shiro是一个功能强大且易于使用的Java安全&#xff08;权限&#xff09;框架。Shiro可以完成&#xff1a;认证、授权、加密、会话管理、与Web集成、缓存 等。借助Shiro您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的Web和企业应用…

数据库分片原则和算法

1. 数据分片概念 数据库分片是指将一个大型数据库拆分成多个小型数据库&#xff0c;每个小型数据库称为一个分片。通过这种方式&#xff0c;可以将数据库的负载分散到多个服务器上&#xff0c;从而提升性能瓶颈以及可用性。 数据分片的核心手段就是对关系型数据库进行分库和分表…

【福建事业单位-公共基础-哲学】02唯物辩证法三大规律、认识论、历史唯物主义

【福建事业单位-公共基础-哲学】02唯物辩证法 一、唯物辩证法1.1 对立统一规律方法论 矛盾的不平衡性分析方法论&#xff08;两点论和重点论&#xff09;事物发展的内因和外因 1.1总结1.2 质量互变规律量变和质变的关系 方法论 1.3 否定之否定规律总结 二、认识论2.1实践决定认…

智慧工厂管理系统是什么,有什么好用的智慧工厂管理系统

阅读本文您可以了解&#xff1a;1、智慧工厂管理系统的定义&#xff1b;2、智慧工厂管理系统的作用&#xff1b;3、好用的智慧工厂管理系统推荐 一、智慧工厂管理系统是什么 智慧工厂管理系统是一种利用先进的信息技术&#xff08;如物联网、人工智能、大数据分析等&#xff0…

【C++】做一个飞机空战小游戏(九)——发射子弹的编程技巧

[导读]本系列博文内容链接如下&#xff1a; 【C】做一个飞机空战小游戏(一)——使用getch()函数获得键盘码值 【C】做一个飞机空战小游戏(二)——利用getch()函数实现键盘控制单个字符移动【C】做一个飞机空战小游戏(三)——getch()函数控制任意造型飞机图标移动 【C】做一个飞…

Linux - 借助 inotifywait,轻松实现 Linux 文件/目录事件监听

文章目录 inotify-tools 依赖包使用示例 inotify-tools 依赖包 [rootVM-24-3-centos ~]# yum install inotify-tools Loaded plugins: fastestmirror, langpacks Repository epel is listed more than once in the configuration Determining fastest mirrors ...... ...... ..…

用pytorch实现Resnet

ResNet&#xff08;Residual Network&#xff09;是一种深度卷积神经网络架构&#xff0c;由Kaiming He等人于2015年提出。它在计算机视觉领域引起了革命性的变革&#xff0c;使得训练更深的神经网络成为可能&#xff0c;超越了传统网络架构的限制。 ResNet的主要创新在于…

Matplotlib数据可视化(六)

目录 1.绘制概率图 2.绘制雷达图 3.绘制流向图 4.绘制极坐标图 5.绘制词云图 1.绘制概率图 from scipy.stats import norm fig,ax plt.subplots() plt.rcParams[font.family] [SimHei] np.random.seed() mu 100 sigma 15 x musigma*np.random.randn(437) num_bins …

GUI神器 NXP GUI GUIDER开发工具入门教程

好记性不如烂笔头&#xff0c;既然不够聪明&#xff0c;就乖乖的做笔记&#xff0c;温故而知新。 本文档用于本人对知识点的梳理和记录 目录 一、前言 二、下载 三、演示 四、字体和图片/动画等资源 五、总结 一、前言 GUI Guider是恩智浦为LVGL开发了一个上位机GUI设计工…

初识网络原理(笔记)

目录 ​编辑局域网 网络通信基础 IP 地址 端口号 协议 协议分层 TCP / IP 五层网络模型 网络数据传输的基本流程 发送方的情况&#xff1a; 接收方的情况 局域网 搭建网络的时候&#xff0c;需要用到 交换机 和 路由器 路由器上&#xff0c;有 lan 口 和 wan 口 虽…

涨粉明显,播放暴涨5倍,达人在抖音乘风美拉德

美拉德火了&#xff01; 过去的这个夏天&#xff0c;多巴胺风盛行&#xff0c;无论是街上女孩子们的穿搭&#xff0c;还是店里的陈设&#xff0c;网络上的浏览与讨论&#xff0c;都离不开它。 步入金秋&#xff0c;另一股风刮起。与完美适配夏天五颜六色的多巴胺不同&#xf…

怎么用Python制作一个七夕爱心?

先看效果&#xff1a; 图片效果&#xff1a; 视频效果&#xff1a; 七夕代码效果展示 代码介绍&#xff1a; 这段代码是实现一个用 tkinter 库绘制动态爱心的程序。 用到一些数学函数和常量&#xff0c;例如&#xff1a;sin, cos, pi, log 等等。 定义一个 Heart 类&#x…