您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

一文带你搞懂 Mmap 技术

时间:2023-03-07 13:58:57  来源:微信公众号  作者:树哥聊编程

大家好,我是树哥。

相信大家在面试的时候会被问到:Kafka 为啥会这么快?其中我们都会说是因为 zero-copy 的缘故,但 zero-copy 中其实有很多种实现方式,例如:mmap + write、sendfile 等等。这其中的 mmap 到底是咋回事呢?今天我们就来讲讲 mmap 技术。

mmap 是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。

那么 mmap 技术有啥用呢?

答案是:减少数据文件复制,提高效率。

想一下我们读取文件,然后将其通过网卡发送出去的流程,其整体流程如下所示:

图片

图片来自知乎博主艾小仙

上述数据读取和发送过程发生了 4 次用户态和内核态的上下文切换和 4 次拷贝,具体流程如下:

  1. 用户进程通过 read () 方法向操作系统发起调用,此时进程从用户态转向内核态。
  2. DMA 控制器把数据从硬盘中拷贝到读缓冲区。
  3. CPU 把读缓冲区数据拷贝到应用缓冲区,上下文从内核态转为用户态,read () 返回
  4. 用户进程通过 write () 方法发起调用,上下文从用户态转为内核态
  5. CPU 将应用缓冲区中数据拷贝到 socket 缓冲区
  6. DMA 控制器把数据从 socket 缓冲区拷贝到网卡,上下文从内核态切换回用户态,write () 返回

可以看到数据要从内核空间的读缓冲区读取到用户空间的用户缓冲区,再拷贝到内核空间的 socket 缓冲区,这个过程其实是很浪费时间的。而 mmap 技术的出现,就是为了提高这个效率。 使用 mmap 技术进行文件读写操作的过程如下图所示:

图片

图片来自知乎博主艾小仙

整个过程发生了 4 次用户态和内核态的上下文切换和 3 次拷贝,具体流程如下:

  1. 用户进程通过 mmap () 方法向操作系统发起调用,上下文从用户态转向内核态
  2. DMA 控制器把数据从硬盘中拷贝到读缓冲区
  3. 上下文从内核态转为用户态,mmap 调用返回
  4. 用户进程通过 write () 方法发起调用,上下文从用户态转为内核态
  5. CPU 将读缓冲区中数据拷贝到 socket 缓冲区
  6. DMA 控制器把数据从 socket 缓冲区拷贝到网卡,上下文从内核态切换回用户态,write () 返回

使用了 mmap 方式的文件读写节省了一次 CPU 拷贝,我们不需要再次从内核空间拷贝到用户空间,然后再从用户空间拷贝到内核空间。

此时我们会想:那这到底是怎么实现的呢?

其实这一切的背后都是操作系统的功劳。操作系统在这背后为我们做好了所有的映射和回写工作。当我们对内存特定区域进行读写时,操作系统便会检测到这一操作,然后根据不同场景去做读磁盘或者写磁盘的操作。

看到这里,对于 mmap 的理解基本上足够我们应用开发人员使用了。



Tags:map   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Search: map  点击:(11)  评论:(0)  加入收藏
Go 语言不支持并发读写 Map,为什么?
Go语言的map类型不支持并发读写的主要原因是并发读写会导致数据竞态(data race),这意味着多个 goroutine 可能同时访问并修改同一个 map,从而引发不确定的结果。在Go语言的设计...【详细内容】
2024-01-05  Search: map  点击:(81)  评论:(0)  加入收藏
使用 Mapstructure 解析 Json,你学会了吗?
背景前几天群里的小伙伴问了一个这样的问题:图片其实质就是在面对 value 类型不确定的情况下,怎么解析这个 json?我下意识就想到了 [mapstructure](https://github.com/mitchel...【详细内容】
2023-12-27  Search: map  点击:(151)  评论:(0)  加入收藏
.NET领域性能最好的对象映射框架Mapster使用方法
Mapster是一个开源的.NET对象映射库,它提供了一种简单而强大的方式来处理对象之间的映射。在本文中,我将详细介绍如何在.NET中使用Mapster,并提供一些实例和源代码。和其它框架...【详细内容】
2023-12-22  Search: map  点击:(79)  评论:(0)  加入收藏
关于Android图像Bitmap类,你要知道的一切
Bitmap介绍Bitmap是一种图像文件格式,它由像素阵列组成,每个像素都有自己的颜色信息。在计算机图形学中,Bitmap图像可以被描述为一个二维的矩阵,其中每个元素代表一个像素的颜色...【详细内容】
2023-12-19  Search: map  点击:(99)  评论:(0)  加入收藏
Java的TreeMap底层实现原理?
阿里这段时间忙着制定下半年的OKR,其实在制定OKR的时候就能看出团队里谁是领导的嫡系,谁是团队的边角料。嫡系的OKR都是从领导的核心项目分出来的,而其他人的OKR不会体现在领导...【详细内容】
2023-11-29  Search: map  点击:(231)  评论:(0)  加入收藏
HashMap:Java中的高效数据结构
HashMap是Java中常用的数据结构之一,它实现了Map接口,并且提供了快速的查找、插入和删除操作。HashMap的底层数据结构是数组和链表(或红黑树)的组合,这种数据结构被称为哈希表(Has...【详细内容】
2023-11-24  Search: map  点击:(331)  评论:(0)  加入收藏
Go 语言中的map和内存泄漏
Map在内存中总是会增长;它不会收缩。因此,如果map导致了一些内存问题,你可以尝试不同的选项,比如强制 Go 重新创建map或使用指针。在 Go 中使用map时,我们需要了解map增长和收缩...【详细内容】
2023-11-23  Search: map  点击:(248)  评论:(0)  加入收藏
C++ STL之std::map:红黑树的魔法与性能测试
最近在使用C++写代码,也是刚接触C++,恰巧碰到一个需要使用map的地方,不知道其查找元素的性能怎么样,所以研究了下,做个记录,目前从x86平台测试map查找一个元素大概需要2us,这里你需...【详细内容】
2023-11-23  Search: map  点击:(197)  评论:(0)  加入收藏
SpringBoot中如何使用ObjectMapper,老鸟们都是这样玩的?
1. 每次new一个在SpringBoot项目中要实现对象与Json字符串的互转,每次都需要像如下一样new 一个ObjectMapper对象:public UserEntity string2Obj(String json) throws JsonPro...【详细内容】
2023-11-23  Search: map  点击:(155)  评论:(0)  加入收藏
▌简易百科推荐
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(5)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(13)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(10)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(12)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(6)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(36)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(17)  评论:(0)  加入收藏
PHP+Go 开发仿简书,实战高并发高可用微服务架构
来百度APP畅享高清图片//下栽のke:chaoxingit.com/2105/PHP和Go语言结合,可以开发出高效且稳定的仿简书应用。在实现高并发和高可用微服务架构时,我们可以采用一些关键技术。首...【详细内容】
2024-01-14  547蓝色星球    Tags:架构   点击:(115)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11    王建立  Tags:Spring Boot   点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  互联网架构小马哥    Tags:Spring Boot   点击:(117)  评论:(0)  加入收藏
站内最新
站内热门
站内头条