每天3分钟操作系统修炼秘籍(14):IO操作和DMA、RDMA
I/O操作和DMA、RDMA
用户进程想要执行IO操作时(例如想要读磁盘数据、向磁盘写数据、读键盘的输入等等),由于用户进程工作在用户模式下,它没有执行这些操作的权限,只能通过发起对应的系统调用请求操作系统帮忙完成这些操作。这里因为系统调用产生中断将陷入到内核,进行一次上下文切换操作。
内核进程帮忙执行IO操作时,由于IO操作相比于CPU来说是极慢的操作,CPU不应该等待在这个过程中,而是切换到其它进程上去执行其它任务。这里再次涉及到一次上下文切换:从内核态回到用户态的其它进程。

DMA要求硬件的支持,需要在硬件中集成一个小型的“CPU”,比如现在的机械硬盘、固态硬盘、网卡等硬件都带有DMA功能,这样操作系统要执行IO操作时,直接将相关指令发送给这些DMA硬件,DMA处理器负责IO操作,而操作系统这时可以放弃CPU,让CPU去执行其它进程。例如对于读磁盘文件时,操作系统将相关指令以及数据应写在哪个内存地址发送给DMA硬件后,由DMA硬件去读写数据到指定内存地址,当IO操作完成后,DMA硬件通过总线发送一个硬件中断给CPU,于是陷入到内核态(这里涉及了一次上下文切换),内核就知道了IO已经完成,于是将Kernel Buffer数据拷贝到用户进程的IO Buffer,并准备调度用户进程(再次上下文切换)。
假如不使用DMA硬件的话,那么IO操作过程中,操作系统将多次参与,负责将硬件数据读入或读出内存,操作系统参与意味着要陷入到内核态,并且获取CPU控制权,这也意味着要进行大量的上下文切换以及占用大量CPU资源。
而使用DMA后,只有4次必要的上下文切换,且IO操作的过程中完全不需要消耗CPU资源。
除了DMA,还有更高级的RDMA(Remote Direct Memory Access)机制,它需要操作系统和硬件的支持,还需要编写RDMA方式的代码。
前面介绍缓冲空间时提到过,一般情况下,每个用户进程要读、写数据,都会经过两个必要的缓冲层:内核空间的Kernel Buffer、用户空间的IO Buffer。例如读文件数据时,先将数据拷贝到内核的缓冲空间(page cache),然后陷入内核,内核将该缓冲空间数据拷贝到用户空间的缓冲空间(IO Buffer),当调度到用户进程时,用户进程从自己的缓冲空间读取数据。
DMA机制并没有绕过这两个缓冲层,但使用RDMA机制,程序可以直接绕过Kernel Buffer,内核发现是RDMA操作后,直接告诉RDMA硬件将读取的数据(写操作也一样)写入到用户空间的IO Buffer,而不需要先拷贝到Kernel Buffer,再拷贝到IO Buffer。虽然RDMA机制相比DMA不会减少上下文切换次数,但是它减少了内存数据拷贝的过程,相当于是使用了O_DIRECT标记的直接IO技术。
DMA和RDMA两种技术对比如图:RDMA一般实现在网卡上,但出于方便理解,下图直接使用磁盘来描述

像这种绕过内核功能的技术,通常称为内核旁路(Kernel Bypass),RDMA技术内核旁路的是一种,还有像TOE也是内核旁路的一种。
虽然RDMA比较优秀,但是它需要硬件、操作系统和代码的同时支持,对编程而言是一个比较大的冲击,所以目前使用的非常少。
每天3分钟操作系统修炼秘籍(14):IO操作和DMA、RDMA的更多相关文章
- 每天3分钟操作系统修炼秘籍(13):两个缓冲空间Kernel Buffer和IO Buffer
两个缓冲空间:kernel buffer和io buffer 先看一张图,稍后将围绕这张图展开描述.图中的fd table.open file table以及两个inode table都可以不用理解, ...
- 每天3分钟操作系统修炼秘籍(12):OOM和swap分区
点我查看秘籍连载 OOM和swap分区 进程的虚拟内存空间是映射到整个物理内存空间的,所以在进程自身看来它拥有了整个物理内存,它也能使用整个物理内存,只需在使用的时候请求操作系统帮忙分配更多空间即可. ...
- 每天3分钟操作系统修炼秘籍(6):Idle进程
点我查看秘籍连载 CPU的归属:Idle进程 操作系统并不总是繁忙.例如个人PC上任务比较轻,多数时候都无法充分利用CPU,导致CPU处于空闲状态.但CPU既然通电了,它就得运行,那么在它没有任务需要 ...
- Vim修炼秘籍之语法篇
前言 少年,我看你骨骼精奇,是万中无一的武学奇才,维护世界和平就靠你了,我这有本秘籍<Vim修炼秘籍>,见与你有缘,就十块卖给你了! 如果你是一名 Vimer,那么恭喜你,你的 Vim 技 ...
- python之协程与IO操作
协程 协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B ...
- 【Linux 应用编程】文件IO操作 - 常用函数
Linux 系统中的各种输入输出,设计为"一切皆文件".各种各样的IO统一用文件形式访问. 文件类型及基本操作 Linux 系统的大部分系统资源都以文件形式提供给用户读写.这些文件 ...
- 安装SQL Server提示“重叠的IO操作正在进行”解决
单位新做了一个虚机.打算部署一套.Net SQL 的系统 系统是Server 2008 R2,机器除了系统,其它软件都没有. 所以须要安装SQL Server啊,.Net环境啊.配置IIS== 恰巧的 ...
- C语言IO操作总结
C语言IO操作总结C程序将输入看做字节流,流的来源是文件.输入设备.或者另一程序的输入:C程序将输出也看做字节流:流的目的是文件.视频显示等: 文件处理:1 :fopen("filename ...
- C++ IO操作API及注意事项(包含一个日志类的实现)
C++是一个抽象程度比C高很多的语言,在使用C++时,编译器做了很多工作,如果我们不对C++的某些特性的实现机制进行了解,那么编程时也许会有很多疑惑,我们也许知道怎样做才是正确的,但不知道为什么要这样 ...
随机推荐
- Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js 10.x
运行Reac项目报: Node Sass could not find a binding for your current environment: OS X 64-bit with Node.js ...
- msf之hash攻击
使用hashdump抓取密码(需要系统管理权限) 另外一个更强大的模块 smart_hashdump 如果目标是win7 就需要先绕过UAC 还可以使用msf内置的mimikatz抓取hash msv ...
- Python:的web爬虫实现及原理(BeautifulSoup工具)
最近一直在学习python,学习完了基本语法就练习了一个爬虫demo,下面总结下. 主要逻辑是 1)初始化url管理器,也就是将rooturl加入到url管理器中 2)在url管理器中得到新的new_ ...
- PHP array_fill_keys
1.函数的作用:将一个数组的元素分别作为键值和一个指定的值组成新的数组: 2.函数的参数: @params array $array @params mixed $values 3.例子: < ...
- win10系统 plsql developer启动慢
win10系统plsql启动慢一般原因是plsql打印设置的问题,若默认打印机设置为网络上某一位置的打印机,则plsql启动时会去寻找该打印机,导致启动很慢. 解决办法1 直接禁止print spoo ...
- python-json与字典的区别
1.字典的类型是字典dict,是一种数据结构:json的类型是字符串str,json是一种格式: 接口测试是传参数payload时有时候是传的字符串,应该将payload的类型改为json 这点要注 ...
- F#周报2019年第43期
新闻 F# eXchange 2020--征文通知 FSSF在忙什么?2019年第三季度版本 Miguel强烈推荐使用TensorFlow.NET 运行在ASP.NET Core 3上的SAFE-Bo ...
- 后缀数组(SA)
学习了LRJ神犇的代码.orz. 首先真心建议了解下基数排序!!且要有一定的c++程序经验,否则程序很难看懂. 然后对着下面的程序调试(假装你已经会了算法思想) 弄个一个礼拜一下午就能学会了. 该算法 ...
- Java基础(八)对象包装器与自动装箱
1.对象包装器 有时候,需要将int这样的基本类型转换为对象.所有的基本类型都有一个与之对应的类.通常,这些类被称为包装器(wrapper). 这些对象包装类分别是:Integer.Long.Floa ...
- SpringBoot2.X整合Actuator
一 说明 Actuator 的定义 actuator 是一个制造术语,指的是用于移动或控制某物的机械装置.执行器可以通过一个小的变化产生大量的运动. 要将 actuator 添加到基于 Maven 的 ...