mmap访问内存方式

mmap访问内存方式

请看下面的Java代码,这段程序是取自1brc竞赛的第一名的代码。

public static void main(String[] args) throws IOException, InterruptedException {... ...try (var fileChannel = FileChannel.open(java.nio.file.Path.of(FILE), java.nio.file.StandardOpenOption.READ)) {long fileSize = fileChannel.size();final long fileStart = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, fileSize, java.lang.foreign.Arena.global()).address();final long fileEnd = fileStart + fileSize;final AtomicLong cursor = new AtomicLong(fileStart);... ...}... ...
}

该代码显示出了基于mmap的IO操作的高效。下面研究一下为什么这种方式高效。

mmap(memory-mapped files)比一般IO操作(如read/write系统调用)在某些情况下更快的原因主要包括以下几点:

  1. 减少数据复制

    • 使用mmap时,文件被映射到进程的地址空间,使得可以直接读写内存来访问文件内容,省去了内核缓冲区与用户空间缓冲区之间的数据拷贝。当进行顺序读取或者大量随机访问时,这种直接访问方式避免了传统I/O中需要将内核缓存的数据复制到用户程序缓冲区的过程。
  2. 内存管理优化

    • 操作系统能够利用其虚拟内存和页替换机制,只在实际访问页面时才触发物理磁盘I/O(按需分页或预读)。这样可以更高效地利用有限的物理内存资源,并结合操作系统层面的缓存策略提升性能。
  3. 系统调用开销减小

    • 通过mmap读写文件时,一旦完成映射,后续对文件的操作就不必每次都涉及系统调用。而传统的read/write操作每次都会导致从用户态到内核态的切换,这一过程会带来一定的CPU开销。
  4. 缓存一致性

    • mmap映射的文件区域可以受益于操作系统的缓存机制,即如果其他进程也访问同一文件,那么这些更改可以通过缓存同步机制快速传播,无需额外的同步代码。
  5. 连续访问效率

    • 当应用程序对大文件进行连续访问时,由于内存访问的局部性原理(局部性原理指的是程序在执行过程中倾向于访问最近刚刚访问过的数据附近的数据),mmap可能触发硬件级别的预读取机制,从而提前加载接下来可能要访问的数据块,提高整体性能。

然而,在实际应用中,mmap并非总是优于传统的I/O操作。对于小文件、非顺序访问模式或者不完全访问整个文件的应用场景,mmap可能因为映射和维护内存映射表的开销而不占优势。此外,当内存资源紧张时,频繁的换页活动可能会增加磁盘交换,反而降低性能。因此,选择哪种方法取决于具体的应用需求和工作负载特征。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/752840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

elasticsearch8.12 分词器安装

分词器的主要作用将用户输入的一段文本,按照一定逻辑,分析成多个词语的一种工具 分词器下载地址 analysis-ik Releases infinilabs/analysis-ik GitHub 一个简便 安装方式 安装完成之后 会提示重启,重启es即可 ./bin/elasticsearch-pl…

配置LVS NAT模式

配置LVS NAT模式 环境准备 client1:eth0->192.168.88.10,网关192.168.88.5lvs1: eth0 -> 192.168.88.5;eth1->192.168.99.5web1:eth1->192.168.99.100;网关192.168.99.5web2:eth1->192.168…

基于C语言的“贪吃蛇”游戏设计理念

3.功能描述:本游戏主要实现以下几种功能 图1.游戏功能模块 3.1. 贪吃蛇的控制功能:通过各种条件的判断,实现对游戏蛇的左移、右移、下移、上移、自由移动,贪吃蛇的加长功能。 3.2. 游戏显示更新功能:当贪吃蛇左右移动、…

容器只适用于微服务吗?

容器是一种技术,它将应用及其依赖项打包成一个可移植的单元,以便在不同的计算环境中一致地运行。这种技术确实在微服务架构中得到了广泛应用,因为容器可以帮助实现微服务的快速部署、水平扩展和管理。 然而,容器并不仅限于用于微…

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充

操作系统笔记之进程调用API中的getpid、fork、wait、exec补充 code review! —— 杭州 2024-03-17 夜 文章目录 操作系统笔记之进程调用API中的getpid、fork、wait、exec补充1.getpid()2.fork()3.wait()4.exec()5.通常,exec() 调用与 fork() 调用一起使用&#xff…

Leetcode 3080. Mark Elements on Array by Performing Queries

Leetcode 3080. Mark Elements on Array by Performing Queries 1. 解题思路2. 代码实现 题目链接:3080. Mark Elements on Array by Performing Queries 1. 解题思路 这一题我们只需要按照题意进行一下实现就行了。具体来说的话,我们只需要依序遍历一…

算法笔记p154最大公约数和最小公倍数

目录 最大公约数辗转相除法证明例子代码实现 最小公倍数代码实现 最大公约数 正整数a与b的最大公约数是指a与b的所有公约数中最大的那个公约数,一般用gcd(a, b)表示a和b的最大公约数。 辗转相除法 设a、b均为正整数,则gcd(a, b) gcd(b, a % b)。即被…

【C语言_字符函数和字符串函数_复习篇】

目录 一、字符函数 1.1 字符分类函数 1.2 字符转换函数 二、字符串函数 2.1 strlen函数 2.1.1 strlen函数的使用 2.1.2 strlen函数的模拟实现 2.2 strcpy函数 2.2.1 strcpy函数的使用 2.2.2 strcpy函数的模拟实现 2.3 strcat函数 2.3.1 strcat函数的使用 2.3.2 strcat函数的…

hololens2发布unity设置

生成vs工程再向hololens发布时, Architecture选X64或ARM64都可以成功发布

es索引操作命令

索引操作 index 创建索引 put 方法创建索引 使用 put 创建索引时必须指明文档id,否则报错 # PUT 创建命令 # test1 索引名称 # type1 类型名称,默认为_doc,已经被废弃 # 1 文档id PUT /test1/type1/1 {"name":"zhangsan&…

能不能绕过c去学c++?

目前做工程开发,基本都是c/c混着用的,c/c是同源的,c/是在c的基础上发展起来的,它们之间有些联系和区别: 区别: 1.可用库不同 c基本是系统底层语言,一般系统底层开发用c(例如&…

【leetcode】二叉树的前序遍历➕中序遍历➕后序遍历

大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 1. 二叉树的前序遍历2. 二叉树的中序遍历3. 二叉树的后序遍历 1. 二叉树的前序遍历 点击查看题目 根…

lv17 安防监控项目实战 3

代码目录 框架 our_storage 编译最终生成的目标文件obj 编译生成中间的.o文件 data_global.c 公共资源定义(使用在外extern即可)定义了锁定义了条件变量消息队列id、共享内存id、信号量id及key值发送短信、接收短信的号码向消息队列发送消息的函数&am…

Ollama部署本地大模型

ollama run gemma:2b "菊花为什么是红色的?" 如今 LLM 早已不再等同于昂贵的 GPU,而是可以在大部分消费级计算机上运行推理的应用了——俗称本地大模型。 Ollama 安装十分简单,macOS 直接在官网下载安装包打开运行;Wi…

华为汽车业务迎关键节点,长安深蓝加入HI模式,车BU预计今年扭亏

‍编辑 |HiEV 一年之前,同样是在电动汽车百人会的论坛上,余承东在外界对于华为和AITO的质疑声中,第一次公开阐释了华为选择走智选车模式的逻辑。 一年之后,伴随问界M7改款、问界M9上市,华为智选车模式的面貌已经发生了…

【Maven篇】解锁 Maven 的智慧:依赖冲突纷争下的版本调停者

缘起 软件开发世界是一个充满无限可能的领域,但同时也伴随着诸多挑战。其中之一,就是依赖冲突的问题。在这篇文章中,我们将揭开 Maven 这位“版本调停者”的神秘面纱,深入探讨如何在版本纠纷的盛宴中解决依赖问题。 Maven&#…

集成学习bagging与boosting

集成学习是机器学习中的一种策略,旨在结合多个学习器的预测结果,以提高总体性能,减少过拟合,增强模型的泛化能力。Boosting和Bagging是集成学习中两种非常著名的方法,它们虽然共享集成多个学习器以达到更好性能的共同目…

《建造者模式(极简c++)》

本文章属于专栏《设计模式(极简c版)》 继续上一篇《工厂模式(极简c)》。本章简要说明建造者模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明: 方案:不同场景对类的构建有不同需…

python内置函数 L

python内置函数 L Python 解释器内置了很多函数和类型,任何时候都能使用。 L 名称描述len返回对象的长度。list返回一个新列表。locals返回一个字典,表示当前局部符号表。 len(s) 返回对象的长度(元素个数)。实参可以是序列&…

什么是docker(docker客户端、镜像、容器、仓库)

一、docker Docker 是一个开源的容器化平台,它可以让开发者打包应用程序及其依赖项成为一个轻量级、可移植的容器,然后在任何环境中运行。Docker 容器将应用程序及其依赖项打包到一个标准化单元中,包括代码、运行时环境、系统工具、系统库等…