浅析Linux系统I/O模型

news2025/1/25 4:26:26

文章目录

    • 概述
    • 阻塞式I/O模型
    • 非阻塞式I/O模型
    • I/O多路复用模型
    • 信号驱动式I/O模型
    • 异步I/O模型
    • 相关参考

概述

在操作系统中,I/O类操作是相对慢速的,应用发起一个I/O操作,需要等待I/O资源就绪后,才能继续后面的处理。这种简单的请求-响应的IO模型,很明显是无法满足实际生产环境对高并发、高吞吐的要求,因此,系统通常会提供多种I/O模型,以提高I/O操作的效率。Linux系统中支持5种I/O模型:

  • 阻塞式I/O;
  • 非阻塞式IO;
  • I/O多路复用模型
  • 信号驱动式IO;
  • 异步IO。

POSIX依据I/O操作是否会导致请求进程阻塞,将I/O操作分成同步I/O和异步I/O,其中:

  • 同步I/O操作会导致请求进程阻塞,直到I/O操作完成;
  • 异步I/O操作不会导致请求进程阻塞。

阻塞式I/O模型

阻塞式I/O是最基本的I/O模型,POSIX提供的大部分I/O类系统调用接口默认行为都是阻塞式的。以recvfrom操作为例,当应用进程发起recvfrom调用时,如果当前的数据没有就绪,那么调用进程会被阻塞并一直等待数据准备完成。recvfrom成功返回后,应用进程开始处理数据。
在这里插入图片描述

阻塞式I/O模型会导致应用进程大部分时间都在消耗在等待I/O上,而无法去处理其它事务。为了提升并发能力,早期的应用通常都会采用多进程或者多线程的方式来配合阻塞式I/O模型使用,但多进程和多线程带来的资源开销也很大程度上制约了系统的能力。

非阻塞式I/O模型

通过将套接字设置成非阻塞式,应用进程在执行I/O操作时,如果当前数据尚未就绪,那么调用会直接返回一个错误,在Linux中,这个错误类型通常是EWOULDBLOCK,指示数据还未准备好。应用进程可以不断选择进行重试,直到数据准备完成。
在这里插入图片描述

非阻塞式I/O模型不会导致应用进程阻塞,但不断重试的方案也会带来很高的CPU开销,因此非阻塞式I/O模型通常都会配合系统的I/O多路复用机制一起使用。

I/O多路复用模型

I/O多路复用是目前网络服务器编程使用最广泛的I/O模型,Reactor编程模型就是基于I/O多路复用进行实现。I/O多路复用提供了一类接口,可以等待多个描述符就绪,这样的好处在于应用进程可以只阻塞在I/O多路复用的接口中,只要监听的描述符中有一个资源准备就绪,应用进程就会被唤醒进行处理。
在这里插入图片描述

在Linux系统中,提供了三类I/O多路复用接口,分别为select、poll以及epoll,其中select/poll在监听的描述符较少的场景下使用;对于高并发应用,通常会使用epoll机制。

信号驱动式I/O模型

信号驱动式I/O模型在实际使用中并不多见,它通过让Linux内核在描述符就绪时发送SIGIO信号,通知应用进程可以执行I/O操作获取数据,从而避免了无谓的等待。
在这里插入图片描述

异步I/O模型

异步I/O在POSIX的语义中被定义为是真正的异步I/O操作类型,与前面四种I/O模型相比,异步I/O接口不需要等待数据就绪,甚至连数据读取的动作都不需要进行。异步I/O接口只是简单地提交一个I/O请求,后续所有事情都交给内核进行处理,内核会执行实际的I/O操作,并将数据从内核复制到应用的缓冲区,完成后通知应用进程进行数据处理。
在这里插入图片描述

异步I/O模型与信号驱动式I/O的主要区别在于:信号驱动式I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。Linux系统最早提供的异步I/O接口主要是aio系列函数,在5.1内核版本,又引入了新的高性能异步I/O框架io_uring。

相关参考

  • 《Unix网络编程》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/965460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-JavaScript - NORMINV函数

NORMINV函数取代了Excel 2010中的NORM.INV函数。 描述 对于指定的平均值和标准差,该函数返回正态累积分布的反函数。 语法 NORMINV (probability,mean,standard_dev)争论 Argument描述Required/OptionalProbabilityA probability corresponding to the normal distributio…

NVME Linux的查询命令-继续更新

NVME Linux的查询命令 查看NVMe设备 # nvme list 查看nvme controller 支持的一些特性 # nvme id-ctrl /dev/nvme0 查看设备smart log信息 # nvme smart-log /dev/nvme0 查看设备error 信息 # nvme error-log /dev/nvme0 设备的所有命名空间 # nvme list-ns /dev/nvmeX 检…

uni-app之android项目云打包

1,项目根目录,找到mainfest.json,如果appid是空的,需要生成一个appid 2,点击重新获取appid,这个时候需要登录,那就输入账号密码登录下 3,登陆后可以看到获取appid成功 4,…

企业文件加密防泄密软件系统——「天锐绿盾」

天锐绿盾是一款企业电子文件透明加密安全防泄密管理系统,采用文件过滤驱动技术,对电子文档进行实时动态保护,防止企业计算机信息被破坏、丢失、泄密等安全问题。 PC访问地址: 首页 以下是关于天锐绿盾的详细介绍: 透明…

密度图及山脊图绘图基础

文章目录 3 种绘制密度图方法对比多组数据、同一个核函数渐变颜色填充“山脊”图同一坐标系中多个密度图的绘制 Seaborn 的 kdeplot() 函数是 Python 中绘制密度图的方式之一,Matplotlib 在现阶段则没有具体的绘制密度图的函数,一般是结合 Scipy 库中的 …

又一关键系统上线,理想车云和自动驾驶系统登陆OceanBase

8 月 1 日,理想汽车公布 7 月交付数据,理想汽车 2023 年 7 月共交付新车 34,134 辆,同比增长 227.5%,并已连续两个月交付量突破三万。至此,理想汽车 2023 年累计交付量已经达到 173,251 辆,远超 2022 年全年…

异常处理

目录 异常处理 处理异常 方案一 方案二 小结 异常处理 程序开发过程中不可避免地会遇见异常现象在案例功能的实现中我们并没有设置如何对于程序出现异常时如何进行处理 在三层架构中,如果持久层程序运行出现错误,由于我们在三层架构中都没有设置如…

单调递增的数字【贪心算法】

单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 public class Solution {public int monotoneIncreasingDigits…

在支付宝中 下载社会保险参保证明 方法

这里 我们打开支付宝 选择 市明中心 然后选择 社保 这里 在社保查询下 找到 个人社会参保证明查询 这里 选择好自己的省市区 文件就会出现在下面了 我们直接点击这个文件进入 下面就会有下载的选项了

VBA技术资料MF51:VBA_在Excel中突出显示唯一值

【分享成果&#xff0c;随喜正能量】世间万物&#xff0c;因果循环不休&#xff0c;你的善心善行&#xff0c;都可能成为你的善缘善果。每天忆佛念佛&#xff0c;每天都在佛菩萨的加持下生活&#xff0c;自然吉祥如意&#xff0c;法喜充满。 。 我给VBA的定义&#xff1a;VBA是…

【C++习题集】-- 顺序表、链表

&#xff08;用于复习&#xff09; 目录 线性表 顺序表 链表 单链表 单向 \ 双向 带哨兵位 \ 不带哨兵位 循环 \ 非循环 无头单向非循环链表实现 oj题 203. 移除链表元素 206. 反转链表 快慢指针 141.环形链表 【解题思路】 带头双向循环链表 顺序表和链表的区…

windows系统开机自启打开指定网页

windows系统开机自启打开指定网页 1、在电脑桌面右击新建快捷方式&#xff0c;输入想要开机打开的网址 2、点击下一步输入自己想要命名的名字 3、使用快捷键winR运行&#xff0c;输入shell:startup&#xff0c;点击确定 4、把在桌面创建快捷方式拉到启动文件夹里面 5、这样就完…

冠达管理:“旺季”来临,煤炭板块走高,云煤能源、陕西黑猫涨停

煤炭板块1日盘中发力走高&#xff0c;截至发稿&#xff0c;云煤动力、陕西黑猫涨停&#xff0c;兖矿动力涨超7%&#xff0c;晋控煤业、华阳股份涨超6%&#xff0c;山西焦煤、平煤股份涨超5%。 组织表明&#xff0c;动力大通胀背景下&#xff0c;未来3-5年煤炭供需偏紧的格局仍…

了解JVM(JavaEE初阶系列19)

目录 前言&#xff1a; 1.JVM是如何运行的 2.JVM中的内存区域划分 3.JVM的类加载机制 3.1JVM加载机制的五大步骤 3.1.1加载 3.1.1验证 3.1.1准备 3.1.1解析 3.1.1初始化 3.2总结 3.3JVM启动时机 3.4双亲委派模型 4.JVM中的垃圾回收策略 4.1JVM垃圾回收机制概念 …

ssh常用操作

ssh常用操作 SSH是一种安全协议&#xff0c;ssh是该协议的客户端程序&#xff0c;openssh-server则是该协议的服务端程序 常用系统都自带了ssh客户端程序&#xff0c;服务端程序则可能要安装 密码远程登陆 前提&#xff1a;服务器安装了openssh-server&#xff0c;未安装时…

9.1QTday3作业

1 getSaveFileName //保存文件按钮对应的槽函数 void Widget::on_save_btn_clicked() {//调用QFileDialog的静态成员函数getSaveFileName来获取选中的文件路径QString fileName QFileDialog::getSaveFileName(this,"保存文件","./","Image File(*.p…

SQL知识点合集(最新)

SQL执行顺序 left join on and 和 inner join on and的多条件查询区别 left join on后面的and条件判断字段必须是左表 inner join on后面的and条件判断字段可以是左表或者右表 -- 查询一个课程包含那些题 SELECT c.id,t.title,t.id from course c left JOIN topical t ON t.cou…

Qt +VTK+Cmake 编译和环境配置(第三篇,高级篇, 已解决)

上篇说了&#xff0c;Cmake 虽然可以成功的build&#xff0c;但是大部分人都选择的是VS编译&#xff0c;没有人选择Qt自带的编译器编译。 在build文件夹 shift右键 进入cmd串口&#xff0c;执行mingw32-make mingw32-make 报错&#xff01;&#xff01;&#xff01;&#x…

Springboot整合logback多节点日志文件加端口号区分

描述&#xff1a;正常情况下&#xff1a;在Springboot 项目的resources目录下创建一个logback-spring.xml的日志配置文件&#xff0c;简单配置如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?><configuration debug"false"&g…

jQuery成功之路——jQuery的DOM操作简单易懂

jQuery的DOM操作 1.jQuery操作内容 jQuery操作内容 1. text() 获取或修改文本内容 类似于 dom.innerText 2. html() 获取或修改html内容 类似 dom.innerHTML 注意: 1. text() 是获取设置所有 2. html() 是获取第一个,设置所有 <!DOCTYPE html> <html lang"zh…