当前位置: 首页 > news >正文

【操作系统】零拷贝技术

1. DMA技术

DMA技术也就是直接内存访问技术。在进行I/O设备和内存的数据传输的时候,数据传输的工作全部交给DMA控制器,而不是CPU负责。
在这里插入图片描述

2. 传统的文件传输

传统的文件传输的代码如下:

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

上述代码发生了4次用户态与内核态的上下文切换,4次数据拷贝。
在这里插入图片描述
具体过程:

  • 第一次拷贝:DMA把磁盘数据拷贝到内核缓冲区。
  • 第二次拷贝:CPU将磁盘数据拷贝到用户缓冲区。
  • 第三次拷贝:CPU将用户缓冲区数据拷贝到socket缓冲区。
  • 第四次拷贝:DMA将socket缓冲区数据拷贝到网卡。

3. 零拷贝

3.1 mmap+write

mmap拷贝代码如下:

buf = mmap(file, len);
write(sockfd, buf, len);

mmap会把内核缓冲区的数据映射到用户空间,这样,操作系统内核与用户空间就不需要再进行任何的数据拷贝。上述代码发生4次上下文切换与3次拷贝。
在这里插入图片描述

  • 应用进程调用了mmap(),DMA会把磁盘的数据拷贝到内核的缓存区,然后应用进程和操作系统内核共享这个缓冲区。
  • 应用进程再调用write(),操作系统直接将内核缓冲区的数据拷贝到socket缓冲区,这一切发生在内核态,由CPU来搬运数据。
  • 最后由DMA将数据从内核的socket拷贝到网卡的缓冲区。

3.2 sendfile技术

sendfile代码如下:

ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

sendfile需要2次上下文切换,2次数据拷贝。
在这里插入图片描述
具体过程:

  • 通过DMA将磁盘数据拷贝到内核缓冲区。
  • 缓冲区描述符和数据长度传到socket缓冲区。SG-DMA将内核缓冲区拷贝到socket缓冲区,减少一次拷贝。
http://www.xdnf.cn/news/413929.html

相关文章:

  • hive在配置文件中添加了hive.metastore.uris之后进入hive输入命令报错
  • Python 实现失败重试功能的几种方法
  • 记录裁员后的半年前端求职经历
  • LVGL(lv_checkbox复选框按键)
  • xss-lab靶场4-7关基础详解
  • 解决下拉框数据提交后回显名称不对
  • LearnOpenGL02:绘制三角形和矩形
  • 系统稳定性之技术方案
  • 处理均值的配对比较
  • 一、华为鸿蒙系统介绍
  • 计算机组成原理———CPU指令周期精讲
  • 高防云的主要优势表现在哪些方面?
  • 学习黑客5 分钟深入浅出理解Alternate Data Streams (ADS)
  • 国产大模型「五强争霸」:决战AGI,谁主沉浮?
  • Fiber
  • SQL数据库核心实用技巧总结
  • SaaS备份的必要性:厂商之外的数据保护策略
  • Ethereum Pectra 的升级
  • 在文档里如何引用在线SVG甘特图
  • 普通IT的股票交易成长史--20250512复盘
  • [计算机网络]网络层
  • 安装hadoop
  • MySQL 事务(一)
  • 01 安装CANoe
  • 运算放大器相关的电路
  • 【Python爬虫】01-Python爬虫概述
  • js相关内容
  • 实数完备性定理互证1
  • 在选择合适的实验室铁地板和铸铁试验平板,帮分析​
  • ApiPost工具详细介绍及使用教程