I/O模型

2023-10-30

参考链接

I/O多路复用
IO多路复用之select、poll、epoll详解
epoll讲解
深入Go语言网络库的基础实现
I/O模型

I/O模型

1.1 阻塞I/O模型

  • 最常用的I/O模型,默认情况下,所有文件操作都是阻塞的。
  • 比如I/O模型下的套接字接口:在进程空间中调用recvfrom,其系统调用直到数据包到达且被复制到应用进程的缓冲区中或者发生错误时才返回,在此期间一直等待。
  • 进程在调用recvfrom开始到它返回的整段时间内都是被阻塞的,所以叫阻塞I/O模型。
    在这里插入图片描述

1.2 非阻塞I/O模型
recvfrom从应用层到内核的时候,就直接返回一个EWOULDBLOCK错误,一般都对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来
在这里插入图片描述

1.3 I/O复用模型

  • Linux提供select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样,select/poll可以帮我们侦测多个fd是否处于就绪状态。
  • select/poll是顺序扫描fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。
  • Linux还提供一个epoll系统调用,epoll使用基于事件驱动方式代替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数rollback。
    在这里插入图片描述

1.4 信号驱动I/O模型
首先开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,非阻塞)。当数据准备就绪时,就为改进程生成一个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理数据。
在这里插入图片描述

1.5 异步I/O

  • 告知内核启动某个操作,并让内核在整个操作完成后(包括数据的复制)通知进程。
  • 信号驱动I/O模型通知的是何时可以开始一个I/O操作,异步I/O模型有内核通知I/O操作何时已经完成。
    在这里插入图片描述

I/O模型区别

我相信很多人看过网上一篇关于epoll的讲解,在这里我用里面的举例来说。假如现在我要等快递员给我派送快递,那么各种I/O模型对应实际就是:

  • 阻塞I/O:我在家里一直等快递员电话,电话没来的时候我就睡觉,电话来了我就醒过来拿快递
  • 非阻塞I/O:我就一直醒着,而且我一直打电话给快递员:我的快递来了没?。就这样一直循环着
  • I/O多路复用:我用手机下载了一个快递助手,然后就去睡觉了。当有快递来的时候,快递助手就会响铃叫醒我,然后我再看是哪个快递就行了。

信号驱动和异步驱动的区别

链接

  • 信号驱动IO是指:进程预先告知内核,使得 当某个socketfd有events(事件)发生时,内核使用信号通知相关进程。
  • 异步IO(Asynchronous IO)是指:进程执行IO系统调用(read / write)告知内核启动某个IO操作,内核启动IO操作后立即返回到进程。IO操作即内核当中的服务例程。

异步I/O和信号驱动I/O的区别很容易被混淆。前者与后者的区别在于启用异步I/O意味着通知内核启动某个I/O操作,并让内核在整个操作(包括数据从内核复制到用户缓冲区)完成时通知我们。也就是说,异步I/O是由内核通知我们I/O操作何时完成,即实际的I/O操作也是异步的;而 信号驱动I/O是由内核通知我们何时可以启动一个I/O。
I/O究竟什么时候能用这个信息实际上只有内核才能 事先知道,因为是内核在最终处理系统中的所有打开的描述符。

  • 信号驱动I/O模型
    • 内核:I/O能用了。
    • 进程:接受到I/O能用的消息并执行接下来的操作。
  • 异步I/O模型
    • 内核:等待这个I/O有消息了,接受到数据。
    • 进程:从缓存中得到数据。

信号驱动的作用在于在等待I/O可用的过程中可以执行其它的指令,这种方法从理论上看 倒是不错。由于进程已经休眠,就不会再占用CPU,仅当I/O可用时它才恢复执行。但是这种方法的问题在于信号处理的开销有点大。若只是少数的请求还没有问题,若是每分钟收到100个请求,那就几乎一直都在捕获信号。每秒钟捕获上百个信号的开销是相当大的,不单是进程,对于内核发送信号的开销而言也是一样的。
  因此,在高性能的服务器编程中,用异步I/O来处理多个I/O更为高效。当然,也可以用I/O复用模型来实现(epoll是一个相当高效的方法),但是对于Regular File来说,是不能使用epoll的,因为不能设置非阻塞模式(O_NOBLOCK 方式对于传统文件句柄是无效的),这个时候,异步I/O是一个很不错的选择

I/O多路复用

  1. I/O多路复用就是通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。
  2. 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。

使用场景

IO多路复用是指内核一旦发现进程指定的一个或者多个IO条件准备读取,它就通知该进程。IO多路复用适用如下场合:
  1)当客户处理多个描述符时(一般是交互式输入和网络套接口),必须使用I/O复用。
  2)当一个客户同时处理多个套接口时,这种情况是可能的,但很少出现。
  3)如果一个TCP服务器既要处理监听套接口,又要处理已连接套接口,一般也要用到I/O复用。
  4)如果一个服务器即要处理TCP,又要处理UDP,一般要使用I/O复用。
  5)如果一个服务器要处理多个服务或多个协议,一般要使用I/O复用。

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

I/O模型 的相关文章

  • 二、Scikit-Learn简介

    参考url https jakevdp github io PythonDataScienceHandbook index html Scikit Learn为各种常用机器学习算法提供了高效版本 xff0c 因其干净 统一 管道命令式的AP
  • scikit-learn安装

    一 关于Numpy的安装 最直接的就是在python目录下 xff0c 通过命令窗口 xff0c 直接运行 xff1a pip install numpy 但不知为什么 xff0c 我一直下载失败 xff0c 所以尝试了如下方法 xff0c
  • scikit-learn介绍

    在机器学习和数据挖掘的应用中 xff0c scikit learn是一个功能强大的python包 在数据量不是过大的情况下 xff0c 可以解决大部分问题 学习使用scikit learn的过程中 xff0c 我自己也在补充着机器学习和数据
  • boost learn notes

    lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt boost learn notes boost learn notes Documents http www boost org
  • scikit-learn_Scikit Learn-简介

    scikit learn Scikit Learn 简介 Scikit Learn Introduction In this chapter we will understand what is Scikit Learn or Sklear
  • 机器学习库scikit-learn简介(一)

    一 机器学习问题 通常 xff0c 学习问题考虑n个样本数据集 xff0c 然后预测未知数据的属性 若各个样本多于一个 xff0c 例如 xff0c 对于多维的条目 xff08 又称多元数据 xff09 xff0c 即说有多个属性或特性 我
  • 【机器学习】Scikit-learn介绍

    一 Scikit learn简介 Scikit learn是一个支持有监督和无监督学习的开源机器学习库 它还为模型拟合 数据预处理 模型选择和评估以及许多其他实用程序提供了各种工具 二 拟合和预测 xff1a 估算器基础 Fitting a
  • CVPR2019超分辨率 《zoom to learn,learn to zoom》《Camera lens super resolution 》

    CVPR2019超分领域出现多篇 xff0c 更接近于真实世界原理的低分辨率和高分辨率图像对应的新思路 具体来说 xff0c 以前论文训练数据主要使用的是人为的bicubic下采样得到的 xff0c 网络倾向于学习bicubic下采样的逆过
  • 【超分辨率】Zoom to Learn, Learn to Zoom

    前几天陈启峰大佬在我司内部分享几篇关于图像增强的文章 其中就有这篇 这篇文章是超分辨率落地的一个比较重要的文章 xff0c 跟以往自己去做高 低分辨率数据集不同 xff0c 本文采取了单反直接去制作数据集 xff0c 在真实场景上效果非常好
  • Zoom to Learn, Learn to Zoom

    Abstract 本文表明 xff0c 将机器学习应用于数字变焦时 xff0c 对真实 原始的传感器数据进行操作是有益的 现有的基于学习的超分辨率方法不使用真实的传感器数据 xff0c 而是对经过处理的RGB图像进行操作 我们表明 xff0
  • scikit-learn issues - classification metrics can‘t handle a mix of continuous-multioutput ...

    classification metrics can t handle a mix of continuous multioutput and multi label indicator targets 示例场景 xff1a cm 61 c
  • 安装scikit-learn问题

    1 问题描述如下 xff1a pytorch root 64 cento conda install scikit learn Solving environment failed CondaHTTPError HTTP 000 CONNE
  • 机器学习-scikit-learn

    文章目录 前言线性回归模型 LinearRegression准备数据集使用LinearRegression总结 前言 scikit learn是Python中最流行的机器学习库之一 xff0c 它提供了各种各样的机器学习算法和工具 xff0
  • scikit-learn no moudule named six

    在scikit learn版本0 23中删除了模块sklearn externals six 解决方案 要使用它 xff0c 你必须降级到0 22版本及以下 xff0c 可以执行以下命令 pip install scikit span cl
  • Meta-Learning: Learning to Learn Fast

    Meta Learning Learning to Learn Fast 元学习 学习如何学习 译 原文 本文与原文基本没有区别 xff0c 仅供个人学习记录 电子笔记本 前言 xff1a 元学习解决 xff1a 遇到没有见过的任务 xff
  • imbalanced-learn API 传送门

    imbalanced learn API API详情可见User guide 或者见我的其余四篇关于imblearn的博客 即我翻译的doc 1 python imblearn toolbox 解决数据不平衡问题 一 imblearn简介
  • 使用MATLAB做传热学分析及后处理——CFDTool 官方例程

    目录 前言 1 环境配置 2 问题背景 3 传热学例程 heat transfer3 最后 中国加油 武汉加油 前言 cfdtool 官网 https www cfdtool com 是一个MATLAB的扩展工具箱 既然看到这个CFD问题了
  • React 16官网 (main concepts) 浏览

    翻译一下官网 顺便了解一下React 16版本的新特性 照旧 从Hello World开始 ReactDOM render h1 Hello world h1 document getElementById root 在集成了React的必
  • scala数据结构

    元组 val tuple Bigdata 2020 748 333 容器 collection Scala Collection Seq 索引0 1 2 LinearSeq gt 列表 相同类型 不可变 队列 列表 var strList
  • 8款免费企业邮箱

    1 谷歌免费企业邮箱 已收费 标准版 https www google com a cpanel domain new 教育版 https www google com a cpanel education new支持50个帐号 目前每个帐

随机推荐

  • SQL自定义排序

    方法一 比如需要对SQL表中的字段NAME进行如下的排序 张三 Z 李四 L 王五 W 赵六 Z 按照sql中的默认排序规则 根据字母顺序 a z 排 结果为 李四 王五 赵六 张三 自定义排序 order by charindex NAM
  • Linux Shell/python等脚本总结

    转换为大写字母 bin bash upper Usage upper string printf s n 1 upper 1 文本内容排序 sorted file name py usr bin env python3 file open
  • 美化Cadence Library Manager

    完整版请参考 https mazhaoxin github io 2019 01 09 Pretty Cadence Libmanager http 483v7j coding pages com 2019 01 09 Pretty Cad
  • js里的$符号的作用

    今天在看数据库js代码 javascript还没看完 很多 符号 有点晕 查了一下 下面是感觉解决了我疑问的答案 原文地址 https www cnblogs com yongtaiyu archive 2011 05 13 2045726
  • 查看Linux内核配置文件(.config)

    config是内核配置文件 在不同场景下获得方法不一样 1 源代码 在kernel文件夹下 按快捷键 Ctrl H 显示隐藏文件 即可找到 config文件 2 当前Linux系统 当前的Linux内核的配置文件保存到了 proc conf
  • python中摄氏度的符号咋打_linux下怎么方便的输入度数符号 °

    你的位置 问答吧 gt Linux 入门 gt 问题详情 linux下怎么方便的输入度数符号 在windows下可以用Alt 0176输入 在MAC下也有方便的方法可以输入 在linux下呢 参见 http anonymouse org c
  • maven pox.xml记录

  • STM32中SPI数据读取、调试过程中问题的探讨。

    1 SPI总线读取数据 许多STM32的SPI数据读取存在问题 举个例子 设备现需要3个命令 通过命令字才能将我们需要的数据输出 则SPI通讯过程就是 D0 gt D1 gt D2 gt 空数据 0x00 gt 读取数据 然而 由于SPI结
  • 超越DALL·E

    目录 摘要 引言 方法 文本条件扩散模型 无分类器指导的微调 图像绘画 带噪 CLIP 模型 结果 欢迎关注 CVHub 官方微信公众号 Title GLIDE Towards Photorealistic Image Generation
  • RabbitMQ内存监控及自动重启的shell脚本

    RabbitMQ内存监控及自动重启 功能简介 Shell脚本 systemd托管 这个脚本是用来监控 RabbitMQ 进程的内存占用情况 如果内存占用超过设定的阈值并且达到设定的检查次数 则自动重启 RabbitMQ 服务 功能简介 脚本
  • SaaS、PaaS、IaaS云服务模式和商业云平台设计与建设方案

    1 云计算的三种服务模式 云计算是一种新的计算资源使用模式 云端本身还是 IT 系统 所以逻辑上同样可以划分为这四层 底三层可以再划分出很多 小块 并出租出去 这有点像立体停车房 按车位大小和停车时间长短收取停车费 因此 云服务提供商出租计
  • TS 错误property does not exist on type Object

    在TypeScript中如果按JS的方式去获取对象属性 有时会提示形如Property value does not exist on type Object 的错误 具体代码如下 var obj Object Object create
  • JAVA代码规则对照表

    JAVA代码规则对照表 Try with resources should be used 应该使用带有资源的Try with resources Creating cookies without the secure flag is se
  • java 实现 AES 加解密

    package com dechnic tfoms util import org apache shiro crypto hash Sha256Hash import org slf4j Logger import org slf4j L
  • 渗透学习 信息收集

    人生在世三万天 有酒有肉小神仙 小白入坑学废集6 基本信息收集 信息收集 域名信息 敏感目录 端口扫描 旁站C段 整站分析 谷歌hacker URL采集 后台查找 CDN绕过方法 就算我不成器 你又是个什么东西 基本信息收集 信息收集 域名
  • 用Python进行数据分析——起步

    一 安装Anaconda与Jupyter notebook 在学习一门编程语言之前 选一个称手的工具至关重要 对于用Python进行数据分析而言 Anaconda与Jupyter notebook目前已成为标准环境 1 咱们知道conda是
  • js中的with()用法

    with语句 作用域名 一个可以按序检索的对象列表 通过它可以进行变量名的解析 with语句用于临时拓展作用域链 语法如下 with object statement method 这条语句将object添加到作用域链的头部 然后执行函数体
  • linux shell 的多行注释

    解决方案之一 强硬的注释 首先介绍方法 我们在C C 中 可以使用 的方式注释掉整块的代码 在Linuxshell脚本中 我们有一个变通的方法 有效的代码段 lt
  • [2018 徐州 网络赛

    题目来源 After Incident a feast is usually held in Hakurei Shrine This time Reimu asked Kokoro to deliver a Nogaku show duri
  • I/O模型

    参考链接 I O多路复用 IO多路复用之select poll epoll详解 epoll讲解 深入Go语言网络库的基础实现 I O模型 I O模型 1 1 阻塞I O模型 最常用的I O模型 默认情况下 所有文件操作都是阻塞的 比如I O