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

    文章

    6797

    浏览量

    88730
  • 模型
    +关注

    关注

    1

    文章

    3111

    浏览量

    48646

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

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

收藏 人收藏

    评论

    相关推荐

    解析一体式IO与分布式IO:从架构到应用

    在工业自动化领域,IO(输入/输出)系统扮演着举足轻重的角色。它们不仅负责数据的采集和控制指令的发送,还直接影响到系统的灵活性、可靠性和成本效益。明达技术将为您介绍一体式IO和分布式IO
    的头像 发表于 10-08 10:02 158次阅读
    解析一体式<b class='flag-5'>IO</b>与分布式<b class='flag-5'>IO</b>:从架构到应用

    使用pSpice进行仿真时,TL071模型为什么只有个管脚?

    我在使用pSpice进行仿真时,在TI下载的TL071模型只有个管脚,但是实际是由8个管脚的,那这5个管脚都是对应的哪几个呢?希望用过的能帮忙指导一。 还有个疑问就是在使用TINA进行仿真
    发表于 08-28 06:44

    【《大语言模型应用指南》阅读体验】+ 俯瞰全书

    ,了解此书的主要内容: 书分四篇,基础、入门、进阶和展望。 基础篇从人工智能起源开始、之后又介绍了机器学习、神经网络和大语言模型的基础知识,如果读者学习过机器学习相关课程,那这个基础篇的阅读就会很轻
    发表于 07-21 13:35

    IO与PLC的差异及应用

    为您介绍io模块与PLC的差异及其各自的应用场景
    的头像 发表于 07-18 15:54 928次阅读
    <b class='flag-5'>IO</b>与PLC的差异及应用

    一体式IO与分布式IO:工业控制系统的两架构

    受到青睐。然而,一体式IO架构在小型系统中仍然有着广泛的应用。了解这两架构的特点和区别,有助于工程师和决策者为企业选择最合适的工业控制系统解决方案。
    的头像 发表于 07-17 16:12 777次阅读
    一体式<b class='flag-5'>IO</b>与分布式<b class='flag-5'>IO</b>:工业控制系统的两<b class='flag-5'>种</b>架构

    波特模型和swot分析的区别

    波特模型和SWOT分析是两常用的战略分析工具,它们在企业战略规划和管理中发挥着重要作用。尽管它们都用于评估企业的竞争环境和内部条件,但它们在分析方法、侧重点和应用范围等方面存在明显的区别
    的头像 发表于 07-05 14:39 3171次阅读

    什么是波特模型,如何应用

    波特模型(Porter's Five Forces Model)是迈克尔·波特(Michael E. Porter)于1979年提出的,用于分析行业竞争状况和企业竞争战略的一理论模型
    的头像 发表于 07-05 14:36 939次阅读

    简述使用波特模型的三个步骤

    波特模型(Porter's Five Forces Model)是迈克尔·波特(Michael E. Porter)于1979年提出的一个分析行业竞争态势的框架。它通过分析个方面的力量,帮助
    的头像 发表于 07-05 14:34 570次阅读

    人脸检测的方法各有什么特征和优缺点

    人脸检测是计算机视觉领域的一个重要研究方向,主要用于识别和定位图像中的人脸。以下是常见的人脸检测方法及其特征和优缺点的介绍: 基于肤色的方法 特征:基于肤色的方法主要利用人脸肤色与背景肤色的差异
    的头像 发表于 07-03 14:47 593次阅读

    MES深化应用级成熟度模型介绍

    电子发烧友网站提供《MES深化应用级成熟度模型介绍.docx》资料免费下载
    发表于 02-23 17:10 1次下载

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

    IO多路复用是一同步IO模型,它允许单个进程/线程同时处理多个IO请求。具体来说,一个进程/线程可以监视多个文件句柄,一旦某个文件句柄就绪
    的头像 发表于 01-18 15:48 1552次阅读

    微调大模型的方法介绍

    全微调(Full Fine-tuning):全微调是指对整个预训练模型进行微调,包括所有的模型参数。在这种方法中,预训练模型的所有层和参数都会被更新和优化,以适应目标任务的需求。
    发表于 01-03 10:57 2.3w次阅读
    四<b class='flag-5'>种</b>微调大<b class='flag-5'>模型</b>的方法<b class='flag-5'>介绍</b>

    大信号模型和小信号模型的区别

    大信号模型和小信号模型是电子工程和通信领域中常用的两模型,它们在描述和分析电子电路或系统时具有不同的特点和应用范围。以下是关于大信号模型
    的头像 发表于 12-19 11:35 9098次阅读

    redis的数据类型

    )和有序集合(sorted set)。下面将详细介绍这五种数据类型,包括其特点、应用场景和使用方法。 字符串(String) 字符串是 Redis 最为基础的数据类型,它可以保存任意类型的数据,例如整数、浮点数、二进制数据等。字符串可以进行一系列操作,如设置值、获取值、增
    的头像 发表于 11-16 11:06 589次阅读

    异步IO框架iouring介绍

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