Linux 磁盘IO方式

Posted 绝世好阿狸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 磁盘IO方式相关的知识,希望对你有一定的参考价值。

用户态 vs 内核态:

操作系统也是程序,有对应的程序代码,而且也要占用内存。计算机的部分内存以及部分函数就是专门分给操作系统使用的,也就是内核态。而普通的用户进程只能访问用户内存,如果需要使用系统资源,需要发起系统调用,也即转为内核态。内核态是对计算机资源的保护。

 

Linux 磁盘IO方式

1.基于中断的IO

用户进程发起IO请求,进入内核态。cpu向硬件设备发送IO指令,随后cpu挂起当前进程,调度其他进程执行。当硬件设备处理完成后,发送中断信号给cpu,中断具有最高优先级,cpu会挂起当前执行的进程响应中断。将数据从硬件设备拷贝至内核缓冲区。再将内核的数据拷贝至用户缓冲区,唤醒之前的进程。(轮询 vs 中断)

2.基于DMA的IO

基于中断的IO,当硬件设备就绪后,需要cpu完成数据的拷贝工作,占用资源。DMA是一种可以访问内核数据区的设备,可以看成是cpu与硬件设备的代理,cpu向DMA发起请求,之后处理其他进程。之后DMA像硬件设备发出指令,数据就绪后,DMA将数据从硬件缓冲区复制到内核。再发起中断,cpu只需要将数据从内核复制到用户态即可。

 

传统的IO读写

读和写:读和写是两个操作,各需要 两次状态切换,一次DMA拷贝,一次cpu拷贝

 

零拷贝IO

1.mmp:

mmp技术可以将内核数据区直接映射到用户数据区,省去了将内核数据拷贝至用户数据区。

读取:两次切换,一次DMA

写入:两次切换,一次DMA

但是读取缓冲区到写入缓冲区还需要一次cpu拷贝,所以需要4次切换,3次拷贝。

 

2.sendfile:

是一次调用,完成了读写。但是读取缓冲区和写入缓冲区仍需要cpu拷贝,只是减少了切换次数。需要两次切换,3次拷贝。

 

3.splice:

利用管道技术免去了读取缓冲区和写入缓冲区的拷贝。需要两次切换,两次拷贝。

 

参考:https://juejin.cn/post/6844903949359644680

 

 

以上是关于Linux 磁盘IO方式的主要内容,如果未能解决你的问题,请参考以下文章

Linux-磁盘及网络IO工作方式解析

Linux 磁盘IO

linux 同步IO: syncfsync与fdatasync

linux 同步IO: syncfsync与fdatasync

linux查看磁盘io的几种方法

linux中关于磁盘IO