首页 > 系统相关 >内存映射

内存映射

时间:2024-07-05 17:31:39浏览次数:5  
标签:文件 映射 mmap PROT 内存 数据

mmap内存映射函数 (显示图片的新方法) ---- 也是Linux系统IO中的函数之一

基本概念

系统IO函数的共同点:就是他们的形参中一定有一个是文件描述符(除open)。

内存 映射的意思:拆
    内存:普通运存,显存(集显和独显),是一块内存空间,存放显示画面的像素点。  
    映射:两个集合中的元素,都具有一一对应的关系。
    
    显存     :集合A 存放显示画面的像素点。 
    设备文件 :集合B fb0就是用来存放像素点的!
    
把指定一个文件映射进内存里面,是的,文件中的数据位置和内存中的数据位置一一对应。     有一方的数据位置上的数据改变了,另外一方也会跟着改变           
    
关于mmap映射的集合:
    集合A:内存
    集合B:被映射的文件
问题:一个文件算不算一个集合? 算

mmap 内存映射比 write 函数效率更快的主要原因有几点:

减少数据拷贝:使用 mmap 内存映射,可以将文件直接映射到进程的地址空间中,避免了在用户空间(内存)和内核空间(磁盘)之间频繁的数据拷贝(IO)操作。而使用 write 函数则需要先将数据从用户空间拷贝到内核缓冲区,再进行实际的写入操作,涉及了额外的数据拷贝过程。
    减少系统调用:mmap 内存映射只需要进行一次系统调用来建立映射关系,之后对内存的读写操作都直接在用户空间进行,不需要再进行系统调用。而使用 write 函数每次写入都需要进行系统调用,会增加系统调用的__性能__开销。
    页面缓存利用:mmap 映射的文件数据会被缓存在页面缓存中,这意味着多个进程可以共享同一份数据副本,减少了物理内存的占用。而使用 write 函数每次写入都会导致数据在内核态和用户态之间的复制,没有利用到页面缓存。

基本用法--- man 2 mmap

源文件的文本数据大小一样。不要映射空文件,因为空文件里面没有空间(没数据位置)。

prot:映射空间的权限   PROT_READ | PROT_WRITE
       PROT_EXEC  Pages may be executed. 

       PROT_READ  Pages may be read.

       PROT_WRITE Pages may be written.

       PROT_NONE  Pages may not be accessed.

flags:映射空间的属性:默认设置的是共享属性
    MAP_SHARED:
                共享属性
                通过对映射指针解引用赋值数据,数据会回写到打开的原文本(fb0),而且原文本中的数据会共享给其他进程(血缘关系的进程)。
                
    MAP_PRIVATE:
                私有属性                    
                 通过对映射指针解引用赋值数据,数据不会回写到原文本,而且原文本中的数据不会共享给其他进程(血缘关系的进程)。
                 
fd:要想映射的文件的文件描述符,打开它的时候如果你想具有共享属性的映射,打开文件的方式要可读可写不然会映射失败。

offset:偏移量 设置原文件的映射位置到文件首部的偏移量,0表示文件首部开始映射。存储单位是页存储,一页 = 4096

image

标签:文件,映射,mmap,PROT,内存,数据
From: https://www.cnblogs.com/hhail08/p/18286255

相关文章

  • 内存缓存选型
    背景tcp网关出现了内存泄漏的现象,经排查后发现是一个java原生内存缓存导致的。Map<String,String>belongCache=newConcurrentHashMap<>();该内存缓存作为兜底缓存使用,主要逻辑是读取redis用户身份信息后,有则更新到内存缓存,没有则从内存缓存中获取缓存数据。该内存缓存直......
  • Nginx设置二级域名映射到不同的Tomcat
    一、前言在之前的博客中,已经安装好了多个tomcat和nginx,本篇博客将介绍如何设置不同的二级域名转发到不同的tomcat上二、配置服务器端我使用的是腾讯云服务器,只需要在云解析中配置相关域名信息即可三、配置nginx进入nginx的配置文件中cd/usr/local/nginx/confvimnginx.c......
  • JVM 堆内存结构 年轻代 老年代
    堆内存内存划分对于大多数应用,Java堆是Java虚拟机管理的内存中最大的一块,被所有线程共享。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数据都在这里分配内存。为了进行高效的垃圾回收,虚拟机把堆内存逻辑上划分成三块区域(分代的唯一理由就是优化GC性......
  • 《操作系统》内存管理_内存扩充技术补充
    前言  操作系统王道书里面既然没有这个知识点,但却有一节网课。我不能不记笔记,所以我将这补充一下,写出博客。操作系统内存管理的四大功能  内存空间的分配与回收、地址转换、存储保护、内存空间的扩充内存空间的扩充覆盖技术  早期的计算机内存很小,经常会出现内存大小......
  • c语言回顾-内存操作函数
    目录前言1.memcpy 函数1.1函数介绍1.2与strcpy的区别1.3memcpy的模拟2.memmove函数2.1函数介绍和使用2.2函数的模拟3.memset函数3.1函数介绍3.2函数的模拟4.memcmp函数4.1函数的使用4.2函数的模拟结束语前言在动态内存的章节中小编详细讲解了动态内存分......
  • C++内存管理
    内存管理C/C++内存分布静态区(数据段)全局变量:在整个程序运行期间都存在的变量,包括没有显式声明为static的全局变量。静态局部变量:在函数内部声明为static的变量。它们在函数首次调用时初始化,并在程序整个运行期间保持其值。静态全局变量:在文件作用域中声明为static的变量。......
  • 一、内存分区模型
    1.概述C++程序在执行时,将内存方向划分为4个区域。代码区:存放函数体的二进制代码,由操作系统进行管理全局区:存放全局变量,静态变量,常量栈区:由编译器自动分配释放,存放函数的参数值,局部变量堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收2.程序运行前编译后......
  • 内存管理-14-内核文档翻译-1-reserved-memory.txt
    本文翻译自:msm-5.4/arch/arm64/boot/dts/vendor/bindings/reserved-memory/reserved-memory.txt***Reserved内存区域***保留内存被指定为/reserved-memory节点下的一个节点。操作系统应将保留内存排除在正常使用之外,可以创建子节点来描述特定的保留(从正常使用中排除)内存区域......
  • 第四章 对象的实例化内存布局与访问定位
    对象的实例化内存布局与访问定位对象的实例化 对象创建的方式(1)new:最常见的方式、单例类中调用getInstance的静态类方法,XXXFactory的静态方法(2)Class的newInstance方法:在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为public(3)Cons......
  • golang 内存逃逸 你应该知道的知识
    逃逸分析目录1.为什么要了解内存逃逸2.什么是逃逸分析3.内存逃逸的影响-性能和稳定性4.内存逃逸的原因5.内存逃逸的检测6.如何避免内存逃逸7.内存逃逸代码示例原文链接:一文弄懂Golang中的内存逃逸1.为什么要了解内存逃逸-内存逃逸是Go语言编程中一个特别需要注意的问......