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

8.3 内存映射

时间:2023-07-28 17:14:38浏览次数:27  
标签:8.3 映射 对象 区域 内存 虚拟内存 页面

Linux通过将一个虚拟内存区域与一个磁盘上的对象(object)关联起来,以初始化这个虚拟内存区域的内容,这个过程称为内存映射(memory mapping)。虚拟内存区域可以映射到两种类型的对象中的一种: 1) Linux文件系统中的普通文件:一个区域可以映射到一个普通磁盘文件的连续部分,例如一个可执行目标文件。文件区(section)被分成页大小的片,每一片包含一个虚拟页面的初始内容。因为按需进行页面调度,所以这些虚拟页面没有实际交换进入物理内存,直到CPU第一次引用到页面(即发射一个虚拟地址,落在地址空间这个页面的范围之内)。如果区域比文件区要大,那么就用零来填充这个区域的余下部分。 2)匿名文件:一个区域也可以映射到一个匿名文件,匿名文件是由内核创建的,包含的全是二进制零。CPU第一次引用这样一个区域内的虚拟页面时,内核就在物理内存中找到一个合适的牺牲页面,如果该页面被修改过,就将这个页面换出来,用二进制零覆盖牺牲页面并更新页表,将这个页面标记为是驻留在内存中的。注意在磁盘和内存之间并没有实际的数据传送。因为这个原因,映射到匿名文件的区域中的页面有时也叫做请求二进制零的页(demand-zero page)。  共享对象 一个对象可以被映射到虚拟内存的一个区域,要么作为共享对象,要么作为私有对象。如果一个进程将一个共享对象映射到它的虚拟地址空间的一个区域内,那么这个进程对这个区域的任何写操作,对于那些也把这个共享对象映射到它们虚拟内存的其他进程而言,也是可见的。而且,这些变化也会反映在磁盘上的原始对象中。 另一方面,对于一个映射到私有对象的区域做的改变,对于其他进程来说是不可见的,并且进程对这个区域所做的任何写操作都不会反映在磁盘上的对象中。一个映射到共享对象的虚拟内存区域叫做共享区域。类似地,也有私有区域。  

标签:8.3,映射,对象,区域,内存,虚拟内存,页面
From: https://www.cnblogs.com/LCAB/p/17587930.html

相关文章

  • inux 系统中的不同进会程不会分配到相同的虚拟内存地址
    在正常情况下,Linux系统中的不同进程不会分配到相同的虚拟内存地址。这是由于虚拟内存管理机制的设计和实现原则决定的。以下是一些解释:1地址空间隔离:每个进程有自己独立的虚拟地址空间,它们在逻辑上是隔离的。这种隔离性是通过使用独立的页表来实现的。每个进程都有自己的页......
  • std::queue 中遇到释放内存错误的问题
    项目上有个需求要用到std::queue顺序处理消息事件简单的示例如下:structMyEvent{MyEvent(){event_=CreateEvent(nullptr,0,0,0);}~MyEvent(){std::cout<<"MyEventdeconstruct"<<std::endl;}voidRun(){if(event_!=nullptr){S......
  • linux内存日志 | journalctl指令
    摘要一、linux内存日志就是有些日志仅仅在系统允许过程中写在内存当中,但是并不会保存到硬盘当中重启后,内存日志就会情况二、指令指令功能说明选项journalctl查看全部journalctl-n3查看最新3条journalctl--since19:00--until19:10:10查看起始......
  • 设置ip和主机名映射:linux配置hosts文件 | windows配置hosts文件
    摘要目的:Windows下主机名和ip的映射关系linux设置主机名和ip的映射关系一、Windows设置主机名和ip映射修改文件C:\Windows\System32\drivers\etc\hosts,添加ip和主机名192.168.200.130CentOS192.168.10.100hadoop100192.168.10.101hadoop101192.168.10.102hadoop1......
  • Redis 过期删除策略与内存淘汰策略的区别及常用命令解析
    Redis是一种快速、高效的开源内存数据库,广泛应用于缓存、会话存储和实时数据处理等场景。为了维护数据的有效性和保证内存的合理利用,Redis引入了过期删除策略和内存淘汰策略。本文将深入探讨这两种策略的区别,同时解析与之相关的常用Redis命令,帮助读者更好地理解Redis在数据管理中的......
  • 映射匹配兼容性
               ......
  • Golang中结构体映射mapstructure库深入详解
    mapstructure用于将通用的map[string]interface{}解码到对应的 Go 结构体中,或者执行相反的操作。很多时候,解析来自多种源头的数据流时,我们一般事先并不知道他们对应的具体类型。只有读取到一些字段之后才能做出判断 +目录在数据传递时,需要先编解码;常用的方式是JSON编解码......
  • free -h查看内存情况,发现free部分远小于available
    原因是buff/cache占用了大量内存,需要手动释放下:echo3>/proc/sys/vm/drop_caches#参数说明:#0:不释放(系统默认值)#1:释放页缓存#2:释放dentries和inodes#3:释放所有缓存CacheMemory(缓存内存)当读写文件的时候,Linux内核为了提高读写性能与速度,会将文件在内存中进行缓存,这部分......
  • java 项目整合rabbitmq后内存飙高
    Java项目整合RabbitMQ后内存飙高的原因及解决办法在Java项目中使用RabbitMQ作为消息队列的时候,有时候会出现内存飙高的问题,特别是在消息量较大的情况下。本文将探讨这个问题的原因,并提供解决办法。问题分析当Java项目整合RabbitMQ后,内存飙高的原因通常是由于消息的生......
  • linux常用内存相关命令总结
    查看某个pid占用物理内存的峰值 cat/proc/pid/status|grep-E"VmHWM|VmRSS"参考信息:(23条消息)Linux下查看某一进程占用的内存_Jeremy_Lee123的博客-CSDN博客 内核内存泄漏常用工具kmemleakKmemleak是Linux内核提供的一个内存泄漏检测工具(内核3.1.5之后得版本支......