操作系统-IO
2024-02-28 09:17:56 0 举报
AI智能生成
零拷贝与传统IO\epoll\mmap\内存映射理解\DMA技术\sendfile\Direct I/O\磁盘调度\大文件传输
作者其他创作
大纲/内容
原文链接
总结
概述
无论是传统的I/O方式,还是引入了零拷贝之后,2次DMA copy都是少不了的。因为两次DMA都是依赖硬件完成的。
所谓的零拷贝,都是为了减少CPU copy以及减少上下文的切换
零拷贝技术对比图
分支主题
零拷贝
作用
零拷贝主要是用来解决操作系统在处理I/O操作时,频繁复制数据的问题。
零拷贝相关技术
1、mmap+write
实现方式
运用了虚拟内存特性
原理图
分支主题
与传统IO区别
把数据读取到内核缓冲区后,应用程序进行写入操作时,直接把内核的Read Buffer的数据复制到Socket Buffer以便写入,该内核复制也需要CPU参与。
结果
少了一次CPU COPY,提升了I/O速度。但是上下文操作并没有减少,原因是write操作
2、sendfile
实现方式
mmap();
write();
替换为
sendfile()
原理图
分支主题
结果
少了一次CPU COPY,以及2次上下文切换
3、scatter/gather的sendfile方式
实现方式
在内核空间Read Buffer和Socket Buffer不做数据复制,而是将Read Buffer的内存地址、偏移量记录到相应的Socket Buffer中,这样就不需要复制。
本质和虚拟内存的解决方法思路一致,就是内存地址的记录
原理图
分支主题
结果
少了2次cpu复制,以及2次上下文切换
前提
需要硬件以及驱动程序支持
4、splice
实现方式
前提
用户应用程序必须拥有两个已经打开的文件描述符,一个表示输入设备,一个表示输出设备
与sendfile区别
splice允许任意两个文件相互连接,而不只是文件与socket进行数据传输
splice是一种机制,不仅限于sendfile的功能,是sendfile的父集
无需硬件支持
虚拟内存
概念
零拷贝是一种I/O操作优化技术,可以快速高效地将数据从文件系统移动到网络接口,而不需要将其从内核空间复制到用户空间。
在FTP或者HTTP等协议中可以显著地提升性能。目前只有在NIO和Epoll传输时才可以使用该特性。
技术使用介绍
DMA技术
DMA负责内存与其他组件之间的数据拷贝,CPU仅需负责管理,而无需负责全程的数据拷贝
Page Cache的zero copy
send file
一次代替read/write系统调用,通过使用DMA技术以及传递文件描述符,实现了zero copy
mmap+write
mmap仅替代read系统调用,将内核空间地址映射为用户空间地址,write操作直接作用于内核空间。通过DMA技术以及地址映射技术,用户空间和内核空间无需数据拷贝,实现了zero copy
不使用page cache的Direct I/O
读写操作直接在磁盘上进行,不是用page cache机制,通常结合用户空间的用户缓存使用。通过DMA技术直接与磁盘网卡进行数据交互,实现了zero copy
DMA技术
传统IO操作
图示
分支主题
分支主题
流程
1、从磁盘中读取文件内容拷贝到内核缓冲区(DMA搬运)
2、将内核缓冲区的数据,拷贝到application应用程序的buffer(CPU完成)
3、将application应用程序buffer中的数据copy到socket网络发送缓冲区(属于操作系统内核的缓冲区)(cpu完成)
4、将socket buffer的数据,copy到网卡,由网卡进行网络传输(DMA搬运)
没有任何技术优化的4次拷贝
物理<->内存
CPU负责将数据从磁盘搬运到内核空间的Page Cache中
CPU负责将数据控内核空间的Socket缓冲区搬运到网卡中
内存内部拷贝
CPU负责将数据从内核空间的PageCache搬运到用户空间的缓冲区
CPU负责将数据从用户空间的缓冲区搬运到内核空间的Socket缓冲区
4次上下文切换
1、read系统调用
用户态切换为内核态
2、read系统调用完毕
内核态切换回用户态
3、write系统调用时
用户态切换到内核态
4、write系统调用完毕
内核态切换到用户态
缺陷
存在冗余的上下文切换和数据拷贝,多了很多不必要的开销,会严重影响系统性能
0 条评论
下一页