2,mmap内存映射的零拷贝

1,c/c++中的零拷贝是什么?

在 C/C++ 中,零拷贝(Zero Copy)通常指通过使用操作系统提供的特定 API,让应用程序在数据传输过程中避免不必要的数据复制,从而提高数据传输的效率和性能。

具体来说,在 C/C++ 中实现零拷贝通常有两种方式:

使用操作系统提供的 sendfile 系统调用。该系统调用可以在两个文件之间传输数据,而不需要将数据从内核缓冲区复制到用户空间缓冲区。这样可以避免数据复制,从而提高数据传输的效率。

使用操作系统提供的 mmap 系统调用。该系统调用可以将文件映射到进程的地址空间中,从而让进程可以直接访问文件的内容。这样,进程可以直接读取或写入文件的内容,而不需要进行中间的数据复制操作。


2,mmap内存映射的零拷贝

mmap(memory-mapped file)是一种将文件映射到进程地址空间的技术。
在使用 mmap 进行内存映射时,操作系统会将文件的内容映射到进程的虚拟地址空间中,使得进程可以直接通过指针访问文件的内容,而不需要进行中间的数据复制操作。

因此,mmap 技术可以被视为一种零拷贝技术。使用 mmap 进行内存映射时,可以避免将文件从磁盘读入内核缓冲区,然后再将数据从内核缓冲区拷贝到进程的用户空间缓冲区的过程,从而减少数据复制操作,提高数据传输的效率。

在使用 mmap 进行内存映射时,需要使用系统调用 mmap() 将文件映射到进程的虚拟地址空间中。一旦文件被映射到进程的虚拟地址空间中,进程就可以直接通过指针访问文件的内容,从而避免了数据复制的过程。



3,淘宝分布式存储引擎用的就是mmap

淘宝分布式存储引擎 TFS(Taobao File System)的确使用了 mmap 技术来进行数据存储和访问。

TFS 是一种针对海量小文件的分布式存储系统,它主要用于存储淘宝网站上的图片、视频等资源文件。在 TFS 中,每个文件被划分为多个数据块,每个数据块被存储在不同的物理节点上。当客户端需要访问某个文件时,TFS 首先会通过元数据服务确定该文件的数据块位置,然后通过网络将数据块读取到客户端。

在 TFS 中,每个数据块都被映射为一个文件,并使用 mmap 技术将其映射到内存中。这样可以避免将数据块从磁盘读入内核缓冲区,然后再将数据从内核缓冲区拷贝到用户空间缓冲区的过程,从而减少数据复制操作,提高读写性能。

全部评论
m
1 回复 分享
发布于 2023-08-10 11:11 陕西
m mmap,零拷贝
点赞 回复 分享
发布于 2024-10-05 19:37 江苏
m
点赞 回复 分享
发布于 2023-08-24 11:44 广东
m
点赞 回复 分享
发布于 2023-08-16 21:03 广东
m
点赞 回复 分享
发布于 2023-07-30 11:43 浙江
m
点赞 回复 分享
发布于 2023-07-27 00:28 上海
m
点赞 回复 分享
发布于 2023-07-24 21:52 江苏

相关推荐

07-16 14:42
浙江大学 C++
7.13号参加了网易互娱上海引擎沙龙的现场面试,也是非常没有自知之明了,感觉现场大佬云集,被复旦上交游戏相关的大佬包围了。面试官也很专业很随和,个人感觉聊的很开心,然后现场出结果,直接挂了。第二次面网易了,上次是暑期实习,也是一面挂了,自身能力也不太够,经历也不匹配,不过感觉网易的面试官都很不错,非常专业。在此放上面经。首先是问项目和简历,略过。(不过网易对简历挖的不深,但是很喜欢知识迁移,比如说从我的项目引申出去,加一个场景,问我会怎么处理,这种情况我每次都答得不好)然后是八股环节~不会问常规八股,首先问智能指针shared_ptr的实现,然后问一个计数器是否是线程安全的(shared_ptr本身是线程安全的,但是我自己实现的不是),要我写一段反例代码说明为什么不是线程安全的。考察了一些多线程的知识,后续又问了互斥锁和读写锁的区别和实现。感觉自己还是理解的不透彻,之前一直是在背基础八股,稍微深问一些,就模糊了。然后是问快排,如何不用递归实现。(其实很简单,就是通过栈去实现,但是我在现场被自己绕进去了,经面试官提醒才写出来)最后是问了一下为什么要做游戏,反问环节问了简历还怎么优化。总计时长五十分钟左右,感觉面试官非常专业,可惜自己实在是差点意思。最后想问一下大家如何更深入系统得去学习八股相关的知识,现在感觉只是背了一些博主总结的表面八股,再深入不知道如何下手,很难跟面试官聊得有深度,学起来感觉像无头苍蝇。
查看8道真题和解析
点赞 评论 收藏
分享
评论
15
98
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务