理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO
Posted darrenqiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO相关的知识,希望对你有一定的参考价值。
以下是IO的一个基本过程
先理解一下用户空间和内核空间,系统为了保护内核数据,会将寻址空间分为用户空间和内核空间,32位机器为例,高1G字节作为内核空间,低3G字节作为用户空间。当用户程序读取数据的时候,会经历两个过程:磁盘到内核空间(这块消耗性能,下面简称内核数据准备),内核空间拷贝到用户空间(下面简称用户空间拷贝)。
基于这个前提,同步异步IO,阻塞非阻塞IO
这几个概念其实非常类似的,区分的关键点在于被调用者的返回方式。
当我们进行IO操作的时候,如果被调用者将任务全部执行完返回,称为同步/阻塞 IO。
如果被调用者,不管没有操作成功,直接返回一个结果码,但是不再主动通知后续结果,称为非阻塞IO;这种情况下需要重复调用查询状态。
如果被调用者,不管有没有操作成功,直接返回个结果码,等到全部操作完成之后再发一个信号通知调用者,称为异步IO。
举个例子:
家里有个专门帮忙做饭的阿姨,有一天我想喝水了,我让阿姨帮忙烧一壶水。
我看着她去烧水,灌水,给我倒水,期间没有做其他任何事情,这就是同步。
我想着也不用一直等,可以先看会儿电视,我就隔一会儿来看一次,隔一会儿来看一次,这叫非阻塞。
再想想,这也烦,我索性跟阿姨说,好了叫我一声,然后就去看电视去了,这叫异步。
而IO多路复用,信号驱动IO则是基于前面四个模型的衍生。
IO多路复用是基于阻塞IO的衍生,主要是为了提高内核空间数据准备这一块的功能复用,即阻塞的同时监听多个端口,有一个端口有数据就进行处理,提高性能。
信号驱动IO则是在内核空间数据准备这一块采用异步,在用户空间拷贝这一块采用同步。
以上是关于理解同步,异步,阻塞,非阻塞,多路复用,事件驱动IO的主要内容,如果未能解决你的问题,请参考以下文章