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 条评论
登录 后参与评论

相关文章

  • 深入浅出Unix IO模型

    在介绍Unix IO模型之前,我们先来说说什么是IO。根据维基百科的定义,IO的指的是输入输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入和输出...

    Bug开发工程师
  • 深入浅出Unix IO模型

    前言 在介绍Unix IO模型之前,我们先来说说什么是IO。根据维基百科的定义,IO 指的是输入输出,通常指数据在内部存储器和外部存储器或其他周边设备之间的输入...

    Bug开发工程师
  • Unix的I/O模型解析

    IO 是主存和外部设备 ( 硬盘、各种移动终端及网络等 ) 拷贝数据的过程。IO 是操作系统的底层功能,通过 I/O 指令完成。网络编程领域的IO专指网络IO。

    JavaEdge
  • Java 网络编程实战(二) - Unix的I/O模型解析

    A线程: A要去做事情A1,A2, A3。 如果A1正在执行的情况下A2, A3都不能执行,这叫做同步,也叫阻塞。A2必须等A1执 行完毕之后才能执行。

    JavaEdge
  • Unix网络编程之IO模型

    首先,我们要了解IO模型先要知道在底层操作系统是通过哪些设备来实现数据的传输,其次要了解IO模型中哪些是发生阻塞调用操作,然后有了上述的基本认知之后,开始来了解...

    keithl
  • IO类型与IO模型

    IO类型 同步与异步(synchronous,asynchronous):关注消息通知机制 同步: 进程发出系统调用之后,不会立即有返回信息,但是一旦有返回信息...

    小小科
  • IO模型

    一 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步:   所谓同...

    用户1214487
  • I/O模型

    目前我们网络所面临的依然是高并发的问题,就像某cat双11时的情况,瞬间的并发量是惊人的,当然我们会有很多种方法去解决这个问题,本文我们谈论的是单台服务器,如何...

    用户2645267
  • I/O模型

    Linux内核将所有的外部设备当做一个文件来操作,对文件的读写操作会调用内核的系统命令,返回一个文件描述符(file descriptor,fd)。而对sock...

    黑洞代码
  • IO模型

    说到IO模型,都会牵扯到同步、异步、阻塞、非阻塞这几个词。从词的表面上看,很多人都觉得很容易理解。但是细细一想,却总会发现有点摸不着头脑。自己也曾被这几个词弄的...

    小歪
  • Linux IO 模型

    Linux 中主要有五种IO模式:阻塞IO, 非阻塞IO, IO 多路复用,信号驱动IO和异步IO;

    xuyaowen
  • 关于IO的同步,异步,阻塞,非阻塞

    上次写了一篇文章:Unix IO 模型学习。恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现。中途...

    小小科
  • 关于IO的同步,异步,阻塞,非阻塞

    上次写了一篇文章:Unix IO 模型学习。恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现。中途...

    小小科
  • I/O模型简述

    最近在学习 Java NIO 方面的知识,为了加深理解。特地去看了 Unix/Linux I/O 方面的知识,并写了一些代码进行验证。在本文接下来的一章中,我将...

    田小波
  • Python之IO模型

    IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步、异步、阻塞、非阻塞     同步(synchronous) IO和异步(asynchronous...

    新人小试
  • 网络IO模型

    recvfrom -> [syscall -> wait -> copy ->] return OK!

    邹志全
  • IO模型介绍

      前面介绍了NIO中的buffer和Channel,而我们将NIO主要的使用场景还是在网络环境中,在具体介绍之前我们需要了解下IO的模型

    用户4919348
  • 系统IO模型

    「线程一直等待数据,数据没有完全加载到内存的期间,线程处于阻塞状态;直到数据完成拷贝以后,线程才结束阻塞状态」

    石的三次方
  • 浅析IO模型

    沁溪源

扫码关注云+社区

领取腾讯云代金券