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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值