计算机IO原理

news2025/2/25 13:59:41

一、中断机制

在IO处理中有2种思路,一种就是轮训(polling)机制,一种是中断(interrupt)机制,前置是一种同步的通信机制,不是计算机中IO采用的机制,我们重点来说明中断机制。

CPU停下当前的工作任务,去处理其他事情,处理完后回来继续执行刚才的任务,这一过程便是中断。中断分为外部中断和内部中断。

外部中断

  1. 可屏蔽中断:通过INTR线向CPU请求的中断,主要来自外部设备如硬盘,打印机,网卡等。此类中断并不会影响系统运行,可随时处理,甚至不处理,所以名为可屏蔽中断。
  2. 不可屏蔽中断:通过NMI线向CPU请求的中断,如电源掉电,硬件线路故障等。这里不可屏蔽的意思不是不可以屏蔽,不建议屏蔽,而是问题太大,屏蔽不了,不能屏蔽的意思。

内部中断

  1. 陷阱:是一种有意的,预先安排的异常事件,一般是在编写程序时故意设下的陷阱指令,而后执行到陷阱指令后,CPU将会调用特定程序进行相应的处理,处理结束后返回到陷阱指令的下一条指令。如系统调用,程序调试功能等。
  2. 故障:故障是在引起故障的指令被执行,但还没有执行结束时,CPU检测到的一类的意外事件。出错时交由故障处理程序处理,如果能处理修正这个错误,就将控制返回到引起故障的指令即CPU重新执这条指令。如果不能处理就报错。常见的故障为缺页。
  3. 终止:执行指令的过程中发生了致命错误,不可修复,程序无法继续运行,只能终止,通常会是一些硬件的错误。终止处理程序不会将控制返回给原程序,而是直接终止原程序。

二、DMA机制

在现代计算机中,进行磁盘IO或者网络IO的时候,CPU是不会全程参与的,CPU只会下发数据传输的指令,比如是读还是写,设备类型还有内存地址等发送给设备的设备控制器,后续会由设备和内存直接进行数据传输,这样就能节省CPU昂贵的开销,这就是DMA机制。

DMA的主要成就是将耗时较久的数据IO时间直接交由内存和设备来做,不太需要CPU的参与,让CPU去做更有价值的事情。

没有DMA之前:

984DA54F-54BB-4557-A0C1-53E7F3283A48
  1. 用户进程调用read()请求到CPU;
  2. CPU向IO设备发送请求;
  3. IO设备将数据准备到内存缓存区后向CPU发送中断请求;
  4. CPU接受到中断请求后,就将数据拷贝到page cache中,这个过程一直持续到数据传输完成;
  5. 数据传输完成后,read()调用返回数据;
  6. 整个过程中,CPU一直阻塞在IO设备拷贝数据到page cache的这个过程;

DMA解决CPU数据拷贝阻塞的问题:

EC959CE5-CDCC-4FFB-BFC5-C54EC5B7AAEC
  1. 用户进程调用read()请求到CPU;
  2. CPU向DMA控制器发起IO请求,再由DMA向IO设备发起IO请求;
  3. IO设备数据准备好了,是向DMA发送数据,一直等数据都传到DMA了,由DMA向CPU发送中断请求;
  4. DMA控制器将数据一致性发送给CPU,在这个过程中CPU不需要一直阻塞;

总结:DMA相当于在CPU和IO设备间加入了一个中间层,之前他们直接交互,现在DMA等数据传输好了再通知CPU。

三、零拷贝(zero copy)

传统的数据拷贝过程中,数据需要从内核缓冲区复制到用户空间缓冲区,然后再从用户空间缓冲区复制到内核缓冲区,这个过程会耗费大量的CPU时间和内存带宽,降低系统的性能和吞吐量。

为了解决这个问题,零拷贝技术应运而生。零拷贝技术是指在数据传输过程中,尽量避免将数据从一块内存拷贝到另一块内存,从而减少了CPU的开销和内存带宽的消耗,提高了系统的性能。

20D00351-14AA-4D89-8A36-81494AC3F600

未应用零拷贝技术之前:

  1. 磁盘数据通过dma拷贝到内核态的缓存区;
  2. 内核空间缓存区的数据通过cpu拷贝到用户空间的缓存区,其中涉及到2次的用户态内核态上下文切换;
  3. 用户空间缓存区的数据通过cpu拷贝到用户空间的socket缓存区,其中涉及到2次的用户态内核态上下文切换;
  4. socket缓存区的数据通过dma拷贝到网卡发送出去;

传统的IO拷贝技术,会有4次数据拷贝,2次系统调用,4次上下文切换,但是由于内核态到用户态的数据拷贝不涉及数据的运算,所以理论上不需要拷贝到用户态;

目前有2中常见的零拷贝技术:(1)mmap+write;(2)sendfile;

1.mmap技术

DC2F78BD-4B41-4944-8AA8-81E1CF9998AD
  1. 调用mmap方法,直接将内核缓存区的数据进行数据共享;
  2. 将共享缓存区的数据通过cpu拷贝到socket缓存区;
  3. 内核态的socket缓存区的数据直接通过dma拷贝到网卡;

通过mmap技术,解决用户态无法访问内核态数据的的问题,能够直接在内核态进行数据的拷贝,这样就减少了在用户态进行CPU拷贝的过程;

2.sendfile技术

对于mmap技术,还是会有2次系统调用,造成4次上下文切换。

现在引入sendfile调用,直接是将缓存区的描述符传递给socket缓存的描述符,直接替换read和write调用,这样只需要一次系统调用,2次上下文中断;

68E90DF6-AC1F-4CB2-8485-207BFFA63139

四、IO多路复用技术

IO多路复用技术是指这样一个过程:

  1. 获取IO操作的文件描述符,将其放到文件描述符集合中保存,IO操作包括网络IO或者磁盘IO等;
  2. 系统调用一个函数,这个函数替操作系统监控文件描述符集合中事件,比如read()或者write()事件;
  3. 当有事件监听到,就通知工作线程来执行;

过程中描述的函数在Linux中select、poll、epoll实现。

1.select

将所有连接的socket文件描述符放置到文件描述符集合中,通过select函数将其复制到内核态空间,检查其网络事件,该检查是通过轮训的方式,并且该描述符集合是顺序表保存。所以保存的文件描述符有限。

select是一种轮训机制,会去轮训文件状态描述符,缺点是轮训对象有限,64位的Linux系统也只能是2048个;将已经连接的socket文件描述符放置到数组中,再将该数组拷贝到内核空间中做检查,看哪些socket是在read还是write状态,然后对其进行处理。

2.poll

poll看起来和select实现的机制差不多,只是没有了socket连接数量的限制,这是由于他是用链表来保存socket文件描述符;

3.epoll

epoll是基于OS的事件通知机制,socket事件发生了会将事件通知到工作线程处理;

总结:select和poll的实现都是监听对象轮训文件描述符集合中事件,select中文件描述符集合有限,poll中文件描述符集合理论上上无限,但其工作线程其实是阻塞的,就是一直在等待他们将事件报送过来在进行处理。

epoll是基于事件机制来实现,其实现是在对每个文件描述符后都记录其对应的工作线程信息,但监听到事件就能直接通知工作线程来工作。

本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

burpsuite+proxifier小程序抓包

burpsuiteproxifier小程序抓包 安装bp证书到系统 配置

mybatis/mp批量插入非自增主键数据

文章目录 前言一、mp的批量插入是假的二、真正的批量插入1.利用sql注入器处理2.采用自编码,编写xml批量执行生成内容如下: 三 问题问题描述问题原因问题解决粘贴一份,兼容集合替换原有文件 总结自增与非自增区别: 前言 mybatis/mp 在实际开发中是常用的优秀持久层框架,但是在非…

实现表格表头自定义编辑、一键导入、增加列

1.前言 本文基于vue2及elementUI的表格组件 2.效果及功能展示 3.需求背景 有时候客户急需看到需求实现的页面,而此时后端接口没有,产品原型没有,只能前端出马,画一个静态页面,来展示客户想要的东西,如果是…

P1827 [USACO3.4] 美国血统 American Heritage(前序 + 中序 生成后序)

P1827 [USACO3.4] 美国血统 American Heritage(前序 中序 生成后序) 一、前言 二叉树入门题。涉及到树的基本知识、树的结构、树的生成。 本文从会从结构,到完成到,优化。 二、基础知识 Ⅰ、二叉树的遍历 前序遍历&#xff…

CRM软件系统维护客户的主要方法

客户的重要性,相信每一个做企业的人都非常清楚。为了维护好客户,很多企业都使用CRM客户管理系统,建立“以客户为中心”的经营理念,提高企业客户服务水平,进而在提高客户满意度的同时提高企业的盈利。那么,企…

ubuntu、linux in window安装docker教程

1、首先进入管理员权限。 2、更新软件源。 sudo apt update 3、安装一些依赖 sudo apt install apt-transport-https ca-certificates curl software-properties-common 4、为系统添加Docker的密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-k…

28.CSS 渐变圆文本动画

效果 源码 index.html <!doctype html> <html> <head><meta charset="utf-8"><title>Glowing Gradient Circle Text Animation</title><link rel="stylesheet" href="style.css"> </head> &l…

合同被篡改,被变更,被调换风险大?君子签电子合同有效化解

纸质合同签署文件类型多&#xff0c;签署量大&#xff0c;人为干预较多&#xff0c;合同被篡改&#xff0c;被变更&#xff0c;被调换风险大&#xff0c;难以防范和避免。 请注意&#xff0c;出现以下几个情况&#xff0c;代表你已经遭遇合同“调包计”了&#xff01; 1、合…

“undefined reference to XXX“问题总结

"undefined reference to XXX"问题总结 引言 我们在Linux下用C/C工作的时候&#xff0c;经常会遇到"undefined reference to XXX"的问题&#xff0c;直白地说就是在链接(从.cpp源代码到可执行的ELF文件&#xff0c;要经过预处理->编译->链接三个阶…

换台电脑python使用uiautomator2操作逍遥模拟器

前几天写了一篇文章python使用uiautomator2操作雷电模拟器_小小爬虾的博客-CSDN博客 今天用另外一个环境和模拟器再次测试。 环境如下&#xff1a;win7 sp1 64位&#xff1b;Python3.8.10&#xff1b;逍遥模拟器9.0.6&#xff1b;android版本9&#xff1b;逍遥模拟器自带adb版…

【数据结构】顺序表与ArrayList

作者主页&#xff1a;paper jie 的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

2023研究生数学建模D题思路代码 区域双碳目标与路径规划研究

D题思路代码 区域双碳目标与路径规划研究 完整解题思路可看视频&#xff1a; 2023华为杯研赛D题区域双碳目标与路径规划研究&#xff08;附代码全保姆教程&#xff09;_哔哩哔哩_bilibili​www.bilibili.com/video/BV1Cm4y157CH/?spm_id_from333.999.0.0 问题一&#xff1a;…

将序列中的每一行重复扩展为指定数量的行Series.repeat()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将序列中的每一行 重复扩展为指定数量的行 Series.repeat() [太阳]选择题 以下说法正确的是 import pandas as pd s1pd.Series([10, 25, 3]) s1.index [A, B, C] print(【显示】s1为&#xff…

超级好用的高效率记笔记软件

高效率的记录学习笔记&#xff0c;可以帮助我们日后进行知识的回顾、学习及分享&#xff0c;对于有记录学习笔记需求的学生来讲&#xff0c;在日常生活中找一款好用的记录学习笔记的非常有必要的&#xff0c;手机作为一款比较便携的工具&#xff0c;在手机上安装笔记类工具&…

家居行业如何借助AI营销数智化转型?《2023 家居行业AI营销第一课(重庆站)》给你答案

商务部将2023年定为“消费提振年”。作为仅次于汽车消费的家庭第二大消费支出&#xff0c;家居产业的高质量发展与扩大内需提振消费息息相关。随着今年利好政策不断发布&#xff0c;家居建材行业的市场环境及消费潜力得到大幅度改善。 随着ChatGPT等新技术的出现与消费需求升级…

安全基础 --- nodejs沙箱逃逸

nodejs沙箱逃逸 沙箱绕过原理&#xff1a;沙箱内部找到一个沙箱外部的对象&#xff0c;借助这个对象内的属性即可获得沙箱外的函数&#xff0c;进而绕过沙箱 前提&#xff1a;使用vm模块&#xff0c;实现沙箱逃逸环境。&#xff08;vm模式是nodejs中内置的模块&#xff0c;是no…

【腾讯云】打造未来智能应用的基石:腾讯混元大模型

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

vue-cli-service build 不同环境的配置

目录 &#x1f91c; 背景 &#x1f91c; vue-cli-service介绍 &#x1f91c; 环境变量和模式 &#x1f91c; 配置不同模式 &#x1f91c;index.html使用环境变量 &#x1f91c; 验证 &#x1f91c; 参考资料 &#x1f91c; 背景 在项目部署时&#xff0c;我们需要在测试…

如何通过文件自动备份软件进行自动化备份?

​为什么要使用文件自动备份软件 有一位做客户资料保管登记的朋友&#xff0c;每天会在电脑上录入很多新的客户资料&#xff0c;并需要进行相关维护。比如删掉一些取消合作的客户&#xff0c;或者添加一些备注等等。对于像他这种工作性质的人来说&#xff0c;很需要一个可以…

c++ this指针与空指针调用类方法以及常函数

一、this指针 说明 1、c的成员变量与成员内函数是分开存储 2、每一个非静态成员函数只会诞生一份函数实例&#xff0c;多个同类型的队形公用的是同一份成员函数的代码 3、this指向调用这一份成员函数代码的对象实例 4、this是一个隐藏的指向对象实例的一个指针,无需定义直接使…