前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unix IO模型

Unix IO模型

作者头像
Monica2333
发布2020-06-22 14:56:45
8470
发布2020-06-22 14:56:45
举报
文章被收录于专栏:码农知识点码农知识点

1.同步,异步,阻塞,非阻塞的概念: 一般来说,一个输入操作包含两个阶段: (1)等待数据准备好 (2)将数据从内核拷贝到用户空间

同步:针对上述两个过程,用户进程是否有阻塞,体现在消息通知机制上; 阻塞:进程是否知道何时数据准备好了,也就是第一个阶段是否阻塞。 2.Unix五种IO模型:

(1)阻塞式IO模型:

在这个IO模型中,用户进程执行一个系统调用(recvfrom),内核准备好数据,并将数据从内核复制到用户空间,才会返回结果给用户进程,整个IO过程都是阻塞的,Java BIO就是这种实现方式。

(2)非阻塞式IO模型

非阻塞式IO也就是在等待数据的阶段是可以做其他事情的,而应用进程通过反复调用recvfrom等待返回成功指示(轮询),而第二步仍然是需要等待的。Java NIO是这种实现方式。

(3)IO多路复用模型

IO多路复用有三种方式:select,poll,epoll。为何叫多路复用,是因为它I/O多路复用可以同时监听多个fd,如此就减少了为每个需要监听的fd开启线程的开销。通过Java NIO实现的Reactor模式使用了这种编程模型。

select调用是内核级别的,可以等待多个socket,能实现同时对多个IO端口进行监听,当其中任何一个socket的数据准好了,就能返回进行可读,然后进程再进行recvform系统调用,将数据由内核拷贝到用户进程,这个过程是阻塞的。

I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这几个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时(不是等到socket数据全部到达再处理, 而是有了一部分数据就会调用用户进程来处理),才真正调用I/O操作函数。 在IO multiplexing Model中,实际中,对于每一个socket,一般都设置成为non-blocking,但是,如上图所示,整个用户进程其实是一直被阻塞的。在第一个阶段,进程是被select这个函数阻塞,而不是被socket IO给阻塞。 和同步阻塞IO的区别就是: 同步阻塞IO:幼儿园的一个老师负责一个小朋友的上厕所行为,老师一直等待小朋友想去厕所,直到小朋友想过去了,才带着他去。 IO多路复用:由一个老师负责一批小朋友的上厕所行为,其中某个小朋友或者某一批小朋友想去厕所,都会带着他们去。所以相比同步阻塞IO,减少了为每个需要监听的fd开启线程的开销。 (4)信号驱动式IO模型

首先我们允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

也就是说第一个阶段,完全是非阻塞的,等数据到达内核会给一个信号通知,第二个阶段recvfrom还是阻塞过程。

(5)异步IO模型

用户进程调用aio_read之后,内核会立即返回。当内核两阶段都准备好后,会用信号通知给用户进程,然后用户进程可处理结果,所以两个阶段都是非阻塞的。通过Java AIO实现的Proactor模式即是异步I/O模型的实现。

参考资料: https://mp.weixin.qq.com/s?__biz=MzI3MTQ1NzU2NA==&mid=2247484007&idx=1&sn=bcd034abc76bd83cc003233f37de68d9&chksm=eac0ce14ddb7470207bd8b8de22d1b5ab393d990b345d90eff54470648d6877f7d344773c657&scene=21#wechat_redirect https://segmentfault.com/a/1190000003063859

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档