计算机IO原理

一、中断机制

在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.rhkb.cn/news/141026.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git的ssh方式如何配置,如何通过ssh方式拉取和提交代码

git的ssh配置 HTTPS和SSH的区别设置SSH方式配置单个仓库配置账户公钥 大家通过git拉取代码的时候,一般都是通过http的方式,简单方便。但是细心的童鞋肯定也注意到Git也是支持ssh方式的。可能很多人也试过使用这个方式,但是好像没有那么简单。…

Linux的socket通信

关于套接字通信定义如下: 套接字对应程序猿来说就是一套网络通信的接口,使用这套接口就可以完成网络通信。网络通信的主体主要分为两部分:客户端和服务器端。在客户端和服务器通信的时候需要频繁提到三个概念:IP、端口、通信数据&…

【STM32笔记】HAL库I2C通信配置、读写操作及通用函数定义

【STM32笔记】HAL库I2C通信配置、读写操作及通用函数定义 文章目录 I2C协议I2C配置I2C操作判断I2C是否响应I2C读写 附录:Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏定义总…

three.js——模型对象的使用材质和方法

模型对象的使用材质和方法 前言效果图1、旋转、缩放、平移,居中的使用1.1 旋转rotation(.rotateX()、.rotateY()、.rotateZ())1.2缩放.scale()1.3平移.translate()1.4居中.center() 2、材质属性.wireframe 前言 BufferGeometry通过.scale()、…

干洗店收银管理软件,洗鞋店收银系统干洗app

干洗店收银管理软件,洗鞋店收银系统干洗app,支持上门取衣服干洗,在手机上下单,预约合适的时间,就会有专员来上门取,当然,送衣服务也是有的,一些价格都标注清楚,有更多的参…

C/C++代码静态检测工具PC-Lint常见错误总结

目录 1、PC-Lint 概述 2、PC-lint 常见错误列举 3、PC-Lint报告的语法错误 4、总结 VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到…

MySQL数据库入门到精通8--进阶篇( MySQL管理)

7. MySQL管理 7.1 系统数据库 Mysql数据库安装完成后,自带了一下四个数据库,具体作用如下: 7.2 常用工具 7.2.1 mysql 该mysql不是指mysql服务,而是指mysql的客户端工具。 语法 : mysql [options] [database] 选…

CentOS 7系统安装与配置、常用100条操作命令

CentOS 7 是一个广泛使用的开源 Linux 操作系统,它是 Red Hat Enterprise Linux (RHEL) 的一个免费重建版本,以稳定性和安全性而著称。在 CentOS 7 上安装虚拟机通常使用虚拟化技术,如 VirtualBox 或 VMware 等。以下是 CentOS 7 的简要介绍以…

5请求处理流程

产品代码都给你看了,可别再说不会DDD(五):请求处理流程 # 这是一个讲解DDD落地的文章系列,作者是《实现领域驱动设计》的译者滕云。本文章系列以一个真实的并已成功上线的软件项目——码如云(https://www.…

java项目之课程思政元素收集遴选系统(ssm源码+文档)

项目简介 课程思政元素收集遴选系统实现了以下功能: 管理员:主页、个人中心、用户管理、教师管理、课程信息管理、课程类型管理、加入课程管理、留言板管理、论坛管理、系统管理、留言管理。教师:主页、个人中心、课程信息管理、课程类型管…

Python 逢七拍手小游戏1.0

"""逢七拍手游戏介绍:逢七拍手游戏的规则是:从1开始顺序数数,数到有7,或者是7的倍数时,就拍一手。例如:7、14、17......70......知识点:1、循环语句for2、嵌套条件语句if/elif/e…

网络上怎么赚点零花钱

现代物质社会中,我们常常会被琐碎的开销困扰。无论是衣食住行还是休闲娱乐,总有一些额外的花费,使我们不得不时常思索如何赚点零花钱。而现如今,随着互联网的飞速发展,我们有了更多的机会通过网络来实现这个目标。现在…

Swift SwiftUI 隐藏键盘

如果仅支持 iOS 15 及更高版本,则可以通过聚焦和取消聚焦来激活和关闭文本字段的键盘。 在最简单的形式中,这是使用 FocusState 属性包装器和 focusable() 修饰符完成的-第一个存储一个布尔值,用于跟踪第二个当前是否被聚焦。 Code struct C…

Jenkins学习笔记2

Jenkins下载安装: 从清华源开源镜像站上下载jenkins的安装包: 安装的是这个版本。 关于软件的版本,尽量使用LTS,长期支持。 首先是安装openjdk: yum install fontconfig java-11-openjdk[rootlocalhost soft]# java …

简单易上手的在windows部署cmake版paddledetection/yolo(c++)

一.下载源代码 官方地址: https://gitee.com/paddlepaddle/PaddleDetection 网盘: paddledetection 链接:https://pan.baidu.com/s/1g0z5SYQNDR1pwe9iAtvR3A?pwdktl6 提取码:ktl6 paddleocr 链接:https://pan.baid…

企业做问答营销的优势有哪些?媒介盒子告诉你

什么是问答营销?问答营销是软文营销的方式之一,品牌方一般会在问答平台上找出相关的问题进行回答,并在问答中融入自己的品牌、产品信息,达到推广的目的。那么企业做问答营销的优势有哪些呢?媒介盒子告诉你。 一、 加强…

《从菜鸟到大师之路 MySQL 篇》

《从菜鸟到大师之路 MySQL 篇》 数据库是什么 数据库管理系统,简称为DBMS(Database Management System),是用来存储数据的管理系统。 DBMS 的重要性 无法多人共享数据 无法提供操作大量数据所需的格式 实现读取自动化需要编程…

SolidJs节点级响应性

前言 随着组件化、响应式、虚拟DOM等技术思想引领着前端开发的潮流,相关的技术框架大行其道,就以目前主流的Vue、React框架来说,它们都基于组件化、响应式、虚拟DOM等技术思想的实现,但是具有不同开发使用方式以及实现原理&#…

Vue的`provide`和`inject`特性:上下文传递与数据共享

Vue的provide和inject特性:上下文传递与数据共享 Vue.js 是一款流行的前端 JavaScript 框架,它提供了丰富的功能来构建可维护和可扩展的用户界面。其中,provide 和 inject 特性是 Vue 中的一项强大功能,它们允许你在父组件提供数…

客户成功体系如何构建?请看这7步

文章目录 1. 当下客户成功的痛点2. 客户成功体系构建七步法2.1 第一步:定义客户成功章程2.2 第二步:客户成功组织设置与组织绩效管理设置2.3 第三步:关键岗位设置2.4 第四步:客户成功文化转型2.5 第五步:客户成功人才招…