Linux--高级IO

2023-11-08

高级IO

1. 五种IO模型

  1. 阻塞IO:在内核将数据准备好之前,系统调用会一直等待。 所有的套接字,默认都是阻塞方式。阻塞IO是最常见的IO模型。

    image-20230804210918500

  2. 非阻塞IO:如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。

    非阻塞IO往往需要程序员循环的方式反复尝试读写文件描述符,这个过程称为轮询。这对CPU来说是较大的浪费,一般只有特定场景下才使用。

    image-20230804211025736

  3. 信号驱动IO:内核将数据准备好的时候,使用SIGIO信号通知应用程序进行IO操作。

    image-20230804211115859

  4. IO多路转接:虽然从流程图上看起来和阻塞IO类似。实际上最核心在于IO多路转接能够同时等待多个文件描述符的就绪状态。

    image-20230804211145987

  5. 异步IO:由内核在数据拷贝完成时,通知应用程序(而信号驱动是告诉应用程序何时可以开始拷贝数据)。

    image-20230804211315265

小结:

任何IO过程中,都包含两个步骤。第一是等待,第二是拷贝。而且在实际的应用场景中,等待消耗的时间往往都远远高于拷贝的时间。让IO更高效,最核心的办法就是让等待的时间尽量少。

2. 高级IO重要概念

2.1 同步通信 vs 异步通信

同步和异步关注的是消息通信机制:

  • 所谓同步,就是在发出一个调用时,在没有得到结果之前,该调用就不返回。但是一旦调用返回,就得到返回值了;换句话说,就是由调用者主动等待这个调用的结果;
  • 异步则是相反,调用在发出之后,这个调用就直接返回了,所以没有返回结果;换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果;而是在调用发出后,被调用者通过状态、通知来通知调用者,或通过回调函数处理这个调用。

另外, 多线程的时候也提到同步和互斥,这里的同步通信和进程之间的同步是完全不同的概念:

进程/线程同步也是进程/线程之间直接的制约关系是为完成某种任务而建立的两个或多个线程,这个线程需要在某些位置上协调他们的工作次序而等待、传递信息所产生的制约关系. 尤其是在访问临界资源的时候

2.2 阻塞 vs 非阻塞

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。

  • 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
  • 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

2.3 其他高级IO

非阻塞IO,纪录锁,系统V流机制,I/O多路转接(也叫I/O多路复用),readv和writev函数以及存储映射IO(mmap),这些统称为高级IO。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux--高级IO 的相关文章

  • 推荐用于小型站点的 IRC 服务器 (ircd)? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 情况 我想使用 IRC 机器人作为我正在研究的其他代码的通用通信接口 服务器硬件陈旧且内存不足 但运行在相对最新的 Debian GNU
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • Fortran 中的共享库,最小示例不起作用

    我试图了解如何在 Linux 下的 Fortran 中动态创建和链接共享库 我有两个文件 第一个 liblol f90 看起来像这样 subroutine func print lol end subroutine func 我用它编译gf
  • 如何在gnuplot中将字符串转换为数字

    有没有办法将表示数字 以科学格式 的字符串转换为 gnuplot 中的数字 IE stringnumber 1 0e0 number myconvert stringnumber plot 1 1 number 我可能使用 shell 命令
  • 如何确定代码是否在信号处理程序上下文中运行?

    我刚刚发现有人正在从信号处理程序调用我编写的绝对不是异步信号安全的函数 所以 现在我很好奇 如何避免这种情况再次发生 我希望能够轻松确定我的代码是否在信号处理程序上下文中运行 语言是 C 但该解决方案不适用于任何语言吗 int myfunc
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • 在 Docker 容器中以主机用户身份运行

    在我的团队中 我们在进行开发时使用 Docker 容器在本地运行我们的网站应用程序 假设我正在开发 Flask 应用程序app py具有依赖关系requirements txt 工作流程大致如下 I am robin and I am in
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • Python将文件从Linux复制到WIndows

    我正在构建一个网站 该网站有一个表单 可以捕获用户数据并在用户数据上运行一些cgi cgi 的第一步是需要将文件从 Linux Web 服务器复制到 Windows 计算机 服务器将使用 Active Directory 角色帐户作为复制凭
  • 在 Linux 控制台中返回一行?

    我知道我可以返回该行并用以下内容覆盖其内容 r 现在我怎样才能进入上一行来改变它呢 或者有没有办法打印到控制台窗口中的特定光标位置 我的目标是使用 PHP 创建一些自刷新的多行控制台应用程序 Use ANSI 转义码 http en wik
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom
  • 如何回忆上一个 bash 命令的参数?

    Bash 有没有办法回忆上一个命令的参数 我通常这样做vi file c其次是gcc file c Bash 有没有办法回忆上一个命令的参数 您可以使用 or 调用上一个命令的最后一个参数 Also Alt can be used to r
  • 由于 abi::cxx11 符号导致的链接问题?

    我们最近收到一份报告 因为GCC 5 1 libstdc 和双 ABI http gcc gnu org onlinedocs libstdc manual using dual abi html 它似乎Clang 不知道 GCC 内联名称
  • 如何从程序内部获取指向程序的特定可执行文件部分的指针? (也许是诽谤)

    我在 Linux 环境中 需要编写一个程序来检索放置在其可执行文件的某个部分中的一些数据 那么 如何从程序内部获取指向程序某个部分 通过其名称 的指针呢 我知道可以使用elf getdata 将节的索引作为参数传递给 get 和Elf Da
  • 如何在 Linux 中向热敏打印机发送 ESC/POS 命令

    我正在尝试在热敏打印机上发送 ESC POS 命令 但每当我发送它们时 热敏打印机都会将它们打印为文本 而不是作为命令执行它们 我在 prn 文件中编写这些命令 每当我执行 lp 命令来打印文件时 这些 prn 文件也会被打印 但作为文本
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到

随机推荐

  • 大数据课程I3——Kafka的消息流与索引机制

    文章作者邮箱 yugongshiye sina cn 地址 广东惠州 本章节目的 掌握Kafka的消息流处理 掌握Kafka的索引机制 掌握Kafka的消息系统语义 一 Kafka消息流处理 1 Producer 写入消息 流程说明 1 p
  • yolov5转tensorrt c++

    目录 yolo tensorrt 下载weights模型 onnx tensorrt project 编译问题解决 依赖项 自己生成weights模型 以及加载报错解决 生成引擎报错解决 批量预测 自动创建引擎 解决检测框乱的问题 提速 b
  • 对接微信米大师虚拟支付2.0文档

    话不多说 上代码 支付密钥算法 public static String calcPaySig String uri String postBody String appKey String needSignMsg uri postBody
  • 前端框架之Vue学习(一)

    1 Vue简介 一 vue 是一套用于构建用户界面的渐进式框架 二 Vue的核心特点 1 相应的数据变化 当数据发生改变 gt 视图自动更新 2 组合的视图组件 UI页面映射为组件树 划分组件可维护 可复用 可测试 三 MVC和MVVM M
  • 计算机中丢失ucrtbased.dll

    如果在运行某软件或编译程序时提示缺少 找不到ucrtbased dll等类似提示 在 https cn dll files com ucrtbased dll html 下载 解压 如果您的系统是64位的请将dll文件复制到C Window
  • 火猴之抽奖大转盘(firemonkey)

    活动中往往有抽奖环节 如何使用firemonkey制作一个抽奖的程序呢 效果 思路 1 rectangle line text作为可以转动的转盘和指针以及按钮 2 pie 共 10个作为不同颜色的底 每个startangle和endangl
  • Linux系统离线安装包及其依赖的下载安装

    一 概述 我们在Linux系统下进行项目开发时 经常会出现缺少某些依赖库或者开发包的情况 这时候一般会通过使用apt命令去联网下载 但在某些特殊情况下 例如终端硬件不支持网络连接 周边缺少有线与无线网络 或者需要批量安装程序到很多终端上时
  • Window平台---IPSEC客户端的安装

    1 安装主机证书 参见证书的申请与安装一节 2 从http vpn ebootis de 站点下载 ipsec exe 3 下载windwos2000的ipsec资源工具 http download microsoft com downlo
  • 代码保护软件VMProtect用户手册控制面板“项目”部分都有哪些功能?

    VMProtect是一种很可靠的工具 可以保护应用程序代码免受分析和破解 但只有在应用程序内保护机制正确构建且没有可能破坏整个保护的严重错误的情况下 才能实现最好的效果 下载VMProtect最新试用版 接下来为大家介绍关于VMProtec
  • 移动距离(跳出C++向下取整带来的误区)

    移动举例问题 文章目录 移动举例问题 问题详情 问题分析 跳出误区 代码 问题详情 X星球居民小区的楼房全是一样的 并且按矩阵样式排列 其楼房的编号为 1 2 3 当排满一行时 从下一行相邻的楼往反方向排号 比如 当小区排号宽度为 6时 开
  • perl进程管理

    原文链接 https www jc2182 com perl perl process manager html 进程管理 您可以按照各种要求使用 Perl 来创建新流程 本教程将列出创建和管理Perl流程的一些重要且最常用的方法 您可以使
  • 使用ChatGPT帮助快速读书:《Rise of the Robots: Technology and the Threat of a Jobless Future》

    有了ChatGPT的帮助 读书也快了 英文版的书也可以快速了解其主要内容 不知道这样囫囵吞枣的阅读有没有其它副作用 先读了几本再说 Rise of the Robots Technology and the Threat of a Jobl
  • 【论文笔记】BEIT V2: Masked Image Modeling with Vector-Quantized Visual Tokenizers

    1 介绍 1 1 核心观点 当时的所有的重建目标都是关于低级图像元素的 低估了高级语义 Q 怎么去定义高级和低级语义 1 2 基本流程 VQ KD编码器首先根据可学习码本将输入图像转换为离散令牌 然后 解码器学习重建由教师模型编码的语义特征
  • 前后端获取当前日期

    js直接获取当天时间 标准格式年月日 时分秒 往后推迟时间 则添加 1小时 60 60 1000 new Date new Date 8 3600 1000 toJSON substr 0 19 replace T 后端获取 new Sim
  • git cherry-pick 解决开发分支选错问题

    应用场景 正常开发流程 创建分支并checkout转换为开发分支进行开发 但我在master开发后commit之后意识到了这个问题 重新git pull后并checkout新分支发现代码改动遗失 因为git pull 会把当前分支覆盖 在请
  • Network 【HDU - 3078】【LCA+暴力查询】

    题目链接 你要是真暴力这道题还是要T的 但是 做了剪枝就会过了 我们知道对于LCA每个节点有它自己的深度 在这里 我就将每个节点的深度数组当作了每个节点道最初根节点的距离了 然后 就是剪枝操作饿了 判断是否是可行解的时候用的是dis x d
  • 最新最全的angular4.x、anuglar2、anuglar8入门实战视频教程

    angular4 x视频教程强势来袭 忙碌的工作 不停的充电 好久没遇到这么实用的教程了 跟同行分享一下 写篇文章 放松放松 有好的技术资源的也希望大家多分享 我会关注学习的 angular4 x angular5 x angular8 x
  • 洛谷 P1876 开灯

    题目链接 https www luogu com cn problem P1876 include
  • 图像分析技术大比拼:图像分类、图像识别、目标检测的优缺点分析与算法比较

    计算机视觉是人工智能领域的一个重要分支 它旨在构建能够理解和处理图像 视频等视觉信息的计算机系统 在计算机视觉领域中 图像分类 图像识别和目标检测是三个重要的任务 一 图像分类 图像分类是计算机视觉领域最基础的任务之一 它的目的是将一张图像
  • Linux--高级IO

    高级IO 1 五种IO模型 阻塞IO 在内核将数据准备好之前 系统调用会一直等待 所有的套接字 默认都是阻塞方式 阻塞IO是最常见的IO模型 非阻塞IO 如果内核还未将数据准备好 系统调用仍然会直接返回 并且返回EWOULDBLOCK错误码