前三种都是同步,只有最后一种才是异步IO。html
简介:进程会一直阻塞,直到数据拷贝完成。
应用程序调用一个IO函数,致使应用程序阻塞,等待数据准备好。若是数据没有准备好,一直等待。数据准备好了,从内核拷贝到用户空间。
执行完毕后,IO函数会向应用程序返回成功响应,应用程序获得响应后,就再也不阻塞,并进行后面的工做。
网络中IO阻塞以下图所示:
示例:
餐厅吃饭,点完餐后,只能坐在餐厅里面等作好饭,吃完才能去逛商场,中间等待作饭的时间浪费掉了。这就是阻塞。linux
简介:非阻塞IO经过进程反复调用IO函数(屡次系统调用,并立刻返回);在数据拷贝的过程当中,进程是阻塞的。
应用程序调用一个IO函数,这个IO操做会从内核中当即返回(当IO操做没法完成时,返回一个错误)。可是这个IO函数具体要执行的事情(写数据)可能并无完成。
而对于应用程序,虽然这个IO操做很快就返回了,可是它并不知道这个IO操做是否真的成功了。为了知道IO操做是否成功,通常有两种策略:
一是须要应用程序主动地循环地去问,直到数据准备好为止,在这个不断问的过程当中,会大量的占用CPU的时间;
二是采用IO通知机制,好比:IO多路复用或信号驱动IO。
网络IO非阻塞以下图所示:
示例:
又想去逛商场,又担忧饭好了。因此逛一会,回来询问服务员饭好了没有,来来回回好屡次。这就是非阻塞。小程序
简介:比阻塞IO并无什么优越性,关键是能实现同时对多个IO端口进行监听。
IO复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,可是和阻塞IO所不一样的,这两个函数能够同时阻塞多个IO操做。并且能够同时对多个读操做,多个写操做的IO函数进行检测,直到有数据可读或可写时,才真正调用IO操做函数。
网络IO多路复用以下图所示:
示例:
商场安装了电子屏幕用来显示点餐的状态,这样饭是否好了,都直接看电子屏幕就能够了。这就是IO多路复用。微信小程序
简介:告知内核启动某个操做,并让内核在整个操做完成后通知咱们;数据拷贝的时候进程无需阻塞。
当一个异步过程调用发出后,调用者不能马上获得结果,实际处理这个调用的函数在完成后,经过状态、通知和回调来通知调用者的输入输出操做。
linux提供了AIO库函数实现异步,可是用的不多。目前有不少开源的异步IO库,例如libevent、libev、libuv。
网络异步IO以下图所示:
示例:
叫外卖,只须要打个电话说一下,而后能够作本身的事情,饭好了就送来了。这就是异步。
小结:
同步IO引发进程阻塞,直至IO操做完成。
异步IO不会引发进程阻塞。
IO复用是先经过select调用阻塞。
阻塞IO、非阻塞IO、多路复用IO都属于同步IO,异步一定是非阻塞的,因此不存在异步阻塞和异步非阻塞的说法。由于其中真正的IO操做(函数)都将会阻塞进程,只有异步IO模型真正实现了IO操做的异步性。
查看更多:
开发一个微信小程序实例教程
HTTP协议整理
PHP安全之Web攻击
秒杀系统设计优化
MySQL优化安全
参考资料:
http://www.cnblogs.com/Anker/p/3254269.html
http://www.cnblogs.com/Anker/p/5965654.html微信