阻塞、非阻塞、同步、异步 I/O
一直对这几个概念似懂非懂,今天藉着twisted学习,回顾一下这几个概念,并总结一下twisted的核心,反应堆模式。
阻塞非阻塞和同步异步主要是关注点不同。
阻塞、非阻塞关注的发起任务线程的状态(阻塞是发起后停止,非阻塞是发起后继续执行),而同步、异步则是关注发起任务线程与执行任务线程之间的通信机制(同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者边做其他的事边轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知,异步的特点就是通知)。
java io的例子
同步阻塞:
在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式。
同步非阻塞:
在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。
异步:
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。”
举个现实的例子。
吃饭是一个任务,分二步,下单、吃。但是中间会等待,就是任务会阻塞。
同步阻塞
你去饭店吃饭,先下单,你会处于阻塞的状态,不能去游泳,一直到吃完饭。任务完成。
同步非阻塞
去饭店吃饭,下完单出去逛街,然后过一段时间来看看饭准备好了没有,没有你可以继续逛街。一直到准备好,再吃饭完成任务
异步阻塞
在家点外卖,然后傻等,一直到外卖送来。这个意义不大
异步非阻塞
在家点外卖,点完后看电视,外卖送来就开始吃。
twisted框架中的异步实现
Reactor模式是处理并发I/O比较常见的一种模式,用于同步I/O,中心思想是将所有要处理的I/O事件注册到一个中心I/O多路复用器上,同时主线程阻塞在多路复用器上;一旦有I/O事件到来或是准备就绪(区别在于多路复用器是边沿触发还是水平触发),多路复用器返回并将相应I/O事件分发到对应的处理器中。
普通函数调用的机制:程序调用某函数->函数执行,程序等待->函数将结果和控制权返回给程序->程序继续处理。而所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数)。
Reactor释义“反应堆”,是一种事件驱动机制。和普通函数调用的不同之处在于:应用程序不是主动的调用某个API完成处理,而是恰恰相反,Reactor逆置了事件处理流程,应用程序需要提供相应的接口并注册到Reactor上,如果相应的时间发生,Reactor将主动调用应用程序注册的接口,这些接口又称为“回调函数”。使用Libevent也是向Libevent框架注册相应的事件和回调函数;当这些时间发声时,Libevent会调用这些回调函数处理相应的事件(I/O读写、定时和信号)。
参考资料
http://blog.csdn.net/xuqiqiang1993/article/details/68488569
网友评论