Input/Output模型

news2024/10/7 14:28:20

  I/O在计算机里指的是INPUT/OUTPUT,也就是输入/输出。IOPS即每秒钟的输入输出量。I/O的工作机制就是把数据从内核空间中的内存数据复制到用户空间中进程的内存当中。

  Linux的I/O

  • 磁盘I/O

    磁盘I/O是进程向内核发起系统调用,请求磁盘上的某个资源,然后通过相应的驱动程序将目标文件加载到内核的内存空间,加载完成后把数据从内核内存再复制给进程内存,如果是比较大的数据也需要等待时间。

  • 网络I/O:一切皆文件,本质为对socket文件的读写

    网络通信就是网络协议栈到用户空间进程的IO就是网络IO

1.客户端发起请求 先发送到网卡   
2.网卡收到的报文复制到内核空间
3.内核空间再复制到用户空间的应用程序空间
4.nginx 分析得到一个磁盘页面文件
5.再将需求反馈给内核空间,应为应用程序没有权限从磁盘上直接读取文件,需要依靠内核
6.内核去磁盘上找到所需要的文件,加载到内核空间
7.加载后再复制到用户空间
8.用户空间构建响应报文,交给内核空间,内核空间再复制给网卡,返回给用户
整个过程会来回切换 用户空间,内核空间  那么我们可以再次基础上做优化处理

简单来说,A(nginx)--------->B(内核),A程序布置一个任务给B,B的任务就是找到某个文件,先复制内核,再复制给我。

  零拷贝技术

    传统的Linux系统的标准I/O借口是基于数据拷贝的,也就是数据都是“拷贝给用户”或者“从用户那儿拷贝”。

    优点:通过中间缓存的机制,减少磁盘I/O的操作

    缺点:消耗大量CPU资源,降低传输速率。

  MMAP

     mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问

    mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。

    优点:可以实现不同进程中的文件共享,适合数据大量传输。

  1. I/O模型相关概念

    同步/异步(消息反馈机制) :关注的是消息通讯机制,即调用者在等待一件事情的处理结果时,被调用者是否提供完成状态的通知。

    同步:被调用者并不提供事件的处理结果相关的通知消息,需要调用者主动询问事情是否处理完成。简而言之,发起者需要主动联系执行者是否完成。

    异步:被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态。简而言之,执行者会自动反馈,是否完成。

    阻塞/非阻塞: 关注调用者在等待结果返回之前所处的状态

    阻塞:指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起,干不了别的事情。简而言之,只可以做一件事,必须要等这件事情完成才能进行下一件事。

    非阻塞:指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,在最终的调用结果返回之前,调用者不会被挂起,可以去做别的事情。简而言之,在等待时间可以做其他事。

  2. 网络I/O模型

    阻塞型、非阻塞型、复用型、信号驱动型、异步

  2.1 阻塞性I/O模型

    阻塞IO模型是最简单的I/O模型,用户线程在内核进行IO操作时被阻塞用户线程通过系统调用read发起I/O读操作,由用户空间转到内核空间。内核等到数据包到达后,然后将接收的数据拷贝到用户空间,完成read操作用户需要等待read将数据读取到buffer后,才继续处理接收的数据。整个I/O请求的过程中,用户线程是被阻塞的,这导致用户在发起IO请求时,不能做任何事情,对CPU的资源利用率不够。

    优点:基本不占用资源

    缺点:为何程序、内存、线程切换开销较大

  2.2 非阻塞性I/O模型

    用户线程发起IO请求时立即返回。但并未读取到任何数据,用户线程需要不断地发起IO请求,直到数据到达后,才真正读取到数据,继续执行。即 “轮询”机制存在两个问题:如果有大量文件描述符都要等,那么就得一个一个的read。这会带来大量的Context Switch(read是系统调用,每调用一次就得在用户态和核心态切换一次)。轮询的时间不好把握。这里是要猜多久之后数据才能到。等待时间设的太长,程序响应延迟就过大;设的太短,就会造成过于频繁的重试,干耗CPU而已,是比较浪费CPU的方式,一般很少直接使用这种模型,而是在其他IO模型中使用非阻塞IO这一特性。

  2.3 多路复用I/O型

    I/O multiplexing 主要包括:select,poll,epoll三种系统调用,select/poll/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/poll/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。Apache prefork是此模式的select,work是poll模式。

  2.4 信号驱动式I/O模型

    调用的步骤是,通过系统调用 sigaction ,并注册一个信号处理的回调函数,该调用会立即返回,然后主程序可以继续向下执行,当有I/O操作准备就绪,即内核数据就绪时,内核会为该进程产生一个SIGIO 信号,并回调注册的信号回调函数,这样就可以在信号回调函数中系统调用 recvfrom 获取数据,将用户进程所需要的数据从内核空间拷贝到用户空间。 

   当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。

  • 优点:线程并没有在等待数据时被阻塞,内核直接返回调用接收信号,不影响进程继续处理其他请求因此可以提高资源的利用率
  • 缺点:信号 I/O 在大量 IO 操作时可能会因为信号队列溢出导致没法通知

  2.5 异步I/O模型

    异步I/O是由内核通知我们I/O操作何时完成,所有事情都交给内核处理。

    异步I/O与信号驱动I/O的区别

  • 信号驱动I/O:何时开始一个IP操作
  • 异步I/O是由内核通知我们I/O操作何时完成

    ginx支持在多种不同的操作系统实现不同的事件驱动模型,但是其在不同的操作系统甚至是不同的系统版本上面的实现方式不尽相同,主要有以下实现方式:

selectpollepoll
操作方式遍历遍历回调
底层实现数组链表哈希表
IO效率每次调用都是线性遍历,时间复杂度O(n)每次调用都是线性遍历,时间复杂度O(n)事件通知方式,每当fd就绪,系统注册的回调函数就会被调用,将就绪的rdlllist,事件复杂度O(1)
最大连接数

1024(x86)

2048(x64)

无上限无上限
fd拷贝每次调用都要把fd集合从用户拷贝到内核态每次调用poll都需要把fd集合从用户态拷贝到内核态调用epoll_ctl时拷贝近内核并保存,之后每次epoll_wait不拷贝
缺点

1.数量受到限制

2.效率降低

3.开销成本大

1.数量受到限制

2.效率降低

3.开销成本大

使用次数基本不用目前主流

    select和epoll的区别

select:会轮询遍历所有的事件集合,其次遍历的事件个数有限制

epoll:只会遍历已准备好的事件集合,事件个数无限制

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

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

相关文章

论文阅读_时序模型_iTransformer

1 2 3 4 5 6 7 8英文名称: ITRANSFORMER: INVERTED TRANSFORMERS ARE EFFECTIVE FOR TIME SERIES FORECASTING 中文名称: ITRANSFORMER:倒置Transformers在时间序列预测中的有效性 链接: https://openreview.net/forum?idX6ZmOsTYVs 代码: https://github.com/thum…

深度学习 精选笔记(13.2)深度卷积神经网络-AlexNet模型

学习参考: 动手学深度学习2.0Deep-Learning-with-TensorFlow-bookpytorchlightning ①如有冒犯、请联系侵删。 ②已写完的笔记文章会不定时一直修订修改(删、改、增),以达到集多方教程的精华于一文的目的。 ③非常推荐上面(学习参考&#x…

7.搜索——1.广度优先搜索BFS(求最优解)

广度优先遍历实现思路 构建辅助队列实现先进先出构建访问集,给已经访问的结点进行标记将起始结点加入队列当队列非空时: 取出队首元素将队首元素的所有邻居入队访问队首元素 队列空即访问完毕 用途:求最优解 例题——catch that cow 代码 …

【LabVIEW FPGA入门】流水线

LabVIEW中流水线 在当今多核处理器和多线程应用程序的世界中,程序员在开发应用程序时需要不断思考如何最好地利用尖端 CPU 的强大功能。尽管用传统的基于文本的语言构建并行代码可能难以编程和可视化,但 NI LabVIEW 等图形开发环境越来越多地允许工程师和…

小狐狸ChatGPT智能聊天系统源码v2.7.6全开源Vue前后端+后端PHP

测试环境包括Linux系统的CentOS 7.6,宝塔面板,PHP 7.4和MySQL 5.6。网站的根目录是public, 使用thinkPHP进行伪静态处理,并已开启SSL证书。 该系统具有多种功能,包括文章改写、广告营销文案创作、编程助手、办公达人…

健身·健康行业Web3新尝试:MATCHI

随着区块链技术进入主流,web3 运动已经开始彻底改变互联网,改写从游戏到金融再到艺术的行业规则。现在,MATCHI的使命是颠覆健身行业。 MATCHI是全球首个基于Web3的在线舞蹈健身游戏和全球首个Web3舞蹈游戏的发起者,注册于新加坡&a…

6_20240304开窗

目录 课堂 SQL执行顺序: 开窗函数 累加order by 开窗格式: 排名 三种排名: 偏移 上偏移 下偏移 同环比 加子查询的几种方式 1 放在 select 后面 2 放在 from 后面 当表 ​3 放在where 后 4 放在HAVING 后面 作业 1.Ord…

Unity在UGUI上通过绘制网格顶点自由画线

该插件的实现是使用UI组件的绘图API来动态生成和修改几何形状,可自由动态更改画线的粗细、拐角圆滑度、颜色,自由增减节点,不额外增加gameobject,并且在原生的UGUI上以ScreenSpace-Overlay的状态下,显示效果如下所示 …

rust引用本地crate

我们可以动态引用crate,build时从crate.io下载,但可能因无法下载导致build失败。首次正常引用三方crate,build时自动下载的crate源码,我们将其拷贝到固定目录中; build后可在RustRover中按住Ctrl键,在crat…

Python的网络爬虫介绍与实战

Python的网络爬虫基础介绍与实战 定义流程包和函数静动态网页爬虫实战红牛分公司?二手房数据(静态网页)豆瓣读书(动态网页) 定义 网络爬虫是按照一定的规则,自动地抓取万维网(www)信…

【Kubernetes】k8s删除master节点后重新加入集群

目录 前言一、思路二、实战1.安装etcdctl指令2.重置旧节点的k8s3.旧节点的的 etcd 从 etcd 集群删除4.在 master03 上,创建存放证书目录5.把其他控制节点的证书拷贝到 master01 上6.把 master03 加入到集群7.验证 master03 是否加入到 k8s 集群,检查业务…

用尾插的思想实现移除链表中的元素

目录 一、介绍尾插 1.链表为空 2.链表不为空 二、题目介绍 三、思路 四、代码 五、代码解析 1. 2. 3. 4. 5. 6. 六、注意点 1. 2. 一、介绍尾插 整体思路为 1.链表为空 void SLPushBack(SLTNode** pphead, SLTDataType x) {SLTNode* newnode BuyLTNode(x); …

[大模型]ollama本地部署自然语言大模型

文章目录 ollama下载地址githup百度云 模型默认安装位置模型修改默认安装位置可下载模型相关命令 Chatbox客户端下载地址githup百度云 设置ollama模型并运行 大模型已经发布很久,网络上的大模型形形色色,现在已然是群英荟萃,那么,…

2.vscode 配置python开发环境

vscode用着习惯了,也不想再装别的ide 1.安装vscode 这一步默认已完成 2.安装插件 搜索插件安装 3.选择调试器 Ctrl Shift P(或F1),在打开的输入框中输入 Python: Select Interpreter 搜索,选择 Python 解析器 选择自己安…

AI基础知识(2)--决策树,神经网络

1.什么是决策树? 决策树是一类常见的机器学习方法,决策树是基于树的结构来进行决策。决策过程中提出的每一个问题都是对于属性的“测试”,决策的最终结论对应了我们希望的判定结果。一个决策树包含一个根节点,若干个内部节点和若…

实时云渲染及云交互技术的关系

一、实时云渲染和云交互技术 实时云渲染是一种新兴的技术,它可以将用户的计算机上的数据通过云服务器进行渲染,从而实现实时渲染的效果,实时渲染可以在加速渲染速度的同时,实现更高质量的渲染效果、减轻用户的计算机负担、全方位…

【go语言开发】性能分析工具pprof使用

本文主要介绍如何在项目中使用pprof工具。首先简要介绍pprof工具的作用;然后介绍pprof的应用场景,主要分为工具型应用和服务型应用。最后数据分析项目,先采集项目信息,再可视化查看 文章目录 前言应用场景工具型应用服务型应用 数…

22 OpenCV 直方图计算

文章目录 直方图概念split 通道分离函数calcHist 计算直方图normalize 归一化函数示例 直方图概念 上述直方图概念是基于图像像素值,其实对图像梯度、每个像素的角度、等一切图像的属性值,我们都可以建立直方图。这个才是直方图的概念真正意义&#xff0…

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第六:trans_nullmodel class

近几十年来,系统发育分析和零模型的整合通过增加系统发育维度,更有力地促进了生态位和中性影响对群落聚集的推断。trans_nullmodel类提供了一个封装,包括系统发育信号、beta平均成对系统发育距离(betaMPD)、beta平均最近分类单元距离(betaMNT…

时间序列预测的零样本学习是未来还是炒作:TimeGPT和TiDE的综合比较

最近时间序列预测预测领域的最新进展受到了各个领域(包括文本、图像和语音)成功开发基础模型的影响,例如文本(如ChatGPT)、文本到图像(如Midjourney)和文本到语音(如Eleven Labs&…