0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍下这五种IO模型

Linux阅码场 来源:Linuxer 2020-06-03 15:53 次阅读

面试的时候也许你被问到过IO模型,可能你知道有五种,可是却不一定能准确指出他们之间的关系,下面我们介绍下这五种IO模型

五种IO模型

阻塞IO

非阻塞IO

IO复用(select和poll)

信号驱动

异步IO(Posix.1 的 aio...系列函数)

备注

一个输入操作一般分为两个阶段:

等待数据准备好

把数据从内核拷贝到进程

一个套接字的输入操作,第一步是等待数据到达网络,当分组到达时,它被拷贝到内核中的某个缓冲区,第二步是将数据从内核缓冲区拷贝到应用缓冲区

那我们来分别看下这五种IO模型

阻塞IO模型

阻塞IO是最通用的IO模型,使用该模型接收数据时,在数据没有到之前程序会一直等待。例如函数recvfrom,内核会一直阻塞该请求直到有数据到才返回,如下图所示:

如上图所示,进程在调用recvfrom时,该系统调用直到数据到达且拷贝到应用缓冲区或出错才返回。那阻塞的时间就是从调用recvfrom开始到返回的这段时间,当进程返回成功指示时,应用进程开始处理数据报。

非阻塞IO模型

当把套接字设置成非阻塞方式时,即通知内核:当请求的IO操作非得让进程睡眠不能完成时,不要让进程睡眠,而应返回一个错误,直到数据准备好,并将数据拷贝到应用缓冲区返回成功指示,进程调用结束。如下图所示:

从图中我们可以看出,进程会反复调用recvfrom,前三次调用一直没有数据返回,因此立即返回一个EWOULDBLOCK错误,在第四次调用的时候,数据才准备好,并拷贝到了应用缓冲区,recvfrom返回成功指示,然后就时进程处理数据

当一个应用进程像这样对一个非阻塞描述字循环调用recvfrom时,我们称之为轮训。应用进程连续不断的查询内核,验证某操作是否准备好,这样会极大的浪费CPU的时间

IO复用模型

IO复用模型支持调用select或poll,会阻塞在select或poll上,而不是阻塞于真正的IO系统调用。阻塞在select调用,等待数据报套接口可读。当select返回套接口可读条件时,再调用recvfrom将数据拷贝到应用缓冲区。如下入所示:

通过阻塞IO模型和IO复用模型的对比,我们发现由之前的一次系统调用变成了两次系统调用,好像变差了,其实并没有,select可以等待多个描述字准备好,同时select可以设置超时时间。

信号驱动IO模型

信号驱动IO是让内核在描述字准备好时用信号SIGIO通知我们。首先允许套接口进行信号驱动IO,然后通过系统调用sigacation安装信号处理程序。此系统调用立即返回,进程继续工作,是非阻塞的。当数据报准备好被读时,为该进程生成一个SIGIO信号,随后在信号处理程序中调用recvfrom读取数据报,并通知主循环数据已经准备好被处理或者通知主循环让它来读取数据报,如下图所示:

异步IO模型

异步IO让内核启动操作,并在整个操作完成后(包括将数据从内核拷贝到用户空间)通知我们。如下图所示:

异步IO模型和信号驱动IO模型的主要区别是:信号驱动IO是由内核通知我们何时启动IO操作,而异步IO是由内核通知我们IO操作何时完成

五种IO模型的对比

通过上面对五种IO模型的介绍,我们发现前四种IO模型的主要区别点在于第一阶段,第二阶段基本相同:在数据从内核拷贝到调用者的缓冲区时,进程阻塞在recvfrom调用。异步IO模型的两个阶段是和前四种不同的,对比如下图所示:

我们发现五种IO模型没有提到同步IO模型,却提到了异步IO模型,这是为什么?

首先我们看下Posix对同步IO和异步IO的定义:

同步IO操作引起请求进程阻塞,直到IO操作完成

异步IO操作不引起请求进程阻塞

我们可以发现,根据上面的定义,前四种模式:阻塞IO模型、非阻塞IO模型、IO多路复用模型和信号驱动模型,其实都属于同步IO模型,因为他们四个都会经历真正的IO操作(recvfrom)且阻塞了进程,只有异步IO模型与异步IO的定义匹配

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6504

    浏览量

    87444
  • 模型
    +关注

    关注

    1

    文章

    2671

    浏览量

    47571

原文标题:这些IO模型你都知道吗 - 五种常见IO模型介绍

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是io多路复用?IO多路复用的优缺点

    IO多路复用是一种同步IO模型,它允许单个进程/线程同时处理多个IO请求。具体来说,一个进程/线程可以监视多个文件句柄,一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作。在没
    的头像 发表于 01-18 15:48 647次阅读

    异步IO框架iouring介绍

    前言 Linux内核5.1支持了新的异步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe开发,意在提供一套公用的网络和磁盘异步IO,不过io_uring
    的头像 发表于 11-09 09:30 497次阅读
    异步<b class='flag-5'>IO</b>框架iouring<b class='flag-5'>介绍</b>

    信号驱动IO与异步IO的区别

    一. 谈信号驱动IO (对比异步IO来看) 信号驱动IO 对比 异步 IO进行理解 信号驱动IO: 内核将数据准备好的时候, 使用SIGIO
    的头像 发表于 11-08 15:32 329次阅读
    信号驱动<b class='flag-5'>IO</b>与异步<b class='flag-5'>IO</b>的区别

    介绍reactor的四种模型

    前言 本文将由浅入深的介绍reactor,深入浅出的封装epoll,一步步变成reactor模型,并在文末介绍reactor的四种模型。 reactor是什么? reactor是一种高
    的头像 发表于 11-08 15:29 341次阅读
    <b class='flag-5'>介绍</b>reactor的四种<b class='flag-5'>模型</b>

    C51单片机的IO介绍(下)

    上一篇文章我们对C51的IO简单的介绍了一下,现在我们来简单了解C51的IO的结构
    的头像 发表于 11-02 10:57 498次阅读
    C51单片机的<b class='flag-5'>IO</b>口<b class='flag-5'>介绍</b>(下)

    C51单片机的IO介绍(上)

    前面两篇文章我铺垫了IO输出高低电平的方法。
    的头像 发表于 11-02 10:56 498次阅读
    C51单片机的<b class='flag-5'>IO</b>口<b class='flag-5'>介绍</b>(上)

    多路IO复用模型和异步IO模型介绍

    多路 IO 复用模型 多路 IO 复用,有时也称为事件驱动 IO。它的基本原理就是有个函数会不断地轮询所负责的所有 socket ,当某个 socket有数据到达了,就通知用户进程。
    的头像 发表于 10-08 17:21 470次阅读
    多路<b class='flag-5'>IO</b>复用<b class='flag-5'>模型</b>和异步<b class='flag-5'>IO</b><b class='flag-5'>模型</b><b class='flag-5'>介绍</b>

    网络IO模型:阻塞与非阻塞

    阻塞 IO 模型 在Linux ,默认情况下所有的 socket 都是阻塞的,一个典型的读操作流程如图所示。 阻塞和非阻塞的概念描述的是用户线程调用内核 IO 操作的方式:阻塞是指 IO
    的头像 发表于 10-08 17:16 433次阅读
    网络<b class='flag-5'>IO</b><b class='flag-5'>模型</b>:阻塞与非阻塞

    IO如何实现

    IO模型 我们的程序基本上都是对数据的IO操作以及基于CPU的运算。 基于Java的开发大部分是网络相关的编程,不管是基于如Tomcat般的Web容器,或是基于Netty开发的应用间的RPC服务
    的头像 发表于 09-25 10:57 468次阅读
    <b class='flag-5'>IO</b>如何实现

    IO-Link演示系统介绍

    电子发烧友网站提供《IO-Link演示系统介绍.pdf》资料免费下载
    发表于 07-31 15:40 0次下载
    <b class='flag-5'>IO</b>-Link演示系统<b class='flag-5'>介绍</b>

    符号IO域和图形IO域的介绍

    符号IO域指已经编辑好的符号来显示输出输入变量。
    的头像 发表于 07-31 09:52 1213次阅读
    符号<b class='flag-5'>IO</b>域和图形<b class='flag-5'>IO</b>域的<b class='flag-5'>介绍</b>

    PLC IO接口的详细介绍

    让我们以汇辰H7系列PLC为例,认识以下PLC的IO接口的位置,西门子PLC的接口位置也完全相同。
    发表于 06-26 17:18 5332次阅读
    PLC <b class='flag-5'>IO</b>接口的详细<b class='flag-5'>介绍</b>

    IBIS建模:为何以及如何创建您自己的IBIS模型

    与SPICE模型类似。尽管还有本文未介绍其他类型的数字IO,但提取C_comp、I-V数据和V-T数据的程序可以作为创建其他类型IO模型的基
    的头像 发表于 06-15 17:06 1251次阅读
    IBIS建模:为何以及如何创建您自己的IBIS<b class='flag-5'>模型</b>

    Linux驱动学习笔记:异步IO

    前几篇介绍了几种IO模型,今天介绍另一种IO模型——异步IO
    发表于 06-12 16:24 447次阅读

    无线通信信号传输模型介绍

    、信噪比、远近效应都有影响。因此,在移动通信网络最初规划阶段,或今后的扩容、网络优化期间需要进行路径损耗预测。无线传播模型正是用来预测不同传播环境的路径损耗,从而更好的建设当地的无线通信
    发表于 05-06 11:40