当前位置:   article > 正文

Linux 磁盘IO方式_linux splice io集中访问

linux splice 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

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/608951
推荐阅读
相关标签
  

闽ICP备14008679号