mmap

news2024/11/27 4:26:20

文章目录

  • 使用示例
  • 函数原型
    • mmap
    • munmap
  • 传统读写文件
  • mmap 原理
    • eager实现
    • lazy实现
    • 缺点

使用示例

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>

int main(int argc, char* argv[])
{
    int fd;
    void *start;
    struct stat sb;

    fd = open("text.txt", O_RDONLY|O_CREAT); // 打开文件text.txt
    printf("fd=%d\n",fd);
    fstat(fd, &sb); // 获取文件状态
    start = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); // 建立内存映射
    if(start == MAP_FAILED){
        return (-1);
    }
    strcpy((char*)start,"asd");
    printf("%s\n", (char*)start); // 输出内存内容
    munmap(start, sb.st_size); // 解除内存映射
    close(fd); // 关闭文件

    return 0;
}

请添加图片描述

这段代码实现将文件text.txt 打开,并用mmap函数将文件映射到虚拟内存中,通过执政start对文件进行读写,可以在中断中看到由文件写入的数据,程序结束后,可以查看text.txt文件,来查看写入的数据

函数原型

mmap

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

  • addr :制定映射的起始地址,通常是NULL,由内核来分配,是一个虚拟地址
  • len:代表将文件中映射到内存的部分的长度,以及内存地址的区间大小
  • prot:映射区域(内存)的保护方式,这块地址的方式
    • PROT_EXEC:映射区域可执行,X
    • PROT_READ: 映射区域可读取,R
    • PROT_NONE: 映射区域不能存取,
    • PROT_WRITE: 映射区域可以写入 ,W
  • flag:映射区的特性标志位
    • MAP_SHARD:写入映射区的数据会复制回文件,和其他映射文件的进程共享,多个进程可以共享,实现 进程间通信
    • MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制,对此区域的修改不会写会原文件,这一部分的内容只会出现的内存,而不对文件修改,
  • fd:要映射到内存中的文件描述符,有open函数打开文件时返回的值,内核可以通过他得到对应的 struct file
  • offset:文件映射的偏移量,通常设置为0,代表从文件最前方开始对应,offset必须是分页大小(4K)的整数倍。offset移动,相当与从文件的不同位置进行映射

函数的返回值

实际分配的内存的起始地址,我们可以使用这个地址,来对文件进行修改,读取

munmap

int munmap( void * addr, size_t len )

该调用在进程地址空间中解除一个映射关系,来表明应用程序完成了对文件的操作,addr是mmap时返回的地址,len是映射区的长度

如果这个len就是内存中对应的映射区地址,这一块就直接释放掉了,如果不是,就把addr+len这一部分给解除映射,我们使用的addr移动len

解除映射之后,对原来映射地址的访问会导致段错误

传统读写文件

  • 把文件内容读入到内存中,从内核态拷贝回用户态,获得对应文件的数据。
  • 用户态修改文件相应的内容。
  • 把修改过的数据从用户态拷贝回内核态文件中。

请添加图片描述

read(fd, buf, 1024);  // 读取文件的内容到buf
...                   // 修改buf的内容
write(fd, buf, 1024); // 把buf的内容写入到文件

其中,(页缓存) page cache类似inode cache,把磁盘中的数据缓存在内存中,减少和磁盘进行交互,提高效率,内核使用page cache 将文件的数据块关联起来,所以我们在读写文件的时候,实际上操作的是 page cache

最大的影响就是,读写都需要进行数据的拷贝,如果数据两很大,那对性能影响就很大

mmap 原理

请添加图片描述

请添加图片描述

与传统读写文件相比,mmap就是可以直接在用户空间读写 page cache,这样就可以免去将 page cache的数据在内核与用户之间的拷贝,mmap映射的正是文件的 page cache,而非磁盘

mmap 将文件映射到进程的虚拟内存空间中,通过对这段内存的 lord store ,实现对文件的读取和修改,不使用 read write

off为映射的部分在文件中的偏移量,len为映射的长度

图中实际含义

从文件描述符对应的offset开始映射长度为len的内容到虚拟地址va(由内核决定),va+len,范围内都是其对应的虚拟地址

eager实现

如果内存使用的是eager方式来实现

对于文件的读写,内核会从文件的offset开始,将数据拷贝到内核中,设置好PTE指向物理内存的位置,后程序就可以使用load或者store来修改内存中文件的内容,完成后,使用munmap,将dirty block写回文件中,我们可以很容易找到哪个block是dirty,因为对应的PTE_D被设置了

lazy实现

但是现在的计算机都不会这样做,都是以 lazy的方式实现

  • 记录这个PTE属于这个文件描述符
  • 存储相应的信息在VMA(Virtual Memory Area))结构体中(这些信息来表示对应的虚拟地址的实际内容在哪里)
    • 文件描述符
    • 偏移量等
    • 地址范围
    • 标志位
    • 长度

调用mmap是不会开辟物理地址的,只会把数据存储起来,等待后续实际的调用,再实际的对对应的page进行开辟物理内存

  • 对VMA记录的某个范围内进行读写操作,触发page fault,就会实际的开辟物理页,将该va和该物理地址进行映射,将VMA中记录的offset标志位开始读取数据到对应的物理地址中

如果其他进程直接修改了文件的内容,内容不会出现在内存中,

mmap并不会主动将 mmap修改的page cache 同步到磁盘,而是需要用户进行触发

  • munmap解除文件映射的时候会触发
  • msync函数主动进行数据同步
  • 进程退出
  • 系统关机

请添加图片描述

  1. 虚拟地址空间获得一段连续的地址
  2. 在没有读写的时候,这个地址指向不存在的地方(所以上图中,起始地址和终止地址还没分配给进程)
  3. 根据偏移量,进程要读取文件了,数据占两个页
  4. 进程开始使用内存,所以OS要给这两个页分配内存,触发page fault
  5. 将对应的offset文件数据拷贝到物理内存对应的page上

缺点

  1. 如果文件很小,小于4KB,但是再内存中都是按照4KB为基本单位,就会造成一个内存空间的浪费
  2. 创建mmap,销毁munmap,page fault开销很大

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

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

相关文章

高并发编程之阻塞队列

9 阻塞队列 9.1 BlockingQueue 简介 Concurrent 包中&#xff0c;BlockingQueue 很好的解决了多线程中&#xff0c;如何高效安全 “传输”数据的问题。通过这些高效并且线程安全的队列类&#xff0c;为我们快速搭建 高质量的多线程程序带来极大的便利。本文详细介绍了 Bloc…

十四、JavaScript——类型转化_数值

一、定义 将其他的数据类型转化为数值 使用Number()函数来将其他类型转化为数值&#xff0c;适用于任何类型使用parseInt() -- 将一个字符串转化为一个整数 -解析时&#xff0c;会自作向右读取一个字符串&#xff0c;直到读取到所有的整数位 parseFloat()…

想学设计模式、想搞架构设计,先学学 UML 系统建模吧

UML 系统建模 1 概述 1.1 课程概述 汇集 UML 及其相关的一些话题回顾 UML 相关的符号与概念以电商订单相关业务为例&#xff0c;借助 UML 完成系统建模将 UML 变成提升建模效率&#xff0c;表达架构思想的工具 1.2 什么是 UML ​ Unified Modeling Language 统一建模语言&a…

MEMS运动传感器:三轴数字输出陀螺仪——L3GD20

一、框图和引脚说明 二、机械和电气规格 三、应用 四、数字框图 4.1 框图 4.2 FIFO L3GD20为三个输出通道(偏航、俯仰和滚转)分别嵌入了32个16位数据FIFO槽。 五种模式&#xff1a;Bypass mode、FIFO mode、Stream mode、Bypass-to-Stream mode and Stream-to-FIFO mode。 …

ICG-Amine|ICG标记氨基|ICG-NH2

ICG-Amine|ICG标记氨基|ICG-NH2 中文名称&#xff1a;ICG标记氨基英文名称&#xff1a;ICG-Amine 分子式&#xff1a;C47H56N4O4S 分子量&#xff1a;773.04 外观&#xff1a;绿色粉末 溶解度&#xff1a;二氯甲烷 纯度&#xff1a;95% 结构式&#xff1a; Indocyanine …

JUC并发编程第十二篇,详解Synchronized与锁升级

详解Synchronized与锁升级一、概述二、Synchronized 版本升级优化与锁对象1、版本变化2、为什么每一个对象都可以成为一个锁&#xff1f;三、Synchronized锁升级步骤详解1、如何升级&#xff1f;2、无锁&#xff0c;不会出现竞争3、偏向锁4、轻量级锁5、重锁6、三种锁的比较四、…

接口测试实战 | Android 高版本无法抓取 HTTPS,怎么办?

image1080327 43.8 KB 【编者按】本文为霍格沃兹测试学院 yuye 同学的接口测试实践笔记。 在接口测试中&#xff0c;相信很多人都遇到过 Android 高版本&#xff08;Android7.0 以上&#xff09;系统无法抓包的问题。 由于在测试过程中对分析定位问题很不方便&#xff0c;所以…

Solidity地址支付方法Send、Transfer和Call的使用

以上三种转账方式都属于地址的成员属性&#xff08;members of address&#xff09;。 参见地址成员类型 Transfer 如果当前合约的余额不够大或者 Ether转账被接收账户拒绝&#xff0c;转账功能将失败。接收方智能合约应定义回退函数&#xff0c;否则转账调用将引发错误。tr…

以生态共建促产业发展,点亮HPC新未来

作者 | 曾响铃 文 | 响铃说 作为IT行业的“明珠”&#xff0c;极“硬核”的高性能计算不如云计算、AI、物联网技术备受关注。但不可忽视的是&#xff0c;近年来&#xff0c;高性能计算正在从高精尖科研加速迈向千行百业&#xff0c;成为推动数字经济发展的新引擎。在近日举办…

springboot - 原理初探

自动配置&#xff1a; 1、pom.xml &#xff08;1&#xff09;sping-boot-dependencies&#xff1a;核心依赖在父工程中&#xff01;&#xff01;&#xff01; &#xff08;pom.xml文件中&#xff0c;spring-boot-starter-parent 点进去&#xff0c;然后&#xff0c;spring-…

C51 - 准双向I/O口结构

Contents1> P1口1.1> 写 "0" 过程1.2> 写 "1" 过程1.3> 读引脚”准“双向问题&#xff1a;1.4> 读 寄存器2> P3口3> P0口1> P1口 没画【P1.0/T2】【P1.1/T2EX】第2功能&#xff1b; 1.1> 写 “0” 过程 D触发器FF1&#xff0c;…

ssm+Vue计算机毕业设计校园新闻发布系统(程序+LW文档)

ssmVue计算机毕业设计校园新闻发布系统&#xff08;程序LW文档&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

微信小程序-视图与逻辑

文章目录1. 页面导航2. 导航传参3. 下拉刷新4. 上拉触底5. 自定义编译模式6.生命周期7. wxs脚本1. 页面导航 页面导航指的是页面之间的相互跳转。例如&#xff0c;浏览器中实现页面导航的方式有如下两种&#xff1a; 声明式导航 在页面上声明一个<navigator>导航组件通…

java swing(GUI) MySQL实现的学生选课签到考勤系统源码开发教程

今天给大家演示一款由Java swing即GUI和mysql数据库实现的&#xff0c;学生签到考勤信息管理系统&#xff0c;系统采用了MVC的设计模式&#xff0c;结构层次非常清晰&#xff0c;此外&#xff0c;该项目有手把手的开发教程&#xff0c;适合刚入门Java的学生学习&#xff0c;下面…

思科复习实验,含dhcp,三层交换机,ospf

♥️作者&#xff1a;小刘在这里 ♥️每天分享云计算网络运维课堂笔记&#xff0c;疫情之下&#xff0c;你我素未谋面&#xff0c;但你一定要平平安安&#xff0c;一 起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的&#xff0c;绽放&#xff0c;…

协同过滤毕业设计 商品推荐系统

文章目录1 简介2 常见推荐算法2.1 协同过滤2.2 分解矩阵2.3 聚类2.4 深度学习3 协同过滤原理4 系统设计4.1 示例代码(py)5 系统展示5.1 系统界面5.2 推荐效果6 最后1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是学长的毕设系列文章&#xff01; &#x1f525…

JVM面试题详解系列——垃圾回收详解

堆空间的基本结构 Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。同时&#xff0c;Java 自动内存管理最核心的功能是 堆 内存中对象的分配与回收。 Java 堆是垃圾收集器管理的主要区域&#xff0c;因此也被称作 GC 堆&#xff08;Garbage Collected Heap&am…

如何将 Credly 中的数字徽章转成二维码

如何将 Credly 中的数字徽章转成二维码 在 Credly 数字证书 这一篇文章中要说过当完成 AWS Academy Cloud Foundations 课程后&#xff0c;可以申请一个结业证书徽章&#xff0c;已下逐步说明&#xff0c;如何申请结业证书徽章&#xff0c;并转成二维码&#xff0c;可以放在个…

Guitar Pro8电脑版更新下载及主要功能介绍

想成为一名专业甚至著名的音乐人&#xff0c;用到的工具软件非常多&#xff0c;在众多款软件工具中&#xff0c;Guitar Pro 8能满足乐谱创作者、学习者的所有需要。 Guitar Pro 8多达30项功能优化新版本 边听边看&#xff0c;支持添加音频轨道让音乐富有灵魂&#xff0c;精准…

用友U8 cloud,以应用牵引与价值驱动推进信创2.0阶段

经过多年发展的中国信创产业正进入新阶段&#xff0c;无论资本市场还是企业市场&#xff0c;都迎来“大爆发”。 信创的市场空间正在被打开。在今年9月底国家下发的79号文中&#xff0c;全面给出了国资信创产业发展与进度的指导&#xff0c;要求到2027年央企国企100%完成信创替…