Linux常见IO模型

news2025/1/10 16:42:33

这篇博客开始我们Linux的最后一个章节--常见IO模型,在之前的博客当中我们讲述过Linux中基础的IO操作,欢迎大家去阅读。

我们通常指的IO操作便是数据的输入和输出,对应的具体操作过程我们可以将其分为两个步骤:等待IO就绪和数据拷贝,那么针对这两个方面我们设计出了一些相关的IO模型。

目录

1.阻塞IO

1.1内容

1.2优缺点

2.非阻塞IO

2.1内容

2.2优缺点

3.信号驱动IO

3.1内容

3.2优缺点

4.异步IO

4.1内容

4.2优缺点

5.多路转接模型

5.1内容

5.2优点

5.3实现

5.3.1接口介绍

5.3.2代码实现

1.阻塞IO

1.1内容

阻塞IO是指:发起IO操作之后,如果当前不具备IO操作的条件,则进程等待直到条件满足后再进行IO操作。

1.2优缺点

这样做有很明显的优点便是:实现流程简单;但是缺点同样也很突出,即:资源利用率低下,会占用进程,效率较低。

2.非阻塞IO

2.1内容

非阻塞IO是指:发起IO操作之后,如果当前具备IO操作的条件,则完成IO操作后返回,若不具备条件,则直接报错返回。可是这样简单进行判断的话,该怎么保证我们的IO操作可以被进行呢。程序中设计给出的答案是--循环,加入循环,对IO条件不断进行判断,直到执行。

2.2优缺点

这样操作的优点是:资源利用率高(不进行IO操作时,进程可以被分配完成其他任务);缺点也正是创造它优点的部分,即:需要进行循环操作,流程变的复杂,代码设计难度提x

值得注意的是,我们设计非阻塞IO的目的是:在等待IO条件满足时可以让进程完成其他任务,但这样的操作也会有一定的缺陷,那就是文件IO操作并不会是实时的了。也就是说,如果某一时间IO条件满足,但进程被分配的其他任务并没有完成,那么进程在完成该任务后,才会进行对应的IO操作。

3.信号驱动IO

3.1内容

信号驱动IO是指:定义IO信号的处理方式,IO就绪通过信号通知,打断进程当前操作,然后发起对应的IO调用。

3.2优缺点

信号驱动IO是在非阻塞IO的基础上进行设计的,是为了解决非阻塞IO无法确保实时处理IO操作的问题,因此它的优点也就呼之欲出,即:对资源利用更加充分,能更好的把控进程,并且对IO的操作是实时的;缺点也很明显:代码复杂度进一步提高,流程更加复杂。

4.异步IO

4.1内容

异步IO是指:发起异步IO操作,IO的等待以及数据的拷贝都有系统完成,完成之后通知进程。

4.2优缺点

异步IO的提出,让我们对资源的利用率达到的一定程度上的最高,我们只需要完成操作内容的通知以及操作结果的接收即可,并不需要去完成具体操作,如此设计的优点也就十分明了,即:对资源的利用率提升到了最高;缺点便是:对程序的复杂度也达到了最高。

5.多路转接模型

5.1内容

多路转接模型是一种高效的IO多路复用技术,使得单个进程能够处理多个IO事件,常用于高并发服务器技术的使用,让我们可以针对大量描述符进行IO就绪事件监控。

5.2优点

  • 让进程能够针对就绪的描述符进行IO操作,提高了任务的处理效率;
  • 避免进程因为对于未就绪描述符进行操作,而导致阻塞的情况。

5.3实现

多路转接模型的具体实现案例有很多,例如:select、poll和epoll等。我们针对select模型进行讲述,对于select模型而言,IO事件被分为三类:可读事件、可写事件和异常事件。它的主要流程思想是:

  • 定义指定IO事件的描述符集合;
  • 将需要对指定事件进行监控的描述符添加到指定集合当中;
  • 将事件的描述符集合拷贝到内核当中,进行事件监控;
  • 对集合中所有的描述符进行一次遍历,若没有就绪内容则将描述符挂到内核IO事件队列当中;
  • 若监控过程中,某一描述符就绪了所要监控的事件,则唤醒进程的阻塞;
  • 被唤醒后,select会再次将描述符集合遍历一遍,将集合中没有就绪的描述符移除;
  • 上三步完成监控后,只需要判断那一个描述符在集合当中,则该描述符就就绪了一个事件;
  • 于是进程可以根据就绪不同的事件对描述符进行不同的IO操作。

5.3.1接口介绍

Ⅰ、定义集合:

fd_set set;

本质上该集合是一个比特位图,默认拥有1024个比特位,取决于__FD_SETSIZE,因此select对描述符进行IO监控,存在有最大数量限制。

Ⅱ、初始化集合,将需要监控的描述符添加到集合当中:

void FD_ZERO(fd_set *set);//初始化清空集合
void FD_SET(int fd, fd_set *set);//将fd描述符添加到set集合当中
void FD_CLR(int fd, fd_set *set);//将fd描述符从set集合当中删除

Ⅲ、开始监听集合:

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

其中,int nfds是所有需要监控集合中,最大的描述符+1,提高遍历效率;fd_set *readfds是可读事件描述符;fd_set *writefds是可写事件描述符, fd_set *exceptfds是异常事件描述符。

struct timeval该结构体的内容如下:

struct timeval{
    time_t tv_sec;
    time_t tv_usec;
};

它的主要作用是设置本次监听阻塞时长,NULL表示一致阻塞,直到有描述符就绪或被信号打断。

select返回值为:返回实际就绪的描述符事件个数;出错返回-1;监听超时返回0(没有描述符就绪)。

Ⅳ、判断描述符在集合中,判断描述符就绪在事件中:

int FD_ISSET(int fd, fd_set *set);//判断fd描述符,是否在set集合中

5.3.2代码实现

设计代码使用相应接口对多路转接模型的内容进行简单实现,最后得到结果如下:

 

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

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

相关文章

Eclipse教程 Ⅵ

今天分享Eclipse Java 构建路径、Eclipse 运行配置(Run Configuration)和Eclipse 运行程序 Eclipse Java 构建路径 设置 Java 构建路径 Java构建路径用于在编译Java项目时找到依赖的类,包括以下几项: 源码包项目相关的 jar 包及类文件项目引用的的类…

postgresql 内核源码分析 语法解析 gram.y

专栏内容:postgresql内核源码分析个人主页:我的主页座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 目录 前言 概述 流程简介 调用流程 语法解析详细分解 raw_parser的主流程 词法…

Wireshark使用手册

目录 前言 Wireshark不能做的 Wireshark VS Fiddler 同类的其他工具 什么人会用到wireshark wireshark 开始抓包 Wireshark 窗口介绍 Wireshark 显示过滤 保存过滤 过滤表达式的规则 封包列表(Packet List Pane) 封包详细信息 (Packet Details Pane) wireshark与…

【CVPR_2023论文精读】E4S: Fine-grained Face Swapping via Regional GAN Inversion

【CVPR_2023论文精读】E4S: Fine-grained Face Swapping via Regional GAN Inversion 0、前言Abstract1. Introduction2. Related Work2.1 GAN Inversion2.2 Face Swapping 3. Methodology3.1. Editing-for-Swapping (E4S) Framework3.1.1 Reenactment.3.1.2 Swapping and Gene…

学习:双重差分模型DIDPSM-基于Stata实现

双重差分模型 定义 双重差分法(Difference in Differences): 通过利用观察学习的数据,计算自然实验中“实验组”与“对照组”在干预下增量的差距。 步骤: 分组:对于一个自然实验,其将全部的样本数据分为…

JMeter性能测试101:一步一步教你如何开始

1. Jmeter简介 Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件。相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工具之一。 2023年最新版Jmeter性能测试项目实战…

FFmpeg5.0源码阅读——mov文件格式解析

摘要:之前在Mp4格式详解中详细描述了Mp4文件格式的具体布局方式。为了更加深入理解mp4文件格式,本文记录了ffmpeg中解封装mp4文件的基本实现。关键字:mov、FFmpeg、mp4 1 简介 mp4文件格式是现如今网络上最常见的视频文件格式,其和mov等格式…

复合查询.

基本查询 查询工资高于500或岗位为MANAGER的雇员,同时还要满足他们的姓名首字母为大写的J select * from EMP where (sal>500 or jobMANAGER) and ename like J%;按照部门号升序而雇员的工资降序排序 select * from EMP order by deptno, sal desc;使用年薪进…

为建筑物的供暖系统实施MPC控制器的小型项目(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - 路由控制

目录 一、概述二、路由表(Routing table)三、最长匹配、默认路由、特定主机路由四 、IP数据报路由过程五、路由聚合 一、概述 网际协议 IP 大致分为三大作用模块, ①IP寻址、 ②路由(最终节点为止的转发) 、③IP分包与组包。前面两篇文章讨论…

dpdk ip分片报文重组处理

dpdk ip报文重组及分片API及处理逻辑介绍 DPDK的分片和重组实现零拷贝,详细介绍可以参阅DPDK分片与重组用户手则 相关数据结构 /** Fragmented packet to reassemble.* First two entries in the frags[] array are for the last and first fragments.*/ struct …

【测试平台开发】

【测试平台开发】 一、 后端开发 1、常见的技术架构与组件 语言: 项目注重高并发:选用go 注重区块链:选用go、rust(主打高性能) 大型浏览网站(如电商):Java 技术架构与组件: 前端技术架构&a…

多元回归预测 | Matlab白鲸算法(BWO)优化BP神经网络回归预测,BWO-BP回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab白鲸算法(BWO)优化BP神经网络回归预测,BWO-BP回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %--------------…

供收藏:国内各种免费可用ChatGPT实测(兼验伪) 版本不断更新补充 更新日期:2023/05/28

文章目录 供收藏:国内各种免费可用ChatGPT实测(兼验伪) 版本不断更新补充 更新日期:2023/05/28国内大厂的人工智能语言模型国内可访问的ChatGPT资源(创业公司)ZelinAI(国内可直接访问的ChatGPT)注册邀请码网…

2023全国大学生信息安全竞赛(ciscn)初赛题解

战队信息 安全知识 甚至不用看视频,百度就有答案。除了那个最新的美国时政,其它的ChatGPT就能回答。 Misc 签到卡 关注公众号,根据提示,直接print(open(‘/flag’).read()): 国粹 脑洞题,给的题目原图…

【LeetCode热题100】打卡第6天:正则表达式匹配

文章目录 正则表达式匹配⛅前言🔒题目🔑题解 正则表达式匹配 ⛅前言 大家好,我是知识汲取者,欢迎来到我的LeetCode热题100刷题专栏! 精选 100 道力扣(LeetCode)上最热门的题目,适合…

从原理总结chatGPT的Prompt的方法

一 什么是chatGPT chatGPT全称是Generative Pre-trained Transformer,它是一种专注于对话生成的语言模型,可以根据用户的文本输入,做出相应的智能回答。chatGPT是由OpenAI于2018年研发的语言模型,其中OpenAI是于2015年由特斯拉的…

Postman新手教程

博主简介:想进大厂的打工人博主主页:xyk:所属专栏: JavaEE初阶 目录 文章目录 一、Postman背景介绍 二、Postman下载地址 三、Postman简单使用 一、Postman背景介绍 Postman是Chrome插件类产品中的代表产品之一,这款网页调试工具不仅可以调…

位图布隆过滤器

位图 概念:就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。通常是用来判断某个数据存不存在的。 比如,需要在40亿个整数中,查看某个数是否存在? 1G1024M*1024KB*1024B~10亿字节~80亿比特。…

k8s实战篇1-用minikube发布服务hello-minikube

1 安装minikube curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 sudo install minikube-darwin-amd64 /usr/local/bin/minikube 2 Install kubectl binary with curl on macOS 1 Download the latest release: curl -LO "h…