IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 零拷贝技术-sendfile、mmap -> 正文阅读

[系统运维]零拷贝技术-sendfile、mmap

零拷贝技术

文章参考:

知乎文章

小林图解系统

Linux高性能服务器编程

零拷贝技术大体来说就是没有通过CPU在内存层面进行拷贝数据,而是通过DMA进行传输

这样的提升是很大的,CPU就是应该让它用在关键的地方才行

前提:

Server将文件sendFile发送给客户端,那么传统的就是需要调用两个系统调用read & write

read(sendFile, tmp_buf, len);						//从磁盘中读出来
write(socket , tmp_buf, len);						//写到socket中去

传统模式下:
请添加图片描述

上下文切换&数据拷贝

我们使用了两个系统调用:readwrite, 发生了4次用户态内核态之间的切换

4次数据之间的拷贝:

  • 将磁盘的数据拷贝到操作系统内核的缓存区(DMA)
  • 将内核缓冲区中的数据拷贝到用户的缓冲区中(CPU)
  • 将拷贝到用户缓冲区的数据拷贝到内核的socket缓冲区中(CPU)
  • 将内核的socket缓冲区数据拷贝到网卡的缓冲区中(DMA)

sendfile实现零拷贝

#include <sys/socket.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
		//目的端文件描述符、源文件描述符、源端偏移量、复制数据的长度
		//返回值是实际复制的长度

sendfile函数在两个文件描述符之间传递数据(完全在内核中操作),从而避免了内核缓冲区和用户缓冲区之间的数据拷贝,实现了零拷贝

??:sendfile几乎是专门为在网络上传输文件而设计的,因为源端文件必须指向真实的文件,目的端文件必须指向socket,因此是专为网络而生的

sendfile的模式
请添加图片描述

上下文切换&数据拷贝

总共发生了两次用户态内核态之间的转换,减少了两次上下文切换

数据之间的拷贝只有3次

🌰:

代码实现起来也是更加的精简,假设我们Server参数:ip port filename

//......
//创建socket,bind,listen,accept
//filefd:待发送的文件名,connfd:Server套接字

filefd(filename, O_RDONLY);			//打开文件
struct stat stat_buf;
fstat(filefd, &stat_buf);				//用于记录待发送文件状态

//


sendfile(connfd, filefd, NULL, stat_buf.st_size);		//直接发送到套接字,及其精简
close(fd);




//.....

mmap + write实现零拷贝

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

mmap()系统调用函数会将 内核缓冲区中的数据 映射用户空间 ,这样就不用实现用户空间的拷贝了

请添加图片描述

这样也是减少了一次拷贝,但是同样还是需要4次上下文切换

mmap传输大文件有优势,传输小文件可能出现碎片🧩

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:16:02  更:2022-04-26 12:19:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:02:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码