【I/O】Unix IO 介绍

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.mzph.cn/news/805246.shtml

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

相关文章

【UE 委托】如何利用函数指针理解委托的基本原理

目录 0 引言1 函数指针模拟多播委托 🙋‍♂️ 作者:海码007📜 专栏:UE虚幻引擎专栏💥 标题:【UE 委托】如何利用函数指针理解委托的基本原理❣️ 寄语:书到用时方恨少,事非经过不知难…

力扣239滑动窗口最大值——java中双端队列的一些知识

这道题. - 力扣(LeetCode)涉及到了双端队列的知识点,这里记录一下。Deque是可以从头部或者尾部来进行操作的。 Deque 是 Java 中双端队列(Double Ended Queue)的接口,它继承自 Queue 接口。双端队列允许在…

js base64 img 转 file

打印canvas图像的dataurl const imgDataUrl canvas.toDataURL();console.log(imgDataUrl)上传的图像编码 1,把base64编码转为文件对象第一个参数dataUrl是一个base64的字符串。第二个参数是文件名可以随意命名funtion base64toFile(dataurl, filename file) {let arr datau…

VSCode配置settings.json

快捷键 ctrl, 打开设置,右上角运行箭头的右边的那个图标,鼠标放到上面可以看到 “打开设置(json)” 点击它就能打开settings.json配置文件 常用的配置选项 "files.autoSave": "onWindowChange",// 当窗口失去焦点时,会…

Git 安装和配置

下载 Git 网址: https://git-scm.com/download 安装 Git 双击安装包, 开始安装. 修改安装路径, 选择非中文无空格路径: 开始安装: 安装成功: 配置 Git 安装完成后, 在任意文件夹内, 右键, 可以显示两个 Git 选项, 就说明安装成功了.

002 springboot整合mybatis-plus

文章目录 TestMybatisGenerate.javapom.xmlapplication.yamlReceiveAddressMapper.xmlreceive_address.sqlReceiveAddress.javaReceiveAddressMapper.javaIReceiveAddressServiceReceiveAddressServiceImpl.javaReceiveAddressController.javaTestAddressService.javaSpringboo…

汇舟问卷:海外问卷调查适合哪些人群去参与?

大家好,我是汇舟问卷。关于海外问卷调查这个项目最近一直备受关注,那么这个项目究竟有哪些人群适合参与进来呢?我们一起来看看。 第一,海外问卷调查适合一些没有找到工作或者拥有充足业余时间的人。只要您拥有一台电脑和网络连接…

IDEA 解决 java: 找不到符号 符号: 类 __ (使用了lombok的注解)

原因IDEA版本太高,在 ProcessingEnvironement 预编译的时候是以代理的方式来执行的,不再是直接 javac方式, lombok依赖的 javac方式的 annotation processors 不再生效了 解决办法:下面这一句,加在下图中 -Djps.track.ap.depen…

关于帆软报表取OA选择框-下拉列表值的解决方案

问题:制度一览表每次在OA端增加或修改制度类别后,都要在帆软报表修改后才能正确显示。 原因分析:以前大家没有找到OA下拉列表的维护表,采用的是在帆软端通过内置数据集来解决,需要人工维护。 解决方案: …

Linux函数学习 epoll

1、Linux epoll函数 1.1、创建epoll实例 int epoll_create1(int flag); 返回值:-1 失败,非负数 成功 flag :默认传入0 1.2、管理epoll对象 int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); epfd :e…

rebase和merge的区别

合并分支用rebase还是merge? 实际开发工作的时候,我们都是在自己的分支开发,然后将自己的分合并到主分支,那合并分支用2种操作,这2种操作有什么区别呢? git上新建一个项目,默认是有master分支…

“_, preds_m = torch.max(cls + cou2cls, 1)”为什么要将两者相加

将cls(分类预测)和cou2cls(分类和计数的组合预测)相加是一种常见的集成学习技术,目的是结合两种预测结果的优势来提高整体预测的准确性。在这个特定的场景中,有几个可能的原因和好处: 1. 信息融…

蓝桥杯物联网竞赛_STM32L071KBU6_我的全部省赛及历年模拟赛源码

我写的省赛及历年模拟赛代码 链接:https://pan.baidu.com/s/1A0N_VUl2YfrTX96g3E8TfQ?pwd9k6o 提取码:9k6o

MATLAB遗传算法物流配送中心选址进阶版案例讲解

MATLAB遗传算法物流配送中心选址进阶版案例讲解 MATLAB遗传算法物流配送中心选址进阶版案例讲解

贪心算法-分发饼干

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j]…

YOLOv8模型剪枝实战:DepGraph(依赖图)方法

课程链接:YOLOv8模型剪枝实战:DepGraph(依赖图)方法_在线视频教程-CSDN程序员研修院 YOLOv8是一个当前非常流行的目标检测器,本课程使用DepGraph(依赖图)剪枝方法对YOLOv8进行网络剪枝,使其更加轻量和实用…

Android源码笔记-输入事件(二)

这一节主要了解输入事件的获取,InputReaderThread继承自C的Thread类,Thread类封装了pthread线程工具,提供了与Java层Thread类相似的API。C的Thread类提供了一个名为threadLoop()的纯虚函数,当线程开始运行后,将会在内建…

Tubi 十岁啦!

Tubi 今年十岁了,这十年不可思议,充满奇迹! 从硅谷一个名不见经传的创业小作坊,转变成为四分之一美国电视家庭提供免费流媒体服务的北美领先的平台; 从费尽心力终于签下第一笔内容合作协议,到现在与 450 …

3岁以下幼儿玩具电脑电子方案

幼儿玩具电脑是一种专为儿童设计的电子教育产品,它通过提供多样化的学习内容和互动方式,旨在促进孩子的早期教育和发展。具体作用如下: 培养学习兴趣:早教机通常设计有丰富的教育资源和有趣的互动游戏,能够激发孩子对…

Mongodb快速入门

一、概述 1.1介绍 MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展高性能数据存储解决方案。(并不是单纯的内存数据库),官方地址 https://www.mongodb.com/ 操作语法与 JavaScript 类似,容易上手,学习成本低…