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: syncfsync与fdatasync