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 江苏

相关推荐

1)手撕:给定字符串,求不含重复字符的最长子串长度,并打印这个子串//哈希Set配合双指针private static String findLongestSubstring(String s) {        int n = s.length();        int left = 0;        int maxLength = 0;        String longestSubstring = "";        Set<Character> charSet = new HashSet<>();        for(int right = 0 ; right < n ; right ++){            while(charSet.contains(s.charAt(right))){                charSet.remove(s.charAt(left));                left++;            }            charSet.add(s.charAt(right));            if(maxLength < right - left + 1){                maxLength = right - left + 1;                longestSubstring = s.substring(left , right + 1);            }        }        return longestSubstring;    }2)如何设计一个秒杀系统?从以下角度考虑:1.高性能架构;采用分布式架构,消息队列来削峰填谷,服务的降级和熔断 2.高并发的处理能力:商品库存扣减的多线程安全问题,采用redisson分布式锁,缓存预热3.用户体验升级:websocket实现秒杀倒计时同步,消息队列实现秒杀结果实时反馈,针对ip地址,设备指纹和访问频率的限制实现防作弊系统4.数据一致性保障;数据库分库分表,本地消息表5.监控报警:监控系统,报警系统,日志系统,异常日志收集,分布式追踪系统6.安全防护、成本控制3)String StringBuffer StringBuilder区别String是不可变类,线程安全,每次修改字符串都会创建新的字符串,效率比较低StringBuffer是可变类,直接在原字符串上修改,使用了Synchronized实现同步,效率也比较低,适合多线程场景StringBuilder是可变类,线程不安全,效率比较高,适合单线程场景4)数据库字段char和varchar区别char:定长字符串,存储长度为1~255个字符,存储空间固定为255字节,不足用空格补,适合固定长度的字段,便于数据库读取和优化varchar:可变字符串,存储长度为1~65535个字符,存储空间为实际长度+长度字节5)索引失效的情况索引失效是指数据库在查询过程中无法有效利用已建立的索引,导致查询性能下降,甚至退化为全表扫描的情况。查询条件中使用了函数或表达式对索引列进行操作;使用了OR条件且未对所有分支列建立索查询条件中使用了NOT、<>、!=等否定操作符;对索引列进行了模糊查询(如LIKE '%abc%'),且通配符位于开头;查询条件中列的顺序与复合索引的列顺序不匹配;或者查询时数据类型不匹配导致索引无法使用。6)数据库的事务隔离级别读未提交:允许读取尚未提交的数据,可能导致脏读、幻读、不可重复读读已提交:允许读取已提交的数据,不能保证数据一致,可能导致幻读和不可重复读可重复读:允许读取已提交数据,可能导致幻读串行化:保证数据一致性,但是并发度和性能低7)Redis的常用数据类型,分别存储哪些东西?String:存储字符串,比如用户名、密码和验证码等哈希:哈希表,可以存储用户信息,商品信息等List:存储有序的元素,比如消息队列和日志记录Set:集合,可以做去重排序或求交集等Zset:带得分排序的集合,可以做用户或者流量等的排行榜8)Redis的锁机制基于SETNX命令,将锁名称作为键,客户端唯一标识(UUID)作为键值,使用完锁后DEL释放锁    因不可冲入可能存在死锁和不及时释放锁的情况,可以释放锁时检查锁值是否为自己的UUID以及添加过期时间基于Lua脚本,使用原子SET命令和Lua脚本的事务性,但仍存在锁续期困难和业务超时锁释放风险基于Redisson的分布式锁,支持可冲入锁和自动续期,提供公平锁、联锁和红锁9)HTTP1.0 2.0 3.0 区别HTTP1.0:默认为短连接,每次请求都需要建立TCP连接,并通过Connection: keep-alive头来实现持久连接,不支持管道    化,主要使用If-Modified-Since/Expires来做为缓存判断的标准;HTTP2.0:采用二进制格式而非文本格式,解析更加高效,支持多路复用允许单个TCP交错发送多个请求和响应,引入HPA    CK压缩算法,对请求和响应的头部信息进行压缩,消除冗余,允许客户端为请求设置优先级HTTP3.0: 最新的HTTP协议,基于QUIC协议,QUIC使用udp传输数据,不存在队头阻塞问题,首次连接后具备0RTT优        势,减少延迟,允许网络切换时,将连接迁移到新的IP地址,默认采用TLS加密,保证数据传输的安全性10) TCP的三次握手和四次挥手,为什么需要?三次握手:客户端向服务器发送SYN表示请求同步,服务器向客户端发送SYN+ACK表示确认收到同步请求,可以确保客户    端的发送能力正常,客户端向服务器发送ACK表示确认,可以确认服务器的发送和接收能力以及客户端的接收能力正常,   连接建立,通过三次握手能够保证通信双方的接收发送能力正常四次挥手:客户端发送FIN+x序列号表示请求关闭连接,服务器发送ACK+x+1表示确认收到,客户端向服务器的通道关        闭,服务器发送FIN+y序列号表示请求关闭连接,客户端发送ACK+y+1表示收到,等待2MSL没有收到回复后关闭TCP连接,因为TCP是全双工的,双向链路分别需要发送和接收两次,所以是需要四次挥手。11) 从输入网址,到最后访问页面的全过程首先输入URL,进行URL解析,准备发送http请求在请求之前,先本地查看浏览器缓存,如果缓存有该资源,直接返回,否则继续准备请求发送请求之前,进行DNS域名解析,按照本地缓存,本地HOST,路由器缓存,DNS服务器,DNS根服务器顺序,直到查        询到URL对应的IP地址三次握手建立TCP连接构建请求并发送,包括请求行,请求头,请求体,并把和该域名相关的cookie放入请求头,构建HTTP请求,如果是https        还要进行加密服务器处理请求,生成对应的响应并返回相应资源四次握手关闭TCP连接浏览器接收到响应后进行解析处理,如果是字节流可能是下载管理器进行下载,如果是html页面就是进行渲染生成页面。
查看11道真题和解析
点赞 评论 收藏
分享
1.在英雄联盟中的精彩回放机制(高光回放机制)基于图像识别方面有没有什么思路去解决这个问题?2.yolov8的性能是怎么样的?3.做横向项目的时候有没有遇到过一些复杂的问题,你是怎么解决的八股1.go语言有哪些常用的数据结构?2.map的底层原理是怎么样的?map的桶的大小是否是有限制的。如果有限制,这个桶内的数据达到限制,再set会不会失败(即存的key全部落到一个桶中)?是桶内的链表扩容,还是桶的数量扩容3.如果在业务场景中,数据的key总是哈希冲突很严重,有什么解决思路?4.协程跟协程之间的通信一般采用什么样的方式?5.Channel的原理主要是怎么样的?6.假设十个协程监听一个channel,他们是怎么监听到管道里有数据的?7.select十个协程,都要一直轮询嘛?假设select一万个协程,我每select一遍都要去轮询唤醒这些协程吗?8.线程之间的同步机制有哪些9.线程通信的时候,生产者线程生产完消息传递到消息管道,怎么通知消费者线程去消费的即消费者是怎么感知到管道里有数据的?10.进程之间的通信方式呢?怎么传递数据?11.TCP粘包是怎么产生的?是否还有其他的解决粘包方式的,除了TLV,分隔符,固定长度还有其他的解决方式吗12.UDP是否有粘包的问题?那如果UDP读包的时候只读取了一半呢?13.UDP包头字段有哪些?14.Linux中敲一个指令系统反馈给我的结果很慢(比如说ls 那个控制台出结果很慢),有没有什么排查思路?15.TOP命令排查占用率主要看哪些信息?如果一个进程占用率很高会影响我机器卡顿吗?(会跟CPU的核心数有关系吗)如果单核CPU一个进程占用率百分之百会影响linux系统卡顿吗,那多核CPU呢16.TOP看到系统的占用率是什么级别的?17.Linux内存不足怎么用命令查看?看的是实际内存还是虚拟内存18.虚拟内存的意义是什么?怎么映射到真实的物理地址的19.索引失效场景?Mysql的事务是怎么实现的?20.现在有A,B两个线程同时访问数据库,A线程Insert,B线程能看到这条刚插入的数据吗?那如果B线程读的是从库呢,在四种隔离级别下会发生脏读现象吗?21.那主从同步进度能否被线程所感知到,即B线程是否能够感知到主从同步的进度?那这个看进度能否看到某一个库的某一个具体字段,还是只能看到一个整体的进度系统设计题现在有一个游戏排行榜,这个排行榜访问的QPS大概在1000w左右,写的QPS大概在500w左右,我们数据库的极限访问量大概在50w左右,你该怎么设计这个服务鼠鼠经历过强度最大的一场面试,项目一个没问,面的后面汗流浃背。腾讯很喜欢就一个八股进行底层深挖,而不是只能简单了解一下概念即可
查看25道真题和解析 腾讯2025实习生招聘
点赞 评论 收藏
分享
评论
15
98
分享

创作者周榜

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