4-2非阻塞型IO

4-2 非阻塞型IO

1、阻塞方式是文件读写操作的默认方式,但应用程序员可通过使用O_NONBLOCK标志来人为的设置读写操作为非阻塞方式(该标志定义在<linux/fcntl.h>中,在打开文件时指定)。

2、如果设置了O_NONBLOCK标志,readwrite的行为是不相同的。如果进程在没有数据就绪时,调用了read,或者在缓冲区没有空间时调用了write,系统只是简单地返回-EAGAIN,而不会阻塞进程。

3、调用进程显示的指明不想阻塞。

4、设置filp->flag|=O_NONBLOCK

//应用程序以非阻塞I/O的方式从串口驱动读取一字符

int fd;

char buf;

fd=open(“/dev/ttySAC0”,O_RDWR|O_NONBLOCK);//属性:可读可写,非阻塞方式访问。

……

while(read(fd,&buf,1)!=1) ; //串口上无输出也返回,所以要循环尝试读取串口

  printf(“%c\n”,buf);

 

pollselect

5pollselect都允许进程决定是否可以对一个或多个打开的文件做非阻塞的读取或写入。

6、这些调用也会阻塞进程,知道给定的文件描述符集中的任何一个可读取或写入。

7、常用于那些要使用多个输入或输出流而要不会阻塞于其中任何一个留的应用程序中。

8select-BSD Unix中引入

9poll-AT&T Unix System V引入

10、都是调用驱动程序的poll来实现。

    unsigned int (*poll) (struct file* file,poll_table* wait);//返回可以立即执行操作的位掩码。

    //<linux/poll.h>中声明,驱动程序不需要了解该结构的细节。

11poll函数负责完成两个步骤:

    11.1在一个或多个可只是poll状态变化的等待队列上调用poll_wait.

          如果当前没有文件描述符可用来执行I/O,则内核将使进程在传递到该系统调用的所有文件描述符对应的等地啊队列上等待。

          Void poll_wait(struct file*,wait_queue_head_t*,poll_table*)

          //即:使用pool_wait将等待队列添加到poll_table中。

    11.2返回一用来描述操作是否可以立即无阻塞执行的位掩码。

12、位掩码

12.1 <linux/poll.h>定义poll位掩码

12.2 POLLIN 设备可读

12.3 POLLRDNORM 数据可读(“normal” data is available for reading

12.4 POLLOUT 设备可写

12.5 POLLWRNORM 数据可写 ”normal” data is available for writing

12.6一般设备可读返回:POLLIN|POLLRDNORM

12.7一般设备可写返回:POLLIN|POLLWRNORM

       

 

13select系统调用用于多路监控,当没有一个文件满足要求时,select将阻塞调用进程。

    int select(int maxfd, fd_set *readfdsfd_set *writefds,fd_set *exceptfds,struct timeval *timeout);

   13.1 struct timeval

     {

       int tv_sec;//

       int tv_usec;//微秒

      }

    13.2 maxfd:文件描述符范围,比待检测的最大文件描述符大1

    13.3 readfds:被读监控的文件描述符集

    13.4 writefds:被写监控的文件描述符集

    13.5 exceptfds:被异常监控的文件描述符集

    13.6 timeout:定时器。

    13.7timeout取不同的值,该调用有不同的表现:

        Timeout值为0,不管是否有文件满足要求,都立刻返回,无文件满足要求是返回0,有文件满足要求返回一个正值。

        TimeoutNULLselect将阻塞进程,知道某个文件满足要求

        Timeout值为正整数,就是等地啊的最长时间,即selecttimeout时间内阻塞进程。

14select调用返回时,返回值有如下情况:

     正常情况下返回满足要求的文件描述符个数;

经过了timeout等待后热无文件满足要求,返回值为0

如果select被某个信号中断,它将返回-1并设置errnoEINTR

如果出错,返回-1并设置相应的errno.

15select系统调用(使用方法)

15.1 将要监控的文件添加到文件描述符集

15.2 调用select开始监控

15.3 判断文件是否发生变化。

16、系统提供4个宏对描述符集进行操作:

FD_ZERO(fd_set* set);//清除一个文件描述符

FD_SET(int fd,fd_set *set);//将一个文件描述符加入文件描述符集中。

FD_CLR(int fd,fd_set* set);//将一个文件描述符从文件描述符集中清除。

FD_ISSETint fd,fd_set* set;判断文件描述符是否被置位。

 

声明:本文非原创,整理自申嵌

成都市作为中国西部地区具有战略地位的核心都市,其人口的空间分布状况对于城市规划、社会经济发展及公共资源配置等研究具有基础数据价值。本文聚焦于2019年度成都市人口分布的空间数据集,该数据以矢量格式存储,属于地理信息系统中常用的数据交换形式。以下将对数据集内容及其相关技术要点进行系统阐述。 Shapefile 是一种由 Esri 公司提出的开放地理空间数据格式,用于记录点、线、面等几何要素。该格式通常由一组相互关联的文件构成,主要包括存储几何信息的 SHP 文件、记录属信息的 DBF 文件、定义坐标系统的 PRJ 文件以及提供快速检索功能的 SHX 文件。 1. **DBF 文件**:该文件以 dBase 表格形式保存与各地理要素相关联的属信息,例如各区域的人口统计数值、行政区划名称及编码等。这类表格结构便于在各类 GIS 平台中进行查询与编辑。 2. **PRJ 文件**:此文件明确了数据所采用的空间参考系统。本数据集基于 WGS84 地理坐标系,该坐标系在全球范围内广泛应用于定位与空间分析,有助于实现跨区域数据的准确整合。 3. **SHP 文件**:该文件存储成都市各区(县)的几何边界,以多边形要素表示。每个多边形均配有唯一标识符,可与属表中的相应记录关联,实现空间数据与统计数据的联结。 4. **SHX 文件**:作为形状索引文件,它提升了在大数据集中定位特定几何对象的效率,支持快速取与显示。 基于上述数据,可开展以下几类空间分析: - **人口密度评估**:结合各区域面积与对应人口数,计算并比较人口密度,识别高密度与低密度区域。 - **空间集聚识别**:运用热点分析(如 Getis-Ord Gi* 统计)或聚类算法(如 DBSCAN),探测人口在空间上的聚集特征。 - **空间相关检验**:通过莫兰指数等空间自相关方法,分析人口分布是否呈现显著的空间关联模式。 - **多要素叠加分析**:将人口分布数据与地形、交通网络、环境指标等其他地理图层进行叠加,探究自然与人文因素对人口布局的影响机制。 2019 年成都市人口空间数据集为深入解析城市人口格局、优化国土空间规划及完善公共服务体系提供了重要的数据基础。借助地理信息系统工具,可开展多尺度、多维度的定量分析,从而为城市管理与学术研究提供科学依据。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模(Matlab代码实现)内容概要:本文介绍了名为《【顶级EI复现】计及连锁故障传播路径的电力系统 N-k 多阶段双层优化及故障场景筛选模(Matlab代码实现)》的技术资源,重点围绕电力系统中连锁故障的传播路径展开研究,提出了一种N-k多阶段双层优化模,并结合故障场景筛选方法,用于提升电力系统在复杂故障条件下的安全与鲁棒。该模通过Matlab代码实现,具备较强的工程应用价值学术参考意义,适用于电力系统风险评估、脆弱分析及预防控制策略设计等场景。文中还列举了大量相关的科研技术支持方向,涵盖智能优化算法、机器学习、路径规划、信号处理、电力系统管理等多个领域,展示了广泛的仿真与复现能力。; 适合人群:具备电力系统、自动化、电气工程等相关背景,熟悉Matlab编程,有一定科研基础的研究生、高校教师及工程技术人员。; 使用场景及目标:①用于电力系统连锁故障建模与风险评估研究;②支撑高水平论文(如EI/SCI)的模复现与算法验证;③为电网安全分析、故障传播防控提供优化决策工具;④结合YALMIP等工具进行数学规划求解,提升科研效率。; 阅建议:建议者结合提供的网盘资源,下载完整代码与案例进行实践操作,重点关注双层优化结构与场景筛选逻辑的设计思路,同时可参考文档中提及的其他复现案例拓展研究视野。
<think>首先,用户的问题是:“我想理解阻塞IO非阻塞轮询IO异步通知之间的区别请问阻塞IO非阻塞轮询IO异步通知区别”。用户明确要求理解阻塞IO非阻塞轮询IO异步通知的区别。我需要根据系统级指令来构建回答:1.**行内数学表达式**:使用`$...$`格式。但用户的问题是关于IO操作的,可能不涉及数学表达式,所以我会避免不必要的数学。如果有变量或公式,才使用。2.**独立公式**:必须使用`$$...$$`并单独成段。同样,IO操作可能不需要公式,但如果有,我会应用。3.**LaTeX语法正确**:确保任何LaTeX代码正确无误。4.**使用中文回答**:整个回答必须用中文。5.**生成相关问题**:在回答结束后,添加相关问题部分,以“§§相关问题§§”开头。6.**引用标识**:在引用的段落末尾自然地添加引用标识,如`[^1]`。我有提供的引用,所以我需要在回答中引用它们。参考的引用:-[^1]:解释了同步IO异步IO的区别。同步IO包括阻塞、非阻塞等模,异步IO是操作系统完成后通知用户。-[^2]:讨论了异步IO通常配合非阻塞IO使用,应用程序发起请求后继续执行。-[^3]:澄清了非阻塞IO的定义,指出它仍然是同步IO-[^4]:提供了Linux驱动开发中的阻塞IO非阻塞IO示例代码。-[^5]:讨论了非阻塞IO的实现,涉及poll函数等待队列。用户的问题具体是:阻塞IO非阻塞轮询IO(即非阻塞IO使用轮询)、异步通知的区别。关键点:-**阻塞IO**:当应用程序发起IO操作时,进程被阻塞,直到操作完成。例如,在取数据时,进程等待数据准备好。-**非阻塞轮询IO**:应用程序发起IO操作后立即返回,不会阻塞。应用程序需要轮询(如使用select、poll、epoll)来检查IO操作是否完成。这属于同步非阻塞IO-**异步通知**:应用程序发起IO操作后立即返回。操作系统在操作完成后主动通知应用程序(如通过回调、信号)。这属于异步IO。从引用中:-[^1]说同步IO包括阻塞IO非阻塞IO(轮询)、IO复用等,都是阶段二阻塞的。异步IO是操作系统完成IO后通知用户。-[^2]提到异步IO通常配合非阻塞IO使用。-[^3]强调非阻塞IO仍然是同步的。-[^4][^5]提供代码示例。现在,构建回答结构:1.**开头**:简要介绍主题。2.**逐步解释**:清晰定义每个概念。-阻塞IO-非阻塞轮询IO(即非阻塞IO-异步通知(即异步IO)3.**比较区别**:使用表格或列表来清晰展示区别。4.**引用支持**:在解释中自然地引用提供的引用。5.**结尾**:总结。然后,生成相关问题。确保回答真实可靠,基于引用。回答结构:-用中文。-保持清晰、逻辑强。最终,添加相关问题部分。</think>### 阻塞IO非阻塞轮询IO异步通知的区别 理解阻塞IO非阻塞轮询IO异步通知之间的区别,对于设计优化高能应用程序(如网络服务或文件处理)至关重要。这些概念涉及输入输出(IO)操作的处理方式,核心在于应用程序在等待IO完成时的行为模式。我将基于Linux/Unix系统环境,逐步解释每个概念的定义、工作机制优缺点,并引用权威资料确保准确。以下是详细分析: #### 1. **阻塞IO (Blocking IO)** - **定义**:当应用程序发起IO操作(如取文件或网络数据)时,进程会被阻塞(暂停执行),直到IO操作完成才返回结果。这期间,进程无法执行其他任务。 - **工作机制**: - 应用程序调用系统调用(如 `read()` 或 `write()`),内核将进程置于休眠状态。 - 内核等待数据准备好(例如,数据从磁盘加载到内核缓冲区),然后将数据复制到用户空间。 - 完成后,进程被唤醒并继续执行。 - 示例:在Linux驱动中,使用等待队列(wait queue)实现阻塞,进程状态变为 `TASK_INTERRUPTIBLE` 并调用 `schedule()` 让出CPU[^4]。 - **优点**:实现简单,代码易于编写。 - **缺点**:效率低下,因为进程在等待期间浪费CPU时间;在高并发场景下可能导致系统瓶颈。 - **引用支持**:阻塞IO属于同步IO的一种,提交IO后进程必须等待操作完成[^1]。 #### 2. **非阻塞轮询IO (Non-blocking Polling IO)** - **定义**:应用程序发起IO操作后立即返回(不阻塞),但IO操作可能未完成。应用程序需要主动轮询(反复检查)内核状态,以确定操作是否完成。这本质上是同步非阻塞IO- **工作机制**: - 应用程序设置文件描述符为非阻塞模式(如使用 `O_NONBLOCK` 标志)。 - 调用系统调用(如 `read()`)时,内核立即返回状态:如果数据未准备好,返回错误码(如 `EAGAIN`)。 - 应用程序通过轮询机制(如 `select()`、`poll()` 或 `epoll()`)定期检查IO状态。一旦数据就绪,进程再发起实际取操作(该取操作本身是短暂的阻塞)。 - 示例:在Linux驱动中,`poll` 函数用于非阻塞IO,进程可能短暂休眠在等待队列中,但通过轮询快速唤醒[^5]。 - **优点**:进程在等待期间可以执行其他任务,提高资源利用率;适合高并发场景。 - **缺点**:轮询消耗额外CPU资源;代码复杂度较高,需要处理重试逻辑。 - **引用支持**:非阻塞IO仍属于同步IO,因为数据复制阶段(内核到用户空间)是短暂的阻塞[^3]。异步IO通常配合非阻塞IO使用,但非阻塞轮询本身不是异步[^2]。 #### 3. **异步通知 (Asynchronous Notification)** - **定义**:应用程序发起IO操作后立即返回,内核在操作完成后主动通知应用程序(如通过回调函数或信号)。整个过程不阻塞应用程序,属于异步IO- **工作机制**: - 应用程序发起异步请求(如Linux的 `aio_read()` 或信号驱动IO)。 - 内核在后台执行IO操作,应用程序继续执行其他代码。 - 完成后,内核通过事件通知机制(如信号 `SIGIO` 或完成队列)告知应用程序,应用程序再处理结果。 - 示例:在异步IO中,操作系统负责整个IO过程,用户进程无需轮询[^1]。 - **优点**:最高效,应用程序无任何等待或轮询开销;适合大规模IO密集应用(如Web服务器)。 - **缺点**:实现复杂,需要操作系统支持(如Linux的AIO或Windows IOCP);错误处理更困难。 - **引用支持**:异步IO在第②阶段(数据复制)不阻塞,由操作系统完成后通知用户,这与同步IO有本质区别[^1]。异步通知通常与非阻塞IO配合,但本身是独立机制[^2]。 #### 关键区别总结 下表概括了三者的核心差异,基于操作阶段(IO请求、数据准备数据复制): | 特 | 阻塞IO | 非阻塞轮询IO | 异步通知 | |---------------------|---------------------------|---------------------------|--------------------------| | **阻塞行为** | 全程阻塞进程 | 请求不阻塞,但轮询数据复制短暂阻塞 | 完全不阻塞进程 | | **应用程序参与方式** | 被动等待 | 主动轮询状态 | 被动接收通知 | | **效率** | 低效(CPU闲置) | 中等(轮询开销) | 高效(无等待开销) | | **复杂度** | 简单 | 中等 | 复杂 | | **适用场景** | 低并发简单应用 | 中等并发(如Web服务器) | 高并发实时系统(如数据库) | | **同步/异步分类** | 同步IO | 同步IO非阻塞) | 异步IO | - **核心区别点**: - **阻塞 vs 非阻塞**:阻塞IOIO操作期间完全挂起进程;非阻塞轮询IO在请求阶段不阻塞,但后续操作需应用程序介入;异步通知全程无阻塞。 - **同步 vs 异步**:阻塞IO非阻塞轮询IO都属于同步IO(因为应用程序需主动参与数据复制阶段);异步通知是异步IO(内核全权处理,完成后通知)[^1][^3]。 - **轮询 vs 通知**:非阻塞轮询IO依赖应用程序轮询,而异步通知由内核主动推送事件。 #### 实际应用示例 - **阻塞IO**:适用于简单脚本或命令行工具,如 `cat` 命令取文件。 - **非阻塞轮询IO**:在Nginx或Node.js中使用 `epoll` 处理高并发连接。 - **异步通知**:在数据库系统(如Redis)或高能网络框架(如libuv)中使用AIO提升吞吐量。 总结来说,阻塞IO简单但低效,适合小规模任务;非阻塞轮询IO通过轮询提升并发能力,但增加开销;异步通知提供最佳能,但实现复杂。选择哪种模式取决于应用需求:优先效率用异步通知,平衡并发用非阻塞轮询,简化开发用阻塞IO[^1][^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdliweibing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值