Linux-I/O机制-零拷贝技术

【数据过程】

外设(磁盘)--> 内核缓冲区 --> 用户缓冲区

【DMA技术】------单片机的DMA为例

外设(磁盘)数据到内核的这个过程解放了CPU,CPU只需要给信号到DMA控制器即可,DMA自动完成数据拷贝然后触发中断通知CPU。

传输方向:

1)外设到内存(例如:ADC)

2)内存到外设(例如:串口发送)

3)内存到内存(例如:直接给一变量赋值一个常量型变量的值)

源和目标地址必须按数据传输宽度对齐。如串口8位,源地址也必须是8位。一次性最大传输数目:最大为65535。

【传统数据读写】

要完成1次read、write系统调用,进行了4次用户态与内核态的切换,4次数据拷贝;(1次系统调用会进行2次切换 )。

1)数据拷贝:外设到内核,内核到用户层,用户层到内核,内核到外设;

2)核心问题:如何减少状态切换次数与数据拷贝次数?

【层次结构】


应用程序(用户态)

------------------------------------(系统调用)

内核进程(内核态)

------------------------------------(DMA)

硬件外设


【Linux的零拷贝技术】

1、mmap:用 mmap() 替换 read() 系统调用函数,直接把内核缓冲区里的数据「映射」到用户空间(虚拟内存上)。应用进程再调用 write(),操作系统直接将内核缓冲区的数据拷贝到 socket 缓冲区中(在内核态完成)。减少了1次数据拷贝

2、sendfile:只能将外设1数据读取到内核缓冲区(PageCache),在内核中再通过DMA将其直接写入外设2(这个过程中,应用程序无法对外设1读取的数据进行用户处理操作)。减少了1次系统调用、2次数据拷贝------真正零拷贝技术。

【异步IO技术】

直接I/O(异步IO技术):硬件的数据绕过内核,直接读取到用户空间(没有PageCache层)。

1)前半部分,内核向磁盘发起读请求,但是可以不等待数据就位就可以返回 ,于是进程此时可以处理其他任务;

2)后半部分,当内核将磁盘中的数据拷贝到进程缓冲区后,进程将接收到内核的通知,再去处理数据;

需要PageCache的叫缓存 I/O ,而异步 I/O 是绕开 PageCache,叫直接I/O

1)传输大文件,使用「异步 I/O + 直接 I/O」;

2)传输小文件,使用「零拷贝技术」;

eg:nginx中,当传输文件小于某个值,使用sendfile,大于某个值,使用aio。

参考链接:zhuanlan.zhihu.com/p/616105519

相关推荐
木白CPP5 分钟前
Linux DMA驱动详解(二)-----DMA的使用者
java·linux·运维
赵民勇38 分钟前
systemd-socket-activate命令详解
linux·运维
Cx330❀1 小时前
【Linux网络】网络层 IP 协议:从网段划分到内核源码解析
大数据·linux·服务器·网络·tcp/ip·性能优化·langchain
企鹅的蚂蚁1 小时前
LubanCat RK3588 实时 Linux 开发(七):YT6801 PCIe 网卡驱动移植与 vermagic 排查
linux·rk3588·linux驱动·yt6801·pcie网卡·vermagic
DYWorker0011 小时前
Linux驱动子系统:DMA子系统 —— Consumer和Provider(006)
linux·驱动开发
byte轻骑兵2 小时前
【BlueZ】 log 模块:日志系统的实现与自定义日志输出配置
linux·人工智能·bluez·电脑蓝牙·嵌入式蓝牙
探索云原生2 小时前
KubeClipper 1.7.0 发布:Operation 优化与 Kubernetes 1.37 支持
linux·docker·云原生·kubernetes·go
一技安身3 小时前
【信创】docker-26.0.2.tgz 原理 + 完整安装
linux·运维·服务器
程曦曦3 小时前
MySQL 生产库误删 98 张表后的时间点恢复实战:从 binlog 解析到资金对账
linux·数据结构·其他·算法·ubuntu·运维开发
赵民勇3 小时前
systemd-mount命令详解
linux