IO多种概念

day36-多路IO复用 比如我现在用的电脑,需要同时处理键盘鼠标的输入、中断信号等等事件,再比如web服务器如nginx,需要同时处理来来自N个客户端的事件。逻辑控制流在时间上的重叠叫做 并发(时间段是并行,但时间点上是串行的)并行:在一个时间点上同时运行。而CPU单核在同一时刻只能做一件事情,一种解决办法是。 阅读详情

重要概念

同步、异步

函数或方法被调用的时候,调用者是否得到最终结果的

  • 直接得到最终结果的,就是同步调用
  • 不直接得到最终结果的,就是异步调用

阻塞、非阻塞

函数或方法调用的时候,是否立刻返回

  • 立即返回就是非阻塞调用
  • 不立即返回就是阻塞调用

区别

同步、异步,与阻塞、非阻塞不相关
同步、异步强调的是,是否得到(最终的)结果
阻塞、非阻塞强调是时间,是否等待

同步与异步区别在于:调用者是否得到了想要的最终结果
同步就是一直要执行到返回最终结果
异步就是直接返回了,但是返回的不是最终结果。调用者不能通过这种调用得到结果,以后可以通过被调用者提供的某种方式(被调用着通知调用者、调用者反复查询、回调),来取回最终结果

阻塞与非阻塞的区别在于,调用者是否还能干其他事
阻塞,调用者就只能干等
非阻塞,调用者可以先去忙会别的,不用一直等

联系

同步阻塞,我啥事不干,就等你打饭打给我。打到饭是结果,而且我啥事不干一直等,同步加阻塞
同步非阻塞,我等着你打饭给我,但我可以玩会手机、看看电视。打饭是结果,但是我不一直等

异步阻塞,我要打饭,你说等叫号,并没有返回饭给我,我啥事不干,就干等着饭好了你叫我。例如,取了号什么不干就等叫自己的号
异步非阻塞,我要打饭,你给我号,你说等叫号,并没有返回饭给我,我在旁边看电视、玩手机,饭打好了叫我

操作系统知识

在386之前,CPU工作在实模式下,之后,开始支持保护模式,对内存进行了划分
X86 CPU有4种工作级别:

  • Ring0级,可以执行特权指令,可以访问所有级别数据,可以访问IO设备等
  • Ring3级,级别最低,只能访问本级别数据

内核代码运行在Ring0,用户代码运行在Ring3

现代操作系统采用虚拟存储器,理论上,对于32位系统来说,进程对虚拟内存地址的内存寻址空间为4G(2^32)
64位操作系统理论上最大内存寻址空间(2^64)
操作系统中,内核程序独立且运行在较高的特权级别上,它们驻留在被保护的内存空间上,拥有访问硬件设备的所有权限,这部分内存称为内核空间(内核态,最高地址1G)

普通应用程序运行在用户空间(用户态)

应用程序想访问某些硬件资源就需要通过操作系统提供的系统调用,系统调用可以使用特权指令运行在内核空间,此时进程陷入内核态运行。系统调用完成,进程将回到用户态执行用户空间代码
在这里插入图片描述

同步IO、异步IO、IO多路复用

IO两个阶段

IO过程分两阶段:

  1. 数据准备阶段
  2. 内核空间复制回用户空间进程缓冲区阶段

发生IO的时候:

  1. 内核从IO设备读、写数据(淘米,把米放饭锅里煮饭)
  2. 进程从内核复制数据(盛饭,从内核这个饭锅里面把饭装到碗里来)

系统调用——read函数

IO模型

同步IO

  • 同步IO模型包括 阻塞IO、非阻塞IO、IO多路复用、信号驱动IO
阻塞IO
  • 进程等待(阻塞),直到读写完成。(全程等待)
    在这里插入图片描述
    在这里插入图片描述
非阻塞IO

进程调用read操作,如果IO设备没有准备好,立即返回ERROR,进程不阻塞。用户可以再次发起系统调用,如果内核已经准备好,就阻塞,然后复制数据到用户空间

  • 第一阶段数据没有准备好,就先忙别的,等会再来看看。检查数据是否准备好了的过程是非阻塞的
  • 第二阶段是阻塞的,即内核空间和用户空间之间复制数据是阻塞的

例:淘米、蒸饭我不等,我去玩会,盛饭过程我等着你装好饭,但是要等到盛好饭才算完事,这是同步的,结果就是盛好饭
在这里插入图片描述
在这里插入图片描述

IO多路复用

所谓IO多路复用,就是同时监控多个IO,有一个准备好了,就不需要等了开始处理,提高了同时处理IO的能力

  • select几乎所有操作系统平台都支持,poll是对的select的升级
  • epoll,Linux系统内核2.5+开始支持,对select和poll的增强,在监视的基础上,增加回调机制。BSD、Mac平台有kqueue,Windows有iocp

以select为例

  • 将关注的IO操作告诉select函数并调用,进程阻塞,内核“监视”select关注的文件描述符fd,被关注的任何一个fd对应的IO准备好了数据,select返回。再使用read将数据复制到用户进程

select举例

  • 食堂供应很多菜(众多的IO),你需要吃某三菜一汤,大师傅(操作系统)说要现做,需要等,你只好等待大师傅叫。其中一样菜好了,大师傅叫你,说你点的菜有好的了,你得自己遍历找找看哪一样才好了,请服务员把做好的菜打给你
  • epoll是有菜准备好了,大师傅喊你去几号窗口直接打菜,不用自己找菜了

一般情况下,select最多能监听1024个fd(可以修改,但不建议改),但是由于select采用轮询的方式,当管理的IO多了,每次都要遍历全部fd,效率低下
epoll没有管理的fd的上限,且是回调机制,不需遍历,效率很高
在这里插入图片描述
在这里插入图片描述

信号驱动IO

进程在IO访问时,先通过sigaction系统调用,提交一个信号处理函数,立即返回。进程不阻塞
当内核准备好数据后,产生一个SIGIO信号并投递给信号处理函数。可以在此函数中调用recvfrom函数操作数据从内核空间复制到用户空间,这段过程进程阻塞
在这里插入图片描述

异步IO

  • 进程发起异步IO请求,立即返回。内核完成IO的两个阶段,内核给进程发一个信号。

举例

  • 来打饭,跟大师傅说饭好了叫你,饭菜准备好了,窗口服务员把饭盛好了打电话叫你。两阶段都是异步的。在整个过程中,进程都可以忙别的,等好了才过来。
  • 今天不想出去到饭店吃饭了,点外卖,饭菜在饭店做好了(第一阶段),快递员从饭店送到你家门口(第二阶段)。

Linux的aio的系统调用,内核从版本2.6开始支持
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 前4个都是同步IO,因为核心操作recv函数调用时,进程阻塞直到拿到最终结果为止。
  • 而异步IO进程全程不阻塞
IO的分类 I:从文件中拷贝数据到内存中去。O:从内存中拷贝数据到文件中去。 阅读详情

相关推荐

Python - io 模块

文章目录关于 io 模块1、文本 I/O2、二进制(字节) I/O3、原始 I/O二、文本编码格式选择性的 EncodingWarning三、高阶模块接口四、类的层次结构1、I/O 基类class `io.IOBase`class `io.RawIOBase`class `io.BufferedIOBase`2、原始文件 I/Oclass `io.FileIO`3、缓冲流class `io.BytesIO`class `io.BufferedReader`class `io.BufferedWriter`c

AI工程化、开源分享、文档翻译、代码笔记 5135

Python基础之:Python中的IO

IO就是输入和输出,任何一个程序如果和外部希望有交互的话,都需要使用到IO。相对于java而言,Python中的IO更加的简单,易用。 本文将会详细介绍Python中的IO操作。

程序那些事 6020

全面解析单片机IO口设计与应用

在单片机系统中,IO口(输入/输出口)是连接外部世界和微控制器内部电路的重要桥梁。它可以用于读取外部传感器信号、控制LED指示灯、驱动继电器等。IO口的输出模式是单片机与外部世界进行交互的重要方式之一。在输出模式下,单片机的IO口能够驱动外部设备,如LED灯、继电器、电机等。输出模式的主要功能是控制这些外围设备的开关状态或者调节它们的工作状态。例如,当IO口输出高电平时,可以点亮一个LED灯;输出低电平时,则熄灭LED灯。此外,输出模式还能实现简单的信号发送功能,比如产生方波信号驱动蜂鸣器发声。

weixin_30591519的博客 1666

IO概念

IO概念和五种IO模型 一、什么是IO? 我们都知道unix世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据、系统调用read、写入数据、系统调用write、不过话说回来了、计算机...

qq_38797886的博客 3413

博途 V15.1安装步骤

温馨提醒:安装此软件电脑配置至少应满足以下要求 处理器 CoreTM i5-3320M 3.3 GHz 或相当 内存 至少8G 硬盘 300 GB SSD 显示器 15.6' 宽屏显示 (1920 x 1080) 1.双击打开【Siemens v15.1】文件夹。 2.鼠标右击【STEP 7 BasicProfess...

谢谢关注“小鱼教你模数电”,各平台同号 9万+

USB接口ESD防护设计实战:从金属外壳到信号线的完整避坑指南

本文深入探讨USB接口ESD防护设计的实战要点,聚焦金属外壳作为ESD能量泄放关键通道的处理策略。文章详细解析了从外壳接地路径控制、信号线TVS管选型与布局,到PCB分区及电源线滤波等完整设计流程,旨在帮助硬件工程师构建系统级防护,避免常见设计误区,确保产品通过严苛的静电测试。

k8l9m0n的博客 481

Python教程(十五):IO 编程

IO是的缩写,即输入和输出。在编程中,IO操作包括从用户那里获取输入(如键盘输入)和向用户发送输出(如屏幕显示或文件写入)。IO编程是Python编程中的一个重要组成部分。从简单的标准IO到复杂的文件和网络IO,Python提供了丰富的功能和库来支持各种IO操作。掌握这些技能,可以帮助你构建更加强大和灵活的应用程序。

前端探索者 2850

智慧楼宇解决方案-全套大合集

智慧楼宇解决方案,楼宇能耗-环境-设备统一管控解决方案。

byte58的博客 2590

典型的一次IO的两个阶段是什么?阻塞、非阻塞、同步、异步

而异步,是把sockfd,buf和一个信号或回调的通知方式告知内核,内核将数据拷贝到buf,这个过程应用程序不参与,可以去做其他事情,拷贝完成后,内核根据这个通知方式告知应用程序,这个操作就是异步。如果数据就绪,开始进行读写,应用程序这边的recv会花自己的时间,从内核缓冲区中读数据,拷贝到recv的buf里,这个过程应用程序是一直等待拷贝完成的,完不成就一直阻塞在那个位置,所以是同步操作。A操作告诉B操作它感兴趣的事件以及通知方式,A操作继续执行自己的业务逻辑了;典型的一次IO的两个阶段是什么?.....

Sauron7i的博客 693

华科软院研究生第一学期的事项(奖学金、学业、考试等)

奖助 研究生补助 每月500,全年共6000元 每个月月底学院会打到银行卡里 碰上开学、过年会延后发放 17年10月底发了9、10两个月的钱 18年3月底发了2、3月的钱 学业奖学金 17届全日制每人都有 按照考研最后综合成绩排名 前16 10000 前80 8000 其他 4000 大概11月底发 注意:第一年如果有挂科的话,第二年就不能参加学业奖学金评...

sjdeak的博客 3705

OCV/AOCV/SOCV的介绍和应用

library中的cell delay是在某个固定的PVT(operating condition)下仿真得出的。,cell的delay并不是一个固定值,而是一个随机值,遵循高斯分布或门特卡洛分布,在STA中用OCV来模拟这一『特征』。OCV全称on chip variation,用于描述不同管子间由于工艺偏差、电压降、温度变化引起的delay变化。,也用于描述工艺偏差引起的net厚度宽度的变化从而导致net的电容电阻变化。优点:设置起来比较简单粗暴,对于不那么先进的工艺可行!的影响,更贴合实际。

m0_61003348的博客 8979

IO进程的简单学习

当要使用别人的函数的时候除了包含头文件还要有库linux系统存储库的位置一般在/lib或/usr/lib。

weixin_66022605的博客 802

Python Opencv cv2提取图像中某种特定颜色区域(例如黑字白纸背景下的红色公章提取),并将纯色背景透明化

拜拜PHOTOSHOP- 领导突然让我帮他把公章从图片中抠出来,在确保了不是要做坏事的情况下,我打开了PHOTOSHOP,用魔棒工具一点一点抠,但由于魔棒工具的原理是对比临近区域像素差值,导致封闭字体中的区域无法剔除,而且一点一点抠非常麻烦,愤而PYTHON,使用CV2完美解决。 效果如下(马赛克是我添加的): 任务就是把蓝色的公章抠出来。 效果如上。 代码如下: import cv2 import numpy as np src = cv2.imread(r"imagepath")#这里填你的原图像路

qq_43670549的博客 1万+

五种网络IO模型

首先我们了解一下文件描述符是什么:在linux下一切皆文件,进程是通过文件描述符(file descriptors)来访问文件的,。默认有三个文件描述符:0(标准输入),1(标准输出),2(标准错误)。再打开一个新的文件的话,它的文件描述符就++。

qq_60924211的博客 649

【GameFramework框架】三、快速启动

这篇文章就带领大家如何快速启动GameFramework框架。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 4424

自动驾驶大模型---小米&华科的ORION端到端方案

本文介绍了小米汽车与华中科技大学联合开发的ORION自动驾驶端到端方案。该框架创新性地将视觉语言模型(VLM)与自动驾驶系统结合,包含QT-Former特征提取模块、大语言模型(LLM)推理模块和生成式规划器三大核心组件。通过视觉感知与语言理解的深度融合,ORION能更准确地理解人类指令并生成合理轨迹,同时提升系统的可解释性。实验证明,该方案在准确性、泛化能力和决策透明度方面均有显著优势。ORION框架为自动驾驶技术提供了新思路,有望推动行业向更安全、智能的方向发展。

智能汽车人的博客 2005

IO

1 基本概念         IO操作是程序设计里的一个重头戏,尤其是在Linux中,管道、网络等设备都看成了文件描述符,因此IO对于Linux程序设计更加重要。近年来,随着Nginx、lighttpd等新型高性能web服务器的广泛使用,其内部采用的epoll、异步IO等IO模型逐渐走入了人们的视野。本文将探究Linux各个IO模型的来龙去脉、基于原理与相互之间的联系,并进行IO效率与性能的

u013322907的专栏 431

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

python并发编程之IO模型

1.补充知识: 1.1 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义, 其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候, 特指那些需要其他部件协作或者需要一定时间完成的任务。 #举例: multiprocessing.Pool下....

生有涯,知无涯 348

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

非阻塞IO(IO多路复用)

/增加非阻塞属性 //flag = flag & ~O_NONBLOCK;4.select只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)4.poll只能工作在水平触发模式(低速模式)无法工作在边沿触发模式(高速模式)2.select监听的文件描述符集合在用户层,需要应用层和内核层互相传递数据。3.epoll会直接获得产生事件的文件描述符的信息,而不需要遍历检测。nfds:监测的文件描述符上限值(最大文件描述符的值+1)

m0_63793814的博客 1154

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java-IO流概念(网络摘取随笔)

一、IO流的概念        Java中对文件的操作是以流的方式进行的。流是Java内存中的一组有序数据序列。Java将数据从源(文件、内存、键盘、网络)读入到内存中,形成了流,然后将这些流还可以写到另外的目的地(文件、内存、控制台、网络),之所以称为流,是因为这个数据序列在不同时刻所操作的是源的不同部分。 二、IO流的分类 Java中的流,可以从不同的角度进行分类。 按照数据流的方向不...

gaofengyan的博客 293

关于IO

关于IO IO 接口,设备 由 农夫一号 发表于 十月 21st, 2011IO这个词出现太多了太多了,这里整理一下思路。计算机由控制单元,运算单元,存储单元,输入设备输出设备组成。其中IO指的就是输入输出。关于IO又有接口,设备,操作的概念: 参见http://...

74

IO进程学习笔记完整版

I:input 输入O:output 输出对文件的输入和输出 输入-》写文件,将文件中的内容写到内存中去输出-》读文件,将内存中的内容读取到文件中linux下一切皆文件文件类型(bcd-lsp)

2403_88313638的博客 1155

[Linux] Linux IO模式及 select、poll、epoll详解

注:本文是对众多博客的学习和总结,可能存在理解错误。请带着怀疑的眼光,同时如果有错误希望能指出。 同步IO和异步IO,阻塞IO和非阻塞IO分别是什么,到底有什么区别?不同的人在不同的上下文下给出的答案是不同的。所以先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。 一、概念说明 用户空间和内核空间 进程切换 进程的阻塞 文件描述符 缓存 I/O 用户空间...

zkp_java的专栏 483

Java-IO流基础

当程序需要读取数据源的数据时,就会通过IO流对象开启一个通向数据源的流,通过这个IO流对象的相关方法可以顺序读取数据源中的数据。IO流相当于一个管道。

2402_88479893的博客 1106

java IO流学习总结

学习了几天的java IO流,下面我来谈谈对java 输入输出流IO的个人见解吧! 转载自:https://blog.youkuaiyun.com/zhaoyanjun6/article/details/54292148/ java流类结构图 一.流的概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。它的特性是进行数据传输; 例如从水源地长江把水导入自来水厂,然后又从自...

coder150806的博客 5万+

五种IO模型

阻塞IO模型 在内核将数据准备好之前, 进程将会一直等待, 直到内核将数据全部准备好 非阻塞IO模型 如果数据还没有准备好, 内核将会向当前进程返回一个 EWOULDBLOCK 错误码, 同时当前进程会不断的进行返回, 轮询式的取检查是否有数据准备好 信号驱动模型 要想实现信号驱动模型, 必须在之前给当前进程注册一个 SIGACTION 信号, 然后返回, 当内核中数据到达的时候...

qq_41027326的博客 280
上一篇: Python --网络编程(SocketServer模块)
下一篇: Python 中 IO多路复用
鹿夏
博客等级 码龄8年 24粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值