计算机IO原理

2023-09-18 20:13:47

一、中断机制

在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 发布!

更多推荐

Unity中关于多线程的一些事

一.线程中不允许调用unity组件api解决方法:可以使用bool值变化并且在update中监测bool值变化来调用关于unity组件的API.二.打印并且将信息输出到list列表中多线程可能同时输出多条信息。输出字符串可以放入Queue队列中。队列可以被多线程插入。三.启用socket连接server在主线程中直接连

Qt5开发及实例V2.0-第十一章-Qt事件处理及实例

Qt5开发及实例V2.0-第十一章-Qt事件处理及实例第11章Qt5事件处理及实例11.1鼠标事件及实例11.2键盘事件及实例11.3事件过滤及实例本章相关例程源码下载1.Qt5开发及实例_CH1101.rar下载2.Qt5开发及实例_CH1102.rar下载3.Qt5开发及实例_CH1103.rar下载第11章Qt5

buuctf-[网鼎杯 2020 朱雀组]phpweb

1.打开网站,吓我一跳2.查看源代码,主要看到timezone,然后这个页面是五秒就会刷新一次一开始去搜了这个,但是没什么用3.使用bp抓包会发现有两个参数,应该是用func来执行p4.修改func和pfile_get_contents:把整个文件读入一个字符串中。该函数是用于把文件的内容读入到一个字符串中的首选方法。

排序算法(未完)

诸神缄默不语-个人CSDN博文目录打算做每个算法介绍详细的思路、算法流程(PPT)、代码实现的视频。准备慢慢做。文章目录0.排序算法的稳定性分析1.插入排序/直接插入排序1.1希尔排序2.简单选择排序3.堆排序4.冒泡排序5.快速排序6.归并排序7.桶排序/箱排序8.基数排序/分配式排序/桶子法1.最低位优先(Leas

自动化测试工具slelnium的初体验

1.slelnium介绍1.1一个Web的自动化测试工具,最初是为网站自动化测试而开发的。1.2可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。1.3跨平台:linux、windows、mac;简单点说:是一款

华为数通方向HCIP-DataCom H12-831题库(单选题:121-140)

第121题在华为交换机上配置RADIUS服务器模板时,下列选项中哪些参数为可选的配置参数?A、认证服务器地址和端口B、RADIUS自动探测用户C、计费服务器地址和端口D、Shared-key答案:B解析:在华为交换机上配置radius服务器模板时,需要配置共享秘钥,认证服务器地址和端口,计费服务器地址和端口。可选配置r

[Linux入门]---gdb调试

文章目录0.前言1.gdb调试课前需知gdb指令2.总结0.前言平时我们在Windows操作系统下写代码的时候经常会写出bug,此时必不可少地会使用我们VS编译器的调试工具,而我们在Linux操作系统使用gcc编译器时,出现了bug又应该怎么进行调试呢?接下来让我们一起学习一下Linux调试器—gdb吧!1.gdb调试

同步 -- 信号量

本篇文章基于Linux-6.5源码建议:搭配Linux源码观看更佳structsemaphore{raw_spinlock_tlock;//保护信号量的自旋锁unsignedintcount;//最大同时可访问临界区的进程数量structlist_headwait_list;//等待队列,wait_list指向队列末尾

ansible

DevOps:官网:https://docs.ansible.com自动化运维工具对比C/S架构:客户端/服务端Puppet:基于Ruby开发,采用C/S架构,扩展性强,基于SSL,远程命令执行相对较弱SaltStack:基于Python开发,采用C/S架构,YAML使得配置脚本更简单.需要配置客户端及服务器端;每台被

【无标题】

想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客网络安全可以基于攻击和防御视角来分类,我们经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。无论网络、Web、移动、桌面、云等哪个领域,都有攻与防两面性,例如Web安全技术,既有Web渗透,也有Web

1.6python基础语法——输出

作用:程序输出内容给用户1)格式化符号格式符号转换%s字符串%d有符号的十进制整数%f浮点数%c字符%u无符号十进制整数%o八进制整数%x十六进制整数(小写ox)%X十六进制整数(大写OX)%e科学计数法(小写’e’)%E科学计数法(大写’E’)%g%f和%e的简写%G%f和%E的简写技巧%06d,表示输出的整数显示位

热文推荐