Unix IO模型

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Presto系列 | Presto基本介绍

    Presto是一款Facebook开源的MPP架构的OLAP查询引擎,可针对不同数据源执行大容量数据集的一款分布式SQL执行引擎。因为工作中接触到Presto,...

    Monica2333
  • zookeeper中zoo.cfg详解

    zoo.cfg介绍 https://www.cnblogs.com/likui360/p/5985588.html

    Monica2333
  • 图解leetcode11:盛最多水的容器

    题目描述: 给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为...

    Monica2333
  • 答读者们问题提问以及建议合集

    是的,他的昵称真的就叫图灵,一开始我以为是图灵出版社的人...他是《PHP网络编程》的阅读者,由于比较读的比较认真仔细,所以他问了一些问题,你们感受一下。

    老李秀
  • Saltstack 远程操作(grains,pillar)服务安装+配置管理

    老七Linux
  • 信息图|中国国际移民已成世界最大移民群体

    大数据文摘
  • 四种主要的IO模型

    服务器端编程,经常需要构造高性能的网络应用,需要选用高性能的IO模型,这也是通关大公司面试必备的知识。

    DH镔
  • 图书勘误-1

    有读者指出第五章JPA多数剧源配置一节,按照书中的源码无法实现效果,启动时会报错,我刚开始想着不可能,因为书中所有案例我都是本地运行没问题才把代码拷贝到书上去的...

    江南一点雨
  • 同步/异步,阻塞/非阻塞

    什么是同步和异步 同步和异步是针对应用程序和内核的交互而言的, 同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO...

    欠扁的小篮子
  • Docker部署Apollo分布式环境 原

    应用镜像:https://hub.docker.com/r/idoop/docker-apollo/

    bdcn

扫码关注云+社区

领取腾讯云代金券