【IO 模型】Unix IO 介绍

news2024/12/22 23:03:25

IO 模型(一)

Unix IO

一个输入操作共包含两个阶段:

  • 等待数据准备好
  • 从内核将数据复制到进程

对于一个套接字上的输入操作,通常第一步是等待数据从网络中到达,当数据到达时,先将数据复制到内核缓冲区中,第二步就是将数据从内核缓冲区中复制到应用进程的缓冲区中

Unix IO 有五个模型:

  • 阻塞式 IO
  • 非阻塞式 IO
  • IO 多路复用(select 和 poll)
  • 信号驱动 IO
  • 异步 IO(AIO)

阻塞式 IO

阻塞式 IO 的阻塞说的是,在进行 IO 操作时,应用进程将会阻塞,直到数据被复制到进程缓冲区中才返回。

在阻塞式 IO 中,应用进程阻塞时并不意味着其他程序也被阻塞,其他的程序依旧可以运行,因此阻塞式 IO 在阻塞过程中不消耗 CPU 资源,这种模型的效率会比较高。

下面的代码中,recvfrom 用于接收 Socket 传来的数据,并复制到应用进程缓冲区。这里的 recvfrom 当做系统调用

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

阻塞式IO

非阻塞式 IO

非阻塞式 IO 的非阻塞是,在进行 IO 操作时,应用进程不会阻塞,会系统调用定时轮询检查数据是否准备好,若没准备好内核会返回一个错误码,这种方式 CPU 会处理更多的系统调用,因此效率会比较低

在这里插入图片描述

IO 多路复用

使用 select 或是 poll 等待数据,并且可以等待多个套接字中任何一个变为可读,这个过程会进行阻塞,当某个套接字可读时返回,在使用 recvfrom 进行复制

IO 多路复用可以让单个进程有处理多个 IO 事件的能力,例如,一个 Web 服务器没有多路复用,每一个 Socket 连接都要创建一个线程去处理,如果同时有几万个连接,那么就需要创建相同数量的线程。

在这里插入图片描述

信号驱动 IO

应用进程使用 sigaction 进行系统调用,内核立即返回,应用进程可以继续执行,也就是说,在内核等待数据到达阶段应用进程是非阻塞的,可以继续执行。内核在数据到达后,会向应用进程发送 信号 ,应用进程在收到信号后,会在信号处理程序中调用 recvfrom 进行系统调用将数据复制到应用进程。

在这里插入图片描述

异步 IO

应用程序进行 aio_read 系统调用,立即返回,应用进程继续执行不会阻塞,内核在完成所有操作之后,向进程发送信号,异步 IO 的信号通知应用进程 IO 完成,而信号驱动 IO 的信号是通知应用进程可以开始 IO

在这里插入图片描述

同步 IO 与 异步 IO

  • 同步 IO:应用进程在调用 recvfrom 时会阻塞

  • 异步 IO:不会阻塞

阻塞式 IO、非阻塞式IO、IO多路复用、信号驱动 IO 都是同步 IO,虽然非阻塞式 I/O 和信号驱动 I/O 在等待数据阶段不会阻塞,但是在之后的将数据从内核复制到应用进程这个操作会阻塞。

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

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

相关文章

REST API实战演练之JavaScript使用Rest API

咱们前面讲了一下如何创建REST API 假期别闲着:REST API实战演练之创建Rest API-CSDN博客 又讲了java客户端如何使用REST API 假期别闲着:REST API实战演练之客户端使用Rest API-CSDN博客 接下来咱们看看JavaScript怎么使用REST API。 一、新建一个…

软件杯 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🥇学长这里给一个题目综合评分(每项满…

(自用笔记)每天一点vue3——vue3+elementPlus+express获取excel数据并渲染到页面上

我是想做一个vue3echarts的账单数据展示项目,因为有vue2的基础,打算直接在这个项目上熟悉掌握vue3的新特性。这系列笔记就按照遇见问题解决问题的思路更新,不按照官方快速上手的章节,特此说明。 目标:利用nodejs搭建后…

GPT提示词分享 —— 中医

👉 中医诊断涉及因素较多,治疗方案仅供参考,具体的方子需由医生提供。AI建议不能替代专业医疗意见,如果症状严重或持续,建议咨询专业医生。 我希望你能扮演一位既是老中医同时又是一个营养学专家,我讲描述…

gitlab、jenkins安装及使用文档一

gitlab-jenkins安装文档 IP地址操作系统服务版本192.168.75.137Rocky9.2jenkins 2.450-1.1 jdk 11.0.22 git 2.39.3192.168.75.138Rocky9.2gitlab-ce 16.10.0 gitlab安装 前期准备: 关闭防火墙及 SELinuxsystemctl disable --now firewalld sed -i s/^SELINUXenforcing$…

TCP 重传、滑动窗口、流量控制、拥塞控制(计算机网络)

重传机制 TCP 针对数据包丢失的情况,会用重传机制解决。 接下来说说常见的重传机制: 超时重传快速重传SACKD-SACK 超时重传 重传机制的其中一个方式,就是在发送数据时,设定一个定时器,当超过指定的时间后&#xff0c…

ComfyUI本地部署

一、部署准备 1. Comfyui下载 git clone https://github.com/comfyanonymous/ComfyUI.git2. 插件下载 辣椒酱的界面汉化: https://github.com/AIGODLIKE/AIGODLIKE-COMFYUI-TRANSLATION 提示词风格样式: https://github.com/twri/sdxl_prompt_styler …

RabbitMQ进阶——死信队列

RabbitMQ进阶——死信队列 什么是死信队列? 在消息队列中,执行异步任务时,通常是将消息生产者发布的消息存储在队列中,由消费者从队列中获取并处理这些消息。但是,在某些情况下,消息可能无法正常地被处理…

360加固脱壳实战

下载[]打开app使用frida -U -f com.xxx.xxx.xxx -l dupDex.js --no-pause<br> 命令 或者使用frida-hexdump -U -f com.inmo.inmolife命令在com.xxx.xxx.xxx 中寻找dex文件 或者在输出的日志中有输出路径使用dex2jar工具把dex文件转为jar文件 d2j-dex2jar.sh *.dex -d --…

为什么电脑越用越慢!

电脑随着时间推移逐渐变慢是一个常见的现象,其背后涉及多种原因。以下是导致电脑运行速度变慢的几个主要因素: 系统资源消耗增加 软件更新与新增应用:随着软件版本的更新和新应用程序的安装,它们往往对硬件资源的需求更高,尤其是对处理器、内存和硬盘的要求。这些新软件可…

深入理解Linux veth虚拟网络设备:原理、应用与在容器化架构中的重要性

在Linux网络虚拟化领域&#xff0c;虚拟以太网设备&#xff08;veth&#xff09;扮演着至关重要的角色&#x1f310;。veth是一种特殊类型的网络设备&#xff0c;它在Linux内核中以成对的形式存在&#xff0c;允许两个网络命名空间之间的通信&#x1f517;。这篇文章将从多个维…

N1922A是德科技N1922A功率传感器

181/2461/8938产品概述&#xff1a; N192XA 传感器是首款通过将直流参考源和开关电路集成到功率传感器中来提供内部调零和校准的传感器。此功能消除了与使用外部校准源相关的多个连接&#xff0c;从而最大限度地减少了连接器磨损、测试时间和测量不确定性。 连接到 DUT 时进行…

ORA-00600: internal error code, arguments: [krbcbp_9]

解决方案 control_file_record_keep_time 修改 恢复时间窗口 RMAN (Recovery Manager) 是 Oracle 数据库的备份和恢复工具。在 RMAN 中&#xff0c;可以使用“恢复窗口”的概念来指定数据库可以恢复到的时间点。这个时间点是基于最近的完整备份或增量备份。 要设置恢复窗口的…

Flutter之TabBar篇

总结了一下项目中用到的几种TabBar&#xff0c;针对不同的样式&#xff0c;有采用系统提供的&#xff0c;也有三方插件提供的&#xff0c;也有自定义的&#xff0c;效果如下&#xff08;后续如果遇到新的样式&#xff0c;会不间断地记录更新&#xff0c;避免重复造轮子…&#…

嵌入式开发中常用的资源网站分享

1.综合网站 //B站是一个有很多好资料的网站 MOOC中国 - 慕课改变你&#xff0c;你改变世界 //这个就不用多说了&#xff0c;国内的同学应该都用过 2.基础学习&#xff08;C/C&#xff0c;QT上位机等&#xff09;★★★★★ C 标准库 - 参考手册 | 菜鸟教程 C语言中文网&…

TDengine too many open files

too many open files 是比较常见的报错&#xff0c;尤其使用TDengine 3.0 集群时&#xff0c;大概率会遇到。这个报错很简单&#xff0c;但要想顺利解决&#xff0c;却涉及到很多知识点。 目录 知识点&#xff1a;fs.nr_open知识点&#xff1a;file-max & fs.file-nr知识点…

LeetCode-322. 零钱兑换【广度优先搜索 数组 动态规划】

LeetCode-322. 零钱兑换【广度优先搜索 数组 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;Python动态规划五部曲&#xff1a;定推初遍举【先遍历物品 后遍历背包】解题思路二&#xff1a;Python动态规划五部曲&#xff1a;定推初遍举【先遍历背包 后遍历物品】解题思…

thinkphp5关联预载入with指定字段属性查询

一、thinkphp5.0 如果要指定属性查询&#xff0c;可以使用&#xff1a; $list User::field(id,name)->with([profile>function($query){$query->field(email,phone);}])->select([1,2,3]); foreach($list as $user){// 获取用户关联的profile模型数据dump($user…

二、显示图片、提取边缘特征并保存(C# + OpenCV)

实现功能&#xff1a; 1&#xff0c;打开照片&#xff0c;并显示 2&#xff0c;对选择的照片进行Canny边缘检测 3&#xff0c;保存边缘检测之后的结果 一、布局 打开在视图下打开工具箱 选择一个PictureBox&#xff0c;仨Button 对Button改个名字 仨Button&#xff0c;分别…

Word中图表题注样式自动编号

需求 在写论文的时候&#xff0c;希望图表题注是下面的样子&#xff0c;其中图号表示为&#xff1a;章的编号-本章中图的序号&#xff0c;而且都是小写数字。 网上找的方法大多是使用 “插入题注” 来插入&#xff0c;此时章的编号是大写的&#xff0c;如“图一-1”。然后再通…