I/O 阻塞与非阻塞,同步与异步

一、I/O模型

  一个输入操作通常包括两个阶段:

  (1)等待数据准备好;

  (2)从内核向进程复制数据。

1、阻塞式

  系统调用直到数据报到达且被复制到应用进程的缓冲区或者发生错误才会返回。也就是说recvfrom从开始到它返回的整段时间内都是被阻塞的。

2、非阻塞式

  进程把一个套接字设置成非阻塞是在通知内核:当所有的I/O操作非得把本进程投入睡眠才能完成时,不要把进程投入睡眠而是返回一个错误,可以看的出来每一次系统调用都会立即返回。当一个应用对一个非阻塞描述符循环的询问内核是否准备好数据(轮询),往往会消耗大量的CPU时间,所以一般我们都是配合某一功能的系统才会使用这种模型。

3、I/O复用(事件驱动)

  常见的I/O复用是select、poll和epoll的调用,阻塞时发生在这几个系统调用之上,而不是阻塞在真正的I/O系统调用之上。使用它们的优势在于可以同时等待多个描述符就绪,从而减少了等待时间。

4、信号驱动式

  等待数据到达期间不阻塞,程序继续执行,只要等待来自信号处理函数的通知:数据准备好被处理,但是在数据复制阶段还是阻塞的。

5、异步

  

  告知内核启动某个操作,并让内核在整个操作(包括上述的两个阶段)完成后再通知,即两个阶段都不阻塞。 话句话说就是内核已经完成的数据的读写,通知的只是结果。

总结:

  前四种主要区别在第一阶段,就是等待数据的过程,而第二阶段是一样的,在数据从内存复制到调用者的缓冲区间,都发生阻塞了;而异步在这两个阶段都处理了,也就是全程没发生阻塞。因而前四种都属于同步模型,只有最后一个是异步的。异步一般都是通过特殊的API实现的,比如AIO,而无论阻塞模型与非阻塞模型或者I/O复用都是同步的。

二、阻塞与非阻塞

  首先我们要明确阻塞与非阻塞发生在第一阶段,关注的是程序在等待调用的结果时状态(数据准备好了吗),如果一直等待着结果出来,不去干其他事,这就是阻塞;如果调用后立刻返回一个状态,如果没有准备好就挂起,干其他事去,之后再来询问,如此循环往复直到获得结果,这就是非阻塞。

三、同步与异步

  同步与异步发生在两个阶段,关注的是消息的通信机制,同步就是在结果没有出来前,调用时不会返回的,一旦返回就得到返回值,也就是说是调用者自己等待调用的结果;异步则是调用发出后,直接返回没有等待结果,而是被调用者来通知调用者处理完成了。

同步I/O操作:导致请求进程阻塞,直达I/O操作完成;

异步I/O操作:不导致请求进程阻塞。

例子:

你网上问淘宝客服有没有《unix网络编程》,你一直坐在电脑前等待,直到客服回复有没有的结果(这就是阻塞);你不管客服有没有告诉你,你自己先一边去玩游戏去了, 偶尔过几分钟check一下客服有没有回复(这就是非阻塞)。如果你问了客服之后就不管了,直到客服@你了(这就是异步反之就是同步)。

时间: 2024-09-29 09:23:19

I/O 阻塞与非阻塞,同步与异步的相关文章

同步与异步、阻塞与非阻塞

"阻塞"与"非阻塞"与"同步"与"异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)所谓同步,就是在发出一个*调用*时,在没有得到结果之前,该*调用*就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由*调用者*主动等待这个*调用*的结果. 而异步则是相反

阻塞、非阻塞、同步、异步

同步和异步关注的是消息通信机制. 同步 调用者主动等待调用结果返回,没有得到结果之前,该调用不返回. 异步 调用者不必马上等待返回结果,执行部件通过通知.状态或回调函数来返回结果给调用者. 阻塞和非阻塞关注的是程序等待调用结果的状态. 阻塞 调用返回之前,当前线程挂起.调用线程只有等待结果之后才返回. 非阻塞 它不会阻塞当前线程.

同步与异步,阻塞与非阻塞基础

1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication) 同步,在发出一个调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就得到返回值了.是由调用者主动等待这个调用的结果. 异步,调用在发出之后,这个调用就直接返回了,所以没有返回结果.当一个异步过程调用发出后,调用者不会立刻得到结果.而是在调用发出后,被调用者通过状态.通知来通知调用者,或通过回调函数处理这个调用. 2.阻塞与非阻

socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个异步过程调用发出后,调

同步和异步、阻塞和非阻塞

首先说明我对这些概念也不是很清楚,以下内容是我做的一些理事. 同步和异步.阻塞和非阻塞这是两组概念,说的是不同的事情,同步和阻塞没有必然的联系,异步和非阻塞也没有必然的联系.同步和异步是只跟IO操作过程中进程的状态变化有关.阻塞和非阻塞就是进程的两种状态.比如你去银行,排除的话就是一种同步的方式,叫号的话就是异步的方式.排队必须自己看着什么时候轮到自己,而叫号则不必,轮到你的时候会触发一个事件,或者说你会收到一个信号,别人会叫你.不管是排除还是叫号,如果你在等待的过程中不能做其他事情,那就是阻塞

如何理解阻塞和非阻塞同步和异步

1.同步与异步 同步和异步关注的是消息通信机制,所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回.但是一旦调用返回,就得到返回值了.换句话说,就是由调用者主动等待这个调用的结果. 而异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果.换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果,而是在调用发出后,被调用者通过状态,通知机制来通知调用者,或通过回调函数处理这个调用. 举例: 你打电话问书店老板有没有<分布式系统>这本书,如果是同步通信机制,书店老

聊聊同步、异步、阻塞与非阻塞

本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538901&idx=1&sn=d1f7d5461491a9c240f16da6b7c0ced9&scene=21#wechat_redirect 近来遇到了一些常见的概念,尤其是网络编程方面的概念,如:阻塞.非阻塞.异步I/O等等,对于这些概念自己也没有太清晰的认识,只是很模糊的概念,说了解吧也了解,但是要让自己准确的描述概念方面的具体细节,却说

同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

1. 概念理解        在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:   同步/异步主要针对C端: 同步:      所谓同步,就是在c端发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事.   例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对.当c端一个

socket阻塞与非阻塞,同步与异步、I/O模型

socket阻塞与非阻塞,同步与异步 作者:huangguisu 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:      所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:      异步的概念和同步相对

IO模式——同步(阻塞、非阻塞)、异步

不少人把同步.异步.阻塞.非阻塞放到一起讨论,很多时候难以区分. 这里从根上剖析下该怎么看待这几个概念. 首先,异步和同步是相对的,而同步情况下又有阻塞和非阻塞之分. 异步很容易理解.当用户程序需要进行IO的时候,发出IO请求,然后就立刻返回,可以继续做其它事情. 例如,从网络收包,当包抵达后放到内核某个缓存区,并且从内核空间放置到程序需要的用户空间后(一种是直接复制,比较费资源:一种是映射mmap),通知程序,程序之后就可以处理数据了. 这是最理想的模式,CPU干活效率最高. 同步情况则是,当