Linux mmap 的作用是什么?

news2024/11/25 9:25:30

文章目录

  • 1.简介
  • 2.相关函数
  • 3.mmap和常规文件操作的区别
  • 4.作用
  • 参考文献

1.简介

mmap(memory map)即内存映射,用于将一个文件或其它对象映射到进程的地址空间。
在这里插入图片描述

2.相关函数

创建映射函数:

#include <sys/mman.h>

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

成功执行时,mmap()返回被映射区的指针。失败时,mmap()返回MAP_FAILED[其值为(void *)-1], errno 被设为以下的某个值:

EACCES:访问出错
EAGAIN:文件已被锁定,或者太多的内存已被锁定
EBADF:fd不是有效的文件描述词
EINVAL:一个或者多个参数无效
ENFILE:已达到系统对打开文件的限制
ENODEV:指定文件所在的文件系统不支持内存映射
ENOMEM:内存不足,或者进程已超出最大内存映射数量
EPERM:权能不足,操作不允许
ETXTBSY:已写的方式打开文件,同时指定MAP_DENYWRITE标志
SIGSEGV:试着向只读区写入
SIGBUS:试着访问不属于进程的内存区

入参 addr 表示要映射到的内存区域的起始地址,通常用 NULL,表示由内核指定该内存地址。

length 表示映射区的长度,单位字节。

prot 参数描述了映射所需的内存保护(并且不得与文件的打开模式冲突)。 它是 PROT_NONE 或以下多个标志的按位或组合:

PROT_EXEC 页面可以被执行
PROT_READ 页面可以被读取
PROT_WRITE 页面可以被写入
PROT_NONE 页面不能被访问

flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多个以下位的组合体:

MAP_FIXED //使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。并且起始地址必须落在页的边界上。
MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写入,相当于输出到文件。直到msync()或者munmap()被调用,文件实际上不会被更新。
MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。这个标志和以上标志是互斥的,只能使用其中一个。
MAP_DENYWRITE //这个标志被忽略。
MAP_EXECUTABLE //同上
MAP_NORESERVE //不要为这个映射保留交换空间。当交换空间被保留,对映射区修改的可能会得到保证。当交换空间不被保留,同时内存不足,对映射区的修改会引起段违例信号。
MAP_LOCKED //锁定映射区的页面,从而防止页面被交换出内存。
MAP_GROWSDOWN //用于堆栈,告诉内核VM系统,映射区可以向下扩展。
MAP_ANONYMOUS //匿名映射,映射区不与任何文件关联。
MAP_ANON //MAP_ANONYMOUS 的别称,不再被使用。
MAP_FILE //兼容标志,被忽略。
MAP_32BIT //将映射区放在进程地址空间的低2GB,MAP_FIXED指定时会被忽略。当前这个标志只在x86-64平台上得到支持。
MAP_POPULATE //为文件映射通过预读的方式准备好页表。随后对映射区的访问不会被页违例阻塞。
MAP_NONBLOCK //仅和MAP_POPULATE一起使用时才有意义。不执行预读,只为已存在于内存中的页面建立页表入口。

fd:有效的文件描述词。如果MAP_ANONYMOUS被设定,为了兼容问题,其值应为 -1。

offset:被映射对象内容的偏移。

解除映射函数:

#include <sys/mman.h>

int munmap(void *addr, size_t length);

成功执行时,munmap()返回0。失败时,munmap返回-1,errno 返回标志和 mmap 一致。

该调用在进程地址空间中解除一个映射关系,addr是调用mmap()时返回的地址,len是映射区的大小。

当映射关系解除后,对原来映射地址的访问将导致段错误发生。

同步函数:

int msync(void *addr, size_t len, int flags)

一般说来,进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往在调用 munmap() 后才执行该操作。

可以通过调用msync()实现磁盘上文件内容与共享内存区的内容一致。

3.mmap和常规文件操作的区别

我们首先简单回顾一下常规文件系统操作(调用read/fread等类函数)中,函数的调用过程:

1.进程发起读文件请求。

2.内核通过查找进程文件符表,定位到内核已打开文件集上的文件信息,从而找到此文件的 inode。

3.inode在address_space上查找要请求的文件页是否已经缓存在页缓存中。如果存在,则直接返回这片文件页的内容。

4.如果不存在,则通过inode定位到文件磁盘地址,将数据从磁盘复制到页缓存。之后再次发起读页面过程,进而将页缓存中的数据发给用户进程。

总结来说,常规文件操作为了提高读写效率和保护磁盘,使用了页缓存机制。这样造成读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到用户空间内存。这样,通过了两次数据拷贝,才能完成进程对文件内容的获取任务。写操作也是一样,待写入的buffer在内核空间不能直接访问,必须要先拷贝至内核空间内存,再写回磁盘中(延迟写回),也是需要两次数据拷贝。

而使用 mmap 操作文件,创建新的虚拟内存区域和建立文件磁盘地址和虚拟内存区域映射这两步,没有任何文件拷贝操作。而之后访问数据时发现内存中并无数据而发起的缺页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数据传入内存的用户空间中,供进程使用。

总而言之,常规文件操作需要从磁盘到页缓存再到用户主存的两次数据拷贝。而 mmap 操作文件,只需要从磁盘到用户主存的一次数据拷贝,效率更高。

4.作用

mmap 主要有两点作用:

  • 文件映射,减少数据拷贝,提高 IO 效率。

将文件映射到进程的地址空间。这使得进程可以通过直接读写内存来访问文件内容,而不必使用 read 和 write 等系统调用。对文件的读写跨过了页缓存,减少了数据的拷贝次数,提高了文件读写效率。

  • 进程间通信。

不管是父子进程还是无亲缘关系的进程,都可以将自身地址空间映射到同一个文件或匿名映射到同一片区域。从而通过各自对映射区域的改动,达到进程间通信和进程间共享的目的。


参考文献

认真分析mmap:是什么为什么怎么用- 胡潇

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

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

相关文章

跨境出海人必备的营销指南:海外各大社交媒体的对比

随着全球数字化的加速&#xff0c;社交媒体已经成为人们交流、分享、获取信息的主要渠道。根据最新的全球数字报告 “DIGITAL 2022: GLOBAL OVERVIEW REPORT”显示&#xff0c;截至2022年&#xff0c;全球有46.2亿社交媒体用户&#xff0c;这个数字相当于世界总人口的58.4%。这…

《YOLOv8-seg改进》专栏指导书册 手把手创新教程

&#x1f680;&#x1f680;&#x1f680;YOLOv8-seg创新专栏&#xff1a;https://blog.csdn.net/cv_20231007/category_12490532.html?spm1001.2014.3001.5482 学姐带你学习YOLOv8&#xff0c;从入门到创新&#xff0c;轻轻松松搞定科研&#xff1b; 1&#xff09;手把手教你…

【EI会议征稿】2024年电气技术与自动化工程国际学术会议 (ETAE 2024)

2024年电气技术与自动化工程国际学术会议 (ETAE 2024) 2024 International Conference on Electrical Technology and Automation Engineering 2024年电气技术与自动化工程国际学术会议 (ETAE 2024) 将于2024年3月8-10日在中国杭州召开。电气工程及其自动化和人们的日常生活…

打破传统束缚,释放服务潜能:本地生活服务商聚合系统引领行业新风向!

本地生活服务商聚合系统是一种集合多平台、多项目的创新型服务系统&#xff0c;它打破了传统服务商系统的一对一限制&#xff0c;为创业者和运营商带来了诸多优势。小多将深入探讨本地生活服务商聚合系统的优势。 随着互联网的快速发展&#xff0c;本地生活服务也迎来了蓬勃的发…

Windows RS485\USB转换接头,连接modbus温度传感器接线方法

文章目录 背景接线方式安装RS485\USB转换接头的驱动程序查看COM口号&#xff08;Communication Port&#xff08;通讯端口&#xff09;&#xff09;测试modbus数据传输 背景 买了个rs485 modbus协议的温度传感器&#xff0c;因为想接到windows上&#xff0c;用传感器厂家提供的…

浅谈无线测温产品在菲律宾某工厂配电项目的应用

摘要&#xff1a;配电系统是由多种配电设备和配电设施所组成的变换电压和直接向终端用户分配电能的一个电力网络系统。由于配电系统作为电力系统的一个环节直接面向终端用户&#xff0c;它的完善与否直接关系着广大用户的用电可靠性和用电质量&#xff0c;因而在电力系统中具有…

元宇宙外科手术vrar仿真实验室平台提高了培训效率和安全性

在科研与教育的领域中&#xff0c;实验室的作用举足轻重。然而&#xff0c;传统实验室受限于时间、空间、资源等因素&#xff0c;难以满足日益增长的科研与教育需求。在这一背景下&#xff0c;3D元宇宙仿真实验室应运而生&#xff0c;以其独特的优势&#xff0c;成为科研与教育…

无菌药品生产(A级区域)--气流流型测试可视化烟雾试验详细介绍

技术背景 无菌药品是指法定药品标准中列有无菌检测项目的制剂和原料药&#xff0c;包括注射剂、眼用制剂、无菌软膏剂、无菌混悬剂等。目前工程中&#xff0c;以注射剂产品为主的厂房占据了很大的比重。 无菌药品生产质量风险管理中&#xff0c;人员及其活动被视为重大的污染…

工程项目立项需要做哪些准备?

工程项目立项是一个复杂的过程&#xff0c;需要进行多方面的准备工作。这些准备工作对于项目的顺利进行至关重要&#xff0c;下面将详细介绍工程项目立项需要做哪些准备。 一、项目前期调研 在进行工程项目立项之前&#xff0c;需要进行充分的前期调研。这个阶段的主要目的是了…

【数据结构】——双链表(增删查改)

目录 前言&#xff1a; 一&#xff1a;双链表的定义 ​编辑 二&#xff1a;双向链表的实现 2.1&#xff1a;链表的构造 2.2&#xff1a;创建头节点 2.3&#xff1a;创建节点 2.4&#xff1a;链表的尾插 2.5&#xff1a;链表的打印 2.6&#xff1a;链表的尾删 2.7&a…

Abaqus 2022x新功能介绍第二弹

Abaqus 非线性力学的功能增强&#xff08;材料更新&#xff09; Valanis-Landel 超弹性材料 通过指定单轴试验数据和可选的体积试验数据&#xff08;v2022新增选项&#xff09;来定义Valanis-Landel 超弹性模型&#xff0c;该模型能精确地复现给定的数据&#xff0c;类似Marl…

在Ubuntu系统中安装VNC并结合内网穿透实现公网远程访问

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

CLIP浅谈

CLIP论文地址&#xff1a;Learning Transferable Visual Models From Natural Language Supervision CLIP代码地址&#xff1a;https://github.com/openai/CLIP 简介 CLIP是OpenAI在2021年2月发表的一篇文章&#xff0c;它的主要贡献有以下2点&#xff1a; 1&#xff09;将图…

【latex】公式推导等号对齐

使用aligned进行多行公式对齐&#xff0c;&作为对齐的节点&#xff0c;\作为公式换行 \begin{equation} \begin{aligned}a& bc \\& cd \end{aligned} \end{equation}

微信小程序云开发 微信支付功能 逻辑+踩坑

前置条件 首先开通微信支付商户号 然后小程序后台里关联商户号 然后在开发者工具里申请api权限 云开发》设置》其他设置》微信支付配置 申请一下权限和绑定 显示已通过即可。 逻辑 首先用户点击支付按钮&#xff0c;就会触发unlock() 在unlock函数中创建新订单&#xff…

UE5 - ArchvizExplorer - 数字孪生城市模板 - 功能修改

数字孪生项目&#xff0c;大多是双屏互动&#xff0c;而非下方菜单点击&#xff0c;所以要做一番改造 参考&#xff1a;https://blog.csdn.net/qq_17523181/article/details/133853099 1. 去掉提示框 打开BP_MasterMenu_Widget&#xff0c;进入EventGraph&#xff0c;断开Open…

【Docker】从零开始:1.Docker概述

【Docker】从零开始&#xff1a;1.Docker概述 1.什么是Docker2.为什么要使用Docker3.传统虚拟机技术与Linux容器技术的区别(1).传统虚拟机技术(2).Linux容器 4.Docker的特点一次构建、随处运行a.更快速的应用交付和部署b.更便捷的升级和扩缩容&#xff1a;c.更简单的系统运维d.…

windows环境搭建Zblog博客并发布上线公网可访问

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

软件测试/测试开发丨人工智能的与软件测试完美结合

随着人工智能&#xff08;AI&#xff09;技术的不断发展&#xff0c;软件测试领域也在不断演变。结合ChatGPT、知识图谱、PyTorch深度学习框架以及视觉与图像识别自动化测试&#xff0c;我们探讨了软件测试在人工智能时代的前沿应用&#xff0c;以及如何通过这些创新技术提高软…