美文网首页
Linux下的5种IO模型的小结(转)

Linux下的5种IO模型的小结(转)

作者: 呼啦啦的爱 | 来源:发表于2020-03-16 10:03 被阅读0次

  接触网络编程,我们时常会与各种与IO相关的概念打交道:同步(Synchronous)、异步(ASynchronous)、阻塞(blocking)和非阻塞(non-blocking)。关于概念的区别在知乎上看到一位朋友(链接)打了一个比较形象的比喻:

  你打电话问书店老板有没有《分布式系统》这本书,如果是同步通信机制,书店老板会说,你稍等,”我查一下",然后开始查啊查,等查好了(可能是5秒,也可能是一天)告诉你结果(返回结果)。

  而异步通信机制,书店老板直接告诉你我查一下啊,查好了打电话给你,然后直接挂电话了(不返回结果)。然后查好了,他会主动打电话给你。在这里老板通过“回电”这种方式来回调。

  你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果。如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了,

当然你也要偶尔过几分钟check一下老板有没有返回结果。

  在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。

  同步与异步的主要区别就在于:会不会导致请求进程(或线程)阻塞。同步会使请求进程(或线程)阻塞而异步不会。

  linux下有五种常见的IO模型,其中只有一种异步模型,其余皆为同步模型。如图:

  阻塞IO模型

  阻塞IO模型是最常见的IO模型了,对于所有的“慢速设备”(socket、pipe、fifo、terminal)的IO默认的方式都是阻塞的方式。阻塞就是进程放弃cpu,让给其他进程使用cpu。进程阻塞最显著的表现就是“进程睡眠了”。阻塞的时间通常取决于“数据”是否到来。

  非阻塞IO模型

  非阻塞IO就是设置IO相关的系统调用为non-blocaking,随后进行的IO操作无论有没有可用数据都会立即返回,并设置errno为EWOULDBLOCK或者EAGAIN。我们可以通过主动check的方式(polling,轮询)确保IO有效时,随之进行相关的IO操作。当然这种方式看起来就似乎不太靠谱,浪费了太多的CPU时间,用宝贵的CPU时间做轮询太不靠谱儿了。图示:

  多路复用IO模型

  多路复用是让阻塞发生在我们的多路复用IO操作的系统调用上面,而不是我们真正去执行IO的系统调用。使用这个方式的好处就是可以同时监控多个用于IO的文件描述符。

  信号驱动IO模型

  所谓信号驱动,就是利用信号机制,安装信号SIGIO的处理函数(进行IO相关操作),通过监控文件描述符,当其就绪时,通知目标进程进行IO操作(signal

handler)。

  异步IO模型

  Linux上异步IO有一组POSIX规定的接口,已aio开头的几个SYSCALL。如下:

  int aio_read(struct aiocb *aiocbp);

  int aio_write(struct aiocb *aiocbp);ssize_t aio_return(struct aiocb

*aiocbp); 使用时记得 Link with -lrt.

  参数看起来给人一种很简洁的假象。其实相较于其他模型的参数一个也没有少,只是放到了结构体里边了。先看一下struct

aiocb这个结构的原型吧,头文件是”aio.h“。

  struct aiocb

  {

  int aio_fildes; /* File desriptor. */

  int aio_lio_opcode; /* Operation to be performed. */

  int aio_reqprio; /* Request priority offset. */

  volatile void *aio_buf; /* Location of buffer. */

  size_t aio_nbytes; /* Length of transfer. */

  struct sigevent aio_sigevent; /* Signal number and value. */

  /* Internal members. */

  struct aiocb *__next_prio;

  int __abs_prio;

  int __policy;

  int __error_code;

  __ssize_t __return_value;

  #ifndef __USE_FILE_OFFSET64

  __off_t aio_offset; /* File offset. */

  char __pad[sizeof (__off64_t) - sizeof (__off_t)];

  #else

  __off64_t aio_offset; /* File offset. */

  #endif

  char __unused[32];

  };

  其实虽然结构体足够长,其实真正用到的也就前面那几个参数,也没那么复杂。具体用法不再赘述。

  下图是关于异步IO模型的图示:

  Linux相关的视频学习资料

  linux下的IO模型

  http://www.makeru.com.cn/live/4011_1565.html?s=45051

  Linux开发必备:IO多路复用剖析

  http://www.makeru.com.cn/live/3485_1632.html?s=45051

  Linux开发必备:1小时玩转儿文件I/O编程

  http://www.makeru.com.cn/live/detail/1609.html?s=45051

  快速上手linux

  http://www.makeru.com.cn/live/1758_310.html?s=45051

  Linux网络经典案例

  http://www.makeru.com.cn/live/3485_1630.html?s=45051

  Linux网络高并发技术之epoll

  http://www.makeru.com.cn/live/5413_1937.html?s=45051

相关文章

  • Linux下的5种IO模型的小结(转)

    接触网络编程,我们时常会与各种与IO相关的概念打交道:同步(Synchronous)、异步(ASynchronou...

  • 1.Nette入门第一章——IO演进

    1. IO 基础 1.1. linux网络IO模型 阻塞IO模型 非阻塞IO模型 IO多路复用模型(NIO) 信...

  • 2、Linux IO模型

    下图是Linux处理IO调用的流程图: Linux IO模型分为5种: 阻塞IO 非阻塞IO IO复用 事件驱动I...

  • 高并发服务器IO模型

    高并发服务器 IO 模型一、 什么是 IO?二、 IO 的 5 种模型三、Linux 并发网络编程模型四、sele...

  • Linux IO模型

    Linux IO模型 网络IO的本质就是socket的读取,socket在linux系统被抽象为流,IO可以理解为...

  • 2018-07-03

    Netty实践与NIO原理 一、阻塞IO与非阻塞IO Linux网络IO模型(5种) (1)阻塞IO模型 所有文件...

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

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

  • Linux的IO模型

    IO执行的两个阶段 在Linux中,对于一次读取IO的操作,数据并不会直接拷贝到程序的程序缓冲区。通常包括两个阶段...

  • linux下的IO模型---学习笔记

    1、linux文件系统和缓存 文件系统接口 文件系统—一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接...

  • python入门开发学习笔记之了解异步IO模型

    本节重点 了解异步IO模型 本节时长需控制在5分钟内 异步IO(Asynchronous I/O) Linux下的...

网友评论

      本文标题:Linux下的5种IO模型的小结(转)

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