I/O模型

几个I/O模型,如下表

I/O I/O
blocking IO 阻塞IO
noblocking IO 非阻塞IO
multiplexing IO 复用(多路)IO
asynchronus IO 异步IO
signal driven IO 事件驱动

对于web来说,会产生两次IO,客户端报文到达服务端网卡IO,内核处理本地磁盘IO

阻塞IO

blocking IO
指调用方发出调用,被调用者把调用者挂起(不可中断式睡眠),调用者此时只能等待被调用者返回结果,如图:


简单解释,不是很精确

非阻塞IO

nonblocking IO
指调用方发出调用,被调用者对调用者提示收到请求,调用者干嘛干嘛,但是调用者要一遍又一遍的查询结果

例如:你(调用方)去看医生(被调用方),医生给你拍了CT;医生告诉你结果要过一会儿才能拿到,你该干嘛干嘛,但是医生却没有说具体多久能拿到结果且医生不会通知你结果出来了;这时你就需要过段时间去问一下结果出来没有?,过段时间又去问,直到结果出来为止
其实,这里我们看到效率还是很低,因为调用者要一遍一遍的去查看结果是否出来,且后面排队的还是阻塞状态。

复用型/多路IO

multiplexing IO

例如:银行只有一个窗口处理开卡和存取款业务,每天处理业务很慢,后面办理业务的都被阻塞了。后面开了两个窗口,一个开卡,一个办理存取业务,增加了一个助理,助理将开卡客户、存取款业务的用户分别分配到指定窗口去,此时助理实现的就是复用IO,开卡、存取款的客户都经过他哪儿。

回到主题,客户就是调用者 ,窗口就是被调用者,当窗口都在处理业务时,客户就阻塞在助理这里了

事件驱动IO

signal driven IO
当调用者把请求发送给被调用者时,被调用者马上回应调用者请求收到了,你该干嘛干嘛;等数据处理完成我会通知你,此时调用者做其他事情去了,没有被阻塞

如图,第一阶段确实没有产生阻塞,但是通知数据好了,程序来取数据的时候阻塞在了磁盘IO上
通知:

水平触发:多次通知,直到调用者来取结果
边缘触发:只通知一次,如果没来取结果,用回调函数返回给调用者

异步IO

asynchronus IO

如图,异步IO同样有通知功能,但是通知调用者的是,你的数据我已经帮你准备好了,直接就能用了

这里一二阶段都不阻塞,因为内核把数据拷贝进入内核内存,再把数据拷贝到进程内存;然后通知进程数据准备好了
Last modification:October 1st, 2019 at 08:01 pm
If you think my article is useful to you, please feel free to appreciate