同步 异步 阻塞 非阻塞 的概念

转自:http://blog.chinaunix.net/uid-26000296-id-3754543.html

简介: 
Linux? 中最常用的输入/输出(I/O)模型是同步 I/O。
在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。
这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。
但是在某些情况中,I/O 请求可能需要与其他进程产生交叠(并行)。
可移植操作系统接口(POSIX)异步 I/O(AIO)应用程序接口(API)就提供了这种功能。
在本文中,我们将对这个 API 概要进行介绍,并来了解一下如何使用它。

一、AIO 简介
Linux 异步 I/O 是 Linux 内核中提供的一个相当新的增强。
它是 2.6 版本内核的一个标准特性,但是我们在 2.4 版本内核的补丁中也可以找到它。
AIO 背后的基本思想是允许进程发起很多 I/O 操作,而不用阻塞或等待任何操作完成。
稍后或在接收到 I/O 操作完成的通知时,进程就可以检索 I/O 操作的结果。

二、I/O 模型
在深入介绍 AIO API 之前,让我们先来探索一下 Linux 上可以使用的不同 I/O 模型。
这并不是一个详尽的介绍,但是我们将试图介绍最常用的一些模型来解释它们与异步 I/O 之间的区别。
图 1 给出了同步和异步模型,以及阻塞和非阻塞的模型。

图 1. 基本 Linux I/O 模型的简单矩阵

 
每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序都有自己的优点。
本节将简要对其一 一进行介绍。

三、I/O 密集型与 CPU 密集型进程的比较
I/O 密集型进程所执行的 I/O 操作       >  执行的处理操作。
CPU 密集型的进程所执行的处理操作  >  I/O 操作。
Linux 2.6 的调度器实际上更加偏爱 I/O 密集型的进程,
因为它们通常会发起一个 I/O 操作,然后进行阻塞,这就意味着其他工作都可以在两者之间有效地交错进行。

四、同步阻塞 I/O
最常用的一个模型是同步阻塞 I/O 模型。
在这个模型中,用户空间的应用程序执行一个系统调用,这会导致应用程序阻塞。
这意味着应用程序会一直阻塞,直到系统调用完成为止(数据传输完成或发生错误)。
调用应用程序处于一种不再消费 CPU 而只是简单等待响应的状态,因此从处理的角度来看,这是非常有效的。
图 2 给出了传统的阻塞 I/O 模型,这也是目前应用程序中最为常用的一种模型。
其行为非常容易理解,其用法对于典型的应用程序来说都非常有效。
steps:
a. 在调用 read 系统调用时,应用程序会阻塞并对内核进行上下文切换。
b. 然后会触发读操作,
c. 当响应返回时(从我们正在从中读取的设备中返回),数据就被移动到用户空间的缓冲区中。
d. 然后应用程序就会解除阻塞(read 调用返回)。
图 2. 同步阻塞 I/O 模型的典型流程

从应用程序的角度来说,read 调用会延续很长时间。
实际上,在内核执行读操作和其他工作时,应用程序的确会被阻塞。

五、同步非阻塞 I/O
同步阻塞 I/O 的一种效率稍低的变种是同步非阻塞 I/O。
在这种模型中,设备是以非阻塞的形式打开的。
这意味着 I/O 操作不会立即完成,read 操作可能会返回一个错误代码,
说明这个命令不能立即满足(EAGAIN 或 EWOULDBLOCK),如图 3 所示。

图 3. 同步非阻塞 I/O 模型的典型流程
 
非阻塞的实现是 I/O 命令可能并不会立即满足,需要应用程序调用许多次来等待操作完成。
这可能效率不高,
因为在很多情况下,当内核执行这个命令时,应用程序必须要进行忙碌等待,直到数据可用为止,
或者试图执行其他工作。
正如图 3 所示的一样,这个方法可以引入 I/O 操作的延时,
因为数据在内核中变为可用到用户调用 read 返回数据之间存在一定的间隔,这会导致整体数据吞吐量的降低。

六、异步阻塞 I/O
另外一个阻塞解决方案是带有阻塞通知的非阻塞 I/O。
在这种模型中,配置的是非阻塞 I/O,然后使用阻塞 select 系统调用来确定一个 I/O 描述符何时有操作。
使 select 调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。
对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。

图 4. 异步阻塞 I/O 模型的典型流程 (select)

select 调用的主要问题是它的效率不是非常高。
尽管这是异步通知使用的一种方便模型,但是对于高性能的 I/O 操作来说不建议使用。

七、异步非阻塞 I/O(AIO)
最后,异步非阻塞 I/O 模型是一种处理与 I/O 重叠(并行)进行的模型。
steps:
a. 读请求会立即返回,说明 read 请求已经成功发起了。
b. 在后台完成读操作时,应用程序然后会执行其他处理操作。
c. 当 read 的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次 I/O 处理过程。

图 5. 异步非阻塞 I/O 模型的典型流程
 
在一个进程中为了执行多个 I/O 请求而对计算操作和 I/O 处理进行重叠(并行)处理的能力
利用了处理速度与 I/O 速度之间的差异。
当一个或多个 I/O 请求挂起时,CPU 可以执行其他任务;
或者更为常见的是,在发起其他 I/O 的同时对已经完成的 I/O 进行操作。

时间: 2024-11-10 11:29:58

同步 异步 阻塞 非阻塞 的概念的相关文章

异步/同步,阻塞/非阻塞,单线程/多线程概念梳理

最近看了一文说到异步是单线程的,顿时就傻眼了,对相关概念和同事进行了一些讨论和总结. 文中的描述是以我的理解来说的,可能不一定准确甚至正确,有错欢迎指正. 这三个概念我认为是描述不同的维度的,概念正交. 异步 同步 异步和同步是不同的流程设计风格. 但存在依赖关系的操作之间是同步的,也就是如果操作B依赖操作A的返回,那么B必须要在A结束后才能执行. 比如你要读取文件然后对文件内容进行处理,那么读取内容和处理内容就是同步的. 而异步这是操作间没有依赖关系,或者先后顺序并不重要. 比如用户登陆要给登

同步 异步 阻塞 非阻塞概念区分

老张爱喝茶,废话不说,煮开水. 提前剧透一下:同步和非同步主要用来形容被调用线程,阻塞非阻塞用来形容主线程的.出场人物:老张(主线程),水壶(被调用线程)两把(普通水壶,简称水壶:会响的水壶,简称响水壶). 1 老张把水壶放到火上,立等水开.(主线程等着,不断轮询被调用线程,直到被调用线程返回结果)(同步阻塞)老张觉得自己有点傻2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有.(主线程去做其他事了,但是还会时不时的查看被调用线程是否会返回结果,也就是说被调用线程自己是没法告诉主线程

[概念] 同步 异步 阻塞 非阻塞

同步 异步 指两个线程间的关系 两个线程之间要么是同步的,要么是异步的 同步操作时,调用者需要等待被调用者返回结果,才会进行下一步操作 异步操作时,调用者不需要等待被调用者返回调用,即可进行下一步操作 被调用者通常依靠事件.回调等机制来通知调用者结果 阻塞 非阻塞 是对同一个线程来说的 在某个时刻,线程要么处于阻塞状态,要么处于非阻塞状态 关注的是程序在等待调用结果(消息,返回值)时的状态 阻塞调用是指调用结果返回之前,当前线程会被挂起.调用线程只有在得到结果之后才会返回 非阻塞调用指在不能立刻

理解同步异步与阻塞非阻塞

本篇文章我准本从三个大方面来解释下同步异步.阻塞非阻塞的知识,第一个方面主要是说下,到底什么是同步异步.阻塞非阻塞:第二个方面主要是解释下在I/O场景下,同步异步阻塞非阻塞又是怎么定义的,第三个方面介绍下在unix下同步异步又有哪些阻塞非阻塞IO. 1.同步异步与阻塞非阻塞 首先从大的方面来说,"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答. 1).同步与异步 同步和异步关注的是消

同步/异步与阻塞/非阻塞

一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如sin isdigit等).但是一般而言,我们在说同步.异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务.最常见的例子就是 SendMessage.该函数发送一个消息给某个窗口,在对方处理完消息之前,这个函数不返回.当对方处理完毕以后,该函数才把消息处理函数所返回的值返回给调用者. B.

基础入门_Python-网络编程.分分钟掌握阻塞/非阻塞/同步/异步IO模型?

概念梳理: 故事独白: 满满爱喝茶,废话不多说,开始煮开水. 出场人物: 满满, 普通水壶, 高级水壶(水开会响) 1. 满满把水壶放在火上, 站在那里等水开(同步阻塞) 满满觉得自己有点儿傻逼~ 2. 满满把水壶放在火上,去客厅看电视,时不时的去厨房瞅瞅水开木有(同步非阻塞) 满满觉得自己还是有点傻~,于是买了个高级水壶, 水开后会响~ 3. 满满把高级水壶放在火上, 站在那里等水开(异步阻塞) 满满想高级水壶水开会自己叫~为毛不去看个电视哪? 4. 满满把高级水壶放在火上, 去客厅看电视,

深入理解同步/异步与阻塞/非阻塞区别 (转)

转载自:http://chuansong.me/n/2124760 几年前曾写过一篇描写同步/异步以及阻塞/非阻塞的文章,最近再回头看,还存在一些理解和认知误区,于是重新整理一下相关的概念,希望对网络编程的同行能有所启发. 同步与异步 首先来解释同步和异步的概念,这两个概念与消息的通知机制有关. 举个例子,比如一个用户去银行办理业务,他可以自己去排队办理,也可以叫人代办,办完之后再告知用户结果.对于要办理这个银行业务的人而言,自己去办理是同步方式,而别人代办完毕再告知则是异步方式. 两者的区别在

异步/同步、阻塞/非阻塞的理解

[同步和异步] 通俗的讲:同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式.同步:提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事异步: 请求通过事件触发->服务器处理(这是浏览器仍然可以作其他事情)->处理完毕 概念从现实中来:同步:打电话,你拨通电话后必须等在那里,直到对方有人接了,你们才能通信或者说你才能继续打下一个电话.异步:发短信,你可以发

(转)同步异步/阻塞非阻塞 和 5种linux网络通信模型

会阻塞的函数:connect, accept,send/recv/sendto/recvfrom等读写函数. 不会阻塞的函数:bind, listen,socket, closesocket. linux网络通信模型有: 阻塞IO模型(同步),非阻塞IO模型(拷贝同步),IO复用模型(多线程同步),信号驱动IO模型((拷贝同步),异步IO模型(异步). node.js对同步/异步,阻塞非阻塞的解释: 线程在执行中如果遇到磁盘读写或网络通信(统称为I/O 操作),通常要耗费较长的时间,这时 操作系

Java 中阻塞非阻塞io以及同步异步IO

然后借鉴下<Unix网络编程卷>中的理论: IO操作中涉及的2个主要对象为程序进程.系统内核.以读操作为例,当一个IO读操作发生时,通常经历两个步骤: 1,等待数据准备 2,将数据从系统内核拷贝到操作进程中 例如,在socket上的读操作,步骤1会等到网络数据包到达,到达后会拷贝到系统内核的缓冲区:步骤2会将数据包从内核缓冲区拷贝到程序进程的缓冲区中. 阻塞(blocking)与非阻塞(non-blocking)IO IO的阻塞.非阻塞主要表现在一个IO操作过程中,如果有些操作很慢,比如读操作