内存映射机制

news2024/11/27 14:53:39

什么是内存映射

Linux通过将一个虚拟内存区域与一个磁盘上的对象关联起来,以初始化这个虚拟区域的内如,这个过程称为内存映射。

代码示例:

/*******************************************************************
 *   > File Name: mmap.c
 *   > Create Time: 2021年09月28日 星期二 19时30分22秒
 ******************************************************************/
#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 = open("test.txt", O_RDWR); // 打开文件test.txt
    if (fd < 0)
    {
        perror("open file faild!");
        return -1;
    }
    char *start = mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
    if(start == MAP_FAILED){
        perror("mmap faild");
        return -1;
    }

    printf("%s\n", start); // 输出内存内容
    char t[] = "helloword!\n";
    memcpy(start, t, sizeof(t));
    munmap(start, 4096); // 解除内存映射
    close(fd); // 关闭文件

    return 0;
}

内存映射原理

分析效率

从代码层面上看,从硬盘上将文件读入内存,都要经过文件系统进行数据拷贝,并且数据拷贝操作是由文件系统和硬件驱动实现的,理论上来说,拷贝数据的效率是一样的。但是通过内存映射的方法访问硬盘上的文件,效率要比read和write系统调用高,这是为什么呢?原因是read()是系统调用,其中进行了数据拷贝,它首先将文件内容从硬盘拷贝到内核空间的一个缓冲区,如图2中过程1,然后再将这些数据拷贝到用户空间,如图2中过程2,在这个过程中,实际上完成了 两次数据拷贝 ;而mmap()也是系统调用,如前所述,mmap()中没有进行数据拷贝,真正的数据拷贝是在缺页中断处理时进行的,由于mmap()将文件直接映射到用户空间,所以中断处理函数根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了 一次数据拷贝 。因此,内存映射的效率要比read/write效率高

内存映射的特点

  • 不会在映射的时候分配物理页
  • 仅仅是建立一种关联
    • 虚拟地址和文件地址偏移建立关联
    • 设置好缺页异常回调函数
    • 返回分配的虚拟地址给用户程序
  • 读写的时候触发缺页异常

再看fork函数

当fork函数被当前进程调用的时候,内核为新进程创建各种数据结构,并分配一个唯一ID,为了给这个新进程创建虚拟内存,它创建当前进程的mm_struct、区域结构和页表的原样副本。它将两个进程中的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时复制。当fork函数返回的时候,新进程现在的虚拟内存和调用的时候完全一样,当两个进程中的任何一个进行写的时候,写时复制机制会创建新的页面

再看execve函数

例如:execve("wc",NULL,NULL) 

加载并运行wc需要以下几步:

  • 删除已存在的用户区域

删除当前进程虚拟地址的用户部分已存在的区域结构。

  • 映射私有区域

为新程序的代码、数据、bss、和栈区域创建新的区域结构,所有这些新的区域结构都是私有的、写时复制的

  • 映射共享区域

如果wc还需要链接一些其他目标,比如C标准库中的libc.so,这些对象都是动态链接到程序中,然后再映射到用户虚拟地址空间中的共享区域内

  • 设置程序计数器 

execve做的最后一件事情,就是设置当前进程的上下文的程序计数器。

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

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

相关文章

如何查询川菜食材配料的API接口

在当今的美食文化中&#xff0c;菜谱不只是一张简单的食谱&#xff0c;更是了解美食文化和饮食知识的重要途径。然而&#xff0c;若没有准确的食材配料&#xff0c;烹制出的每道菜品都将难以达到完美的味道。因此&#xff0c;为了更好地满足人们对于菜谱和食谱的需求&#xff0…

Gitzip插件【Github免翻下载】

今天给大家推荐一个github下载的插件&#xff0c;平常大家下载应该无外乎就是以下两种&#xff1a; Download zip利用git clone 但是这两种各有各的弊端&#xff0c;前者一般需要科学上网才可以&#xff0c;后者下载不稳定经常中途断掉。 今天给推荐一个款浏览器插件-Gitzip.大…

单调栈结构

单调栈 单调栈是一种特殊设计的栈结构&#xff0c;为了解决如下的问题&#xff1a; 给定一个可能含有重复数值的 arr[]&#xff0c;i位置的数一定存在如下两种信息&#xff1a; arr[i]的左侧离 i 最近并且小于&#xff08;或者大于&#xff09;arr[i] 的数在哪&#xff1f;arr…

边缘AI行业报告:发展趋势、相关机遇、产业链及相关公司深度梳理

今天分享的AI系列深度研究报告&#xff1a;《边缘AI行业报告&#xff1a;发展趋势、相关机遇、产业链及相关公司深度梳理》。 &#xff08;报告出品方&#xff1a;慧 博 智 能 投 研&#xff09; 报告共计&#xff1a;31页 边缘计算及边缘 AI 概述 1.边缘AI 边缘 AI(本文指…

第四节JavaScript 条件语句、循环语句、break与continue语句

一、JavaScript条件语句 在通常的代码中&#xff0c;我们有一些需要决定执行不同动作&#xff0c;这就可以在代码中使用条件语句来完成。 下面是我们常使用的条件语句&#xff1a; if语句&#xff1a;只有当指定条件是true时&#xff0c;执行条件内代码。if…else语句&#…

代码序随想录二刷 |二叉树 | 二叉树的层序遍历II

代码序随想录二刷 &#xff5c;二叉树 &#xff5c; 二叉树的层序遍历II 题目描述解题思路代码实现 题目描述 107.二叉树的层序遍历II 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0…

【Unity动画】Avatar Mask

创建 Avatar Mask可以设置那一部分骨骼运动和不运动 然后放在状态机里面的层中来混合 【后续完善】

JVM虚拟机系统性学习-运行时数据区(堆)

运行时数据区 JVM 由三部分组成&#xff1a;类加载系统、运行时数据区、执行引擎 下边讲一下运行时数据区中的构成 根据线程的使用情况分为两类&#xff1a; 线程独享&#xff08;此区域不需要垃圾回收&#xff09; 虚拟机栈、本地方法栈、程序计数器 线程共享&#xff08;数…

java接入gpt开发

前情提要 本次文章使用编译器为IDEA2020 使用GPT模型为百度旗下的千帆大模型 如果是个人用或者不流传出去&#xff0c;可以无脑入&#xff0c;因为会免费送20块钱&#xff08;够用上万次&#xff09; 代金卷查看 正式教程&#xff1a; 百度智能云控制台 (baidu.com) 按照步…

游戏提示找不到d3dx10_43.dll怎么办?5种方法教你如何修复

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“缺少d3dx10_43.dll文件”。这个错误提示通常出现在运行某些游戏或应用程序时&#xff0c;它意味着系统无法找到所需的动态链接库文件。本文将详细介绍d3dx10_43.dll文件的作用以及导致其丢…

《文化创新比较研究》期刊发表杂志投稿

《文化创新比较研究》是由国家新闻出版总署批准&#xff0c;黑龙江文化产业投资控股集团有限公司主管主办的学术期刊&#xff08;旬刊&#xff09;。 以学术研究为基础&#xff0c;始终坚持双百方针&#xff0c;立足理论前沿&#xff0c;关注学术热点&#xff0c;推动学术文化交…

kotlin - ViewBinding

前言 为什么用ViewBinding&#xff0c;而不用findViewById()&#xff0c;这个有很多优秀的博主都做了讲解&#xff0c;就不再列出了。 可参考下列博主的文章&#xff1a; kotlin ViewBinding的使用 文章里也给出了如何在gradle中做出相应的配置。 &#xff08;我建议先看这位博…

手把手教你玩转DHT11(原理+驱动)

大家生活中一定经常使用温湿度数据&#xff0c;比如&#xff1a;天气预报、智能家居、智慧大屏等等。这些数据可以通过温湿度传感器进行获取。在嵌入式开发中&#xff0c;温湿度传感器是一种十分常用的传感器。本文将为大家介绍温湿度传感器 DHT11&#xff0c;内容包含模块介绍…

Mac电脑投屏AirServer 2024怎么下载安装激活许可期限

对于那些想要将 iPhone、iPad 或其他 iOS 设备上的小屏幕镜像到计算机上的大屏幕的人来说&#xff0c;AirPlay 是一个很好的工具。 基于此&#xff0c;AirServer 非常需要将您的 Mac 或 PC 变成 AirPlay 设备。 但是如何使用计算机上的设置对 iPhone 等 iOS 设备进行屏幕镜像&a…

nginx中Include使用

1.include介绍 自己的理解&#xff1a;如果学过C语言的话&#xff0c;感觉和C语言中的Include引入是一样的&#xff0c;引入的文件中可以写任何东西&#xff0c;比如server相关信息&#xff0c;相当于替换的作用&#xff0c;一般情况下server是写在nginx.conf配置文件中的&…

三. LiDAR和Camera融合的BEV感知算法-BEVFusion实战

目录 前言1. BEVFusion实战 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第三章——LiDAR和Camera融合的BEV感知算法&#xff0c;一起去学习下 BEVFusion 的相关代码 课…

理解MyBatis原理、思想

JDBC编码的缺点 结果集解析复杂&#xff0c;列名硬编码&#xff0c;sql变化导致解析代码变化&#xff0c;系统不易维护。Sql语句硬编码&#xff0c;难以维护。 数据库配置硬编码。频繁连接、释放数据库资源&#xff0c;降低系统性能。preparedStatement向占位符号传参数存在硬…

SpringBoot集成系列--xxlJob

文章目录 一、搭建调度中心xxl-job-admin1、下载项目2、调整项目参数3、执行初始化数据库SQL4、启动项目5、访问 二、集成步骤1、添加xxl-job的依赖2、添加xxl-job的依赖3、配置执行器4、创建执行器5、开发任务1&#xff09;方式1&#xff1a;BEAN模式&#xff08;方法形式&…

文心ERNIE Bot SDK+LangChain:基于文档、网页的个性化问答系统

现在各行各业纷纷选择接入大模型&#xff0c;其中最火且可行性最高的形式无异于智能文档问答助手&#xff0c;而LangChain是其中主流技术实现工具&#xff0c;能够轻松让大语言模型与外部数据相结合&#xff0c;从而构建智能问答系统。ERNIE Bot SDK已接入文心大模型4.0能力&am…

2023-12-10 LeetCode每日一题(爬楼梯)

2023-12-10每日一题 一、题目编号 70. 爬楼梯二、题目链接 点击跳转到题目位置 三、题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 示例 2&#xff1a; 提…