当前位置: 移动技术网 > 科技>操作系统>Linux > 每天3分钟操作系统修炼秘籍(14):IO操作和DMA、RDMA

每天3分钟操作系统修炼秘籍(14):IO操作和DMA、RDMA

2019年11月17日  | 移动技术网科技  | 我要评论

户县,cf曼陀罗图片,专业实习报告

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比较优秀,但是它需要硬件、操作系统和代码的同时支持,对编程而言是一个比较大的冲击,所以目前使用的非常少。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网