美文网首页
Unix IO模型

Unix IO模型

作者: Monica2333 | 来源:发表于2018-10-21 11:23 被阅读0次

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

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


unix io模型.png

(1)阻塞式IO模型:


阻塞式io模型1.png
在这个IO模型中,用户进程执行一个系统调用(recvfrom),内核准备好数据,并将数据从内核复制到用户空间,才会返回结果给用户进程,整个IO过程都是阻塞的,Java BIO就是这种实现方式。
(2)非阻塞式IO模型
非阻塞式io模型.png
非阻塞式IO也就是在等待数据的阶段是可以做其他事情的,而应用进程通过反复调用recvfrom等待返回成功指示(轮询),而第二步仍然是需要等待的。Java NIO是这种实现方式。

(3)IO多路复用模型


io多路复用.png
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模型

信号驱动式io模型.png
首先我们允许Socket进行信号驱动IO,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。
也就是说第一个阶段,完全是非阻塞的,等数据到达内核会给一个信号通知,第二个阶段recvfrom还是阻塞过程。
(5)异步IO模型
异步io模型.png
用户进程调用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

相关文章

  • 【Netty开发指南】搭稳Netty开发的地基

    Linux网络编程5种IO模型 根据UNIX网络编程对于IO模型的分类,UNIX提供了5种IO模型,分别是 阻塞I...

  • linux select/epoll

    一、Unix/Linux网络IO模型在经典的Unix网络编程中,总结出了5种不同的网络IO模型,分别是阻塞式IO,...

  • Unix下5种IO模型

    目录一:Unix下5种IO模型二:同步I/O和异步I/O 一:Unix下5种IO模型 阻塞式IO 非阻塞式IO I...

  • Unix IO模型

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

  • IO模型

    描述 本文摘自UNIX网络编程卷1:套接字联网API,描述了UNIX中五种IO模型。阻塞IO、非阻塞IO、IO复用...

  • 彻底搞懂Java的网络IO

    IO是Input/Output的缩写。Unix网络编程中有五种IO模型: blocking IO(阻塞IO) no...

  • 四、高性能IO模型浅析

    按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO;按照PO...

  • 阻塞与非阻塞,同步与非同步,你真的懂吗?

    按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO。按照PO...

  • netty

    netty 高性能,异步,事件驱动库 Unix io模型 阻塞io 非阻塞io,netty主要就是基于epoll的...

  • 异步IO简析

    什么是异步IO 《UNIX网络编程卷1》中的IO多路复章节总结了几种典型IO模型,包括: 阻塞IO 非阻塞IO I...

网友评论

      本文标题:Unix IO模型

      本文链接:https://www.haomeiwen.com/subject/ovzouftx.html