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

点我查看秘籍连载编程

I/O操做和DMA、RDMA

用户进程想要执行IO操做时(例如想要读磁盘数据、向磁盘写数据、读键盘的输入等等),因为用户进程工做在用户模式下,它没有执行这些操做的权限,只能经过发起对应的系统调用请求操做系统帮忙完成这些操做。这里由于系统调用产生中断将陷入到内核,进行一次上下文切换操做。操作系统

内核进程帮忙执行IO操做时,因为IO操做相比于CPU来讲是极慢的操做,CPU不该该等待在这个过程当中,而是切换到其它进程上去执行其它任务。这里再次涉及到一次上下文切换:从内核态回到用户态的其它进程。blog

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方式的代码。get

前面介绍缓冲空间时提到过,通常状况下,每一个用户进程要读、写数据,都会通过两个必要的缓冲层:内核空间的Kernel Buffer、用户空间的IO Buffer。例如读文件数据时,先将数据拷贝到内核的缓冲空间(page cache),而后陷入内核,内核将该缓冲空间数据拷贝到用户空间的缓冲空间(IO Buffer),当调度到用户进程时,用户进程从本身的缓冲空间读取数据。io

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比较优秀,可是它须要硬件、操做系统和代码的同时支持,对编程而言是一个比较大的冲击,因此目前使用的很是少。

相关文章
相关标签/搜索