Linux——内存管理代码分析

虚空间管理

页框和页的关系

页框

将内存空间分为一个个大小相等的分区(比如:每个分区4KB),每个分区就是一个页框,也叫页帧,即物理页面,是linux划分内存空间的结果。
每个页框都有一个页框号,即内存块号、物理块号。

将用户进程的地址空间也分为与页框大小相等的一个个区域,称为页或页面,即虚拟页面,是linux划分地址空间的结果。
每个页面都有一个页号

页、页表项、页表、页目录项、页目录的关系参考:
计算机体系结构——虚拟内存技术

CSDN:基本分页存储管理的基本概念

线性区

当用户态进程动态请求内存时,linux并不会直接分配物理页框,而是先分配一段新的虚拟地址空间的使用权。

CSDN:进程地址空间 - VMA线性区

PCB中内存信息数据结构

主要的数据结构

mm_struct

mm是进程控制块中的一个成员,表示了该进程的内存信息。
每个进程都有自己的页目录、页表项等信息
在这里插入图片描述
在这里插入图片描述

*pgd: 一级页表的起始地址
*mmap:指向进程的第一个VMA
mm_rb:指向红黑树的根

vm_area_struct

线性区,表示用户虚空间中的一块连续区域,可以简称为vma。
数据结构成员包括权限信息等。
vm_rb->rb_left指针指向相邻的低地址VMA,vm_rb->rb_right指向相邻的高地址VMA1
在这里插入图片描述

page

页框描述符,描述了页框的类型(匿名页还是文件页)
在这里插入图片描述
mem_map:描述了所有页框,连续存放。

file

页高速缓存,以文件为管理单位:缓存的页框属于某个文件
硬盘数据页的高速缓存,放在页框中;

在这里插入图片描述
在这里插入图片描述

address_space

address_space:记录映射到本文件(某一区间)的所有线性区,这些线性区按其区间组织为一颗优先搜索树。
在这里插入图片描述
page_tree:文件的所有缓存页框的描述符构成一颗基树,该结构体表示基树的根节点,如果最低位为1,表示指向的是一个radix_tree_node对象

anon_vma

anon_vma数据结构,链接了page和anon_vma,实质上和anon_vma_chain共同链接了的page数据结构和VMA的vm_area_struct数据结构
在这里插入图片描述

anon_vma_chain

anon_vma_chain链接了anon_vma和vma
在这里插入图片描述

rb_node 和 rb_root

在这里插入图片描述

radix_tree_node

path:该节点的页节点数
count:表示有效页框描述符地址的数量
在这里插入图片描述

数据结构关系

数据结构关系图:
在这里插入图片描述

链表关系

所有的page构成一颗基树
在这里插入图片描述

页框描述符红黑树
通过page->index可以快速找到其他page地址
在这里插入图片描述

vma红黑树
所以进程的VMAs组成一个双向链表

反向映射

正向映射:页号 → 页框号,即通过虚拟页号查找物理页号
反向映射:页框号 → 进程号和页号的集合,即在已知物理页面(page frame)的情况下,找到映射该物理页面的虚拟页。

反向映射使用场景

反向映射通常在页框回收时需要此功能,例如

  1. 当内存空间不足时,有些页面长时间不适用,需要交换到磁盘
  2. 有些页面需要迁移

工作原理

当上述使用场景需要反向映射时,linux为了快速定位映射到该物理页的页表项,通过页框号查找页框描述符,通过页框描述符中的mapping确定是匿名页还是文件页,并根据mapping的值

t

父进程为自己的进程空间VMA分配物理页面的时,会产生匿名页面

匿名页和文件页

二者均是页框的类型。

匿名页

不属于文件的页高速缓存,没有关联到文件页,不是以文件形式存在,无法和磁盘文件交换
匿名页面是线性区的一种类型,映射到anon_vma对象(该对象关联了进程为对应线性区申请的一组匿名页框,并记录了使用这些页框的所有线性区)
mapping的最低位为1.

匿名页反向映射结构图2
在这里插入图片描述

文件页

映射文件的页,即某个文件的也高速缓存。程序可以通过read/write/mmap去操作,此时在内存中会申请page cache来缓存硬盘内容,因此该内容及存在于内存,也存在于外存中
属于某个address_space对象(该对象记录使用该文件页高速缓存的所有线性区)
mapping!=0,但mapping的最低位为0。

文件页反向映射结构图2
在这里插入图片描述

linux内存管理笔记(三十四)----匿名映射

参考文献


  1. 红黑树的应用:Linux内核虚拟内存的管理 ↩︎

  2. CSDN:linux内存管理笔记(三十八)----反向映射 ↩︎ ↩︎

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

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

相关文章

深度学习之指数移动平均模型(EMA)介绍

指数移动平均模型(Exponential Moving Average Model,EMA)是一种用于平滑时间序列数据的技术。它通过对数据进行加权平均来减少噪音和波动,从而提取出数据的趋势。 在深度学习中,EMA 常常用于模型的参数更新和优化过程…

完整指南:远程管理 Linux 服务器的 Xshell6 和 Xftp6 使用方法(Xshell无法启动:要继续使用此程序........,的解决方法)

😀前言 在当今软件开发领域,远程管理 Linux 服务器已成为日常工作的重要组成部分。随着团队成员分布在不同的地理位置,远程登录工具的使用变得至关重要,它们为开发人员提供了访问和管理服务器的便捷方式。本文将介绍两款功能强大的…

python随机显示四级词汇 修改版直接显示释义

python随机显示四级词汇 修改版直接显示释义 添加暂停 和继续(按下中建滚轮触发) 按下右键 退出程序 解决在暂停后 ,重新调用update_word 会明显发现每隔5秒更新一次单词的速率已经改变 速率改变的问题可能是由于暂停期间没有清除之前的定时器所导致的。为了确保重新调用updat…

Linux高级进阶-ssh配置

Ubuntu-system 允许使用root远程登陆 apt install ssh -y在/etc/ssh/sshd_config 文件修改PermitRootLogin yes systemctl restart ssh远程连接软件用户名为root

Ubuntu系统中Apache Web服务器的配置与实战

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

Educational Codeforces Round 166(Div.2) A~D

A.Verify Password(字符串) 题意: Monocarp正在开发他的新网站,目前面临的挑战是如何让用户选择强密码。 Monocarp认为,强密码应满足以下条件: 密码只能由小写拉丁字母和数字组成;字母后面不…

PasteCode系列系统说明

定义 PasteCode系列是指项目是基于PasteTemplate构建的五层以上项目,包括不仅限于 Domain EntityFrameworkCore Application.Contracts Application HttpApi.Host 熟悉ABP vNext就很好理解了,因为PasteTemplate就是基于ABP的框架精简而来!在…

一些Mysql面试题

InnoDB是如何存储数据的? InnoDB 的数据是按「数据页」为单位来读写的,默认数据页大小为 16 KB。每个数据页之间通过双向链表的形式组织起来,物理上不连续,但是逻辑上连续。 数据页内包含用户记录,每个记录之间用单向…

【java 如何将字符串反转?】

文章目录 概要示例(1)使用StringBuilder的reverse方法(2)使用charAt和循环(3)使用双指针(4)使用递归 总结 概要 在Java中,有多种方法可以将字符串反转,我这里…

代码随想录训练营第二天 977有序数组的平方 209长度最小的子数组 59螺旋矩阵II

第一题: 题目链接:977. 有序数组的平方 - 力扣(LeetCode) 思路: 先将数组求完平方和后进行排序,很简单,主要是排序算法的考察。 这里采用快排 快排的思路: 取这个数组的中间值…

代码随想录算法训练营第四十六 | ● 139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 视频讲解&#xff1a;https://www.bilibili.com/video/BV1pd4y147Rh https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<st…

java stream流之groupby的用法

简单分组 按照年龄对 Person 对象进行分组&#xff1a; 代码示例 import java.util.*; import java.util.stream.Collectors;public class SimpleGrouping {public static void main(String[] args) {List<Person> people Arrays.asList(new Person("Alice"…

上市即交付,比亚迪秦L DM-i万人交车暨千媒众测开营

6月6日&#xff0c;“引领中级 开创油耗2时代”秦L DM-i万人交车暨千媒众测开营仪式在比亚迪大本营深圳盛大举行。 众多车主代表亲临现场&#xff0c;与全国各地的比亚迪4S店千店联动&#xff0c;将秦L DM-i全国交付推向新的高潮。发布即量产&#xff0c;上市即交付&#xff0…

ESP32:FreeRTOS节拍配置(vTaskDelay延时10ms改为1ms)

文章目录 背景方法手动修改sdkconfig通过idf.py menuconfig 背景 在FreeRTOS的默认配置中&#xff0c;任务调度的频率默认是100HZ&#xff0c;因此默认vTaskDelay默认延时是10ms。 FreeRTOS 的系统时钟节拍可以在配置文件 FreeRTOSConfig.h 里面设置&#xff1a;#define confi…

【HarmonyOS】鸿蒙应用子模块module资源如何获取

【HarmonyOS】鸿蒙应用子模块module资源如何获取 一、问题背景&#xff1a; 在多模块项目工程中&#xff0c;单个模块的资源不会放在主模块中&#xff0c;所以我们需要在子模块中访问自己的资源。如果使用默认的资源获取api&#xff0c;会提示找不到资源。 那如何获取子模块下…

【AI基础】第四步:保姆喂饭级-langchain+chatglm2-6b+m3e-base

在第三步手动安装chatglm2-6b时&#xff0c;已经可以通过web进行交互。langchain重新封装了一下AI框架&#xff0c;提供更加友好的开发功能&#xff0c;类似于AI届的spring框架。langchain的安装过程也类似于上一步说的&#xff1a;【AI基础】第三步&#xff1a;纯天然手动安装…

负载均衡

文章目录 负载均衡的分类负载均衡的算法 负载均衡的分类 对链路的负载均衡 对链路的负载均衡主要是指应用方有多条ISP网络出口,比方说电信网通,电信铁通等,对链路的负载均衡也是解决目前电信网通互联互通的最专业的技术.其实现的原理是根据负载均衡算法来算出,到目标地址的数据…

企业获客有哪些好的广告推广拓客渠道?

在这个数字化营销的时代&#xff0c;企业要想在激烈的市场竞争中脱颖而出&#xff0c;选择正确的广告宣传渠道至关重要。随着互联网技术的飞速发展&#xff0c;各类媒体平台如雨后春笋般涌现&#xff0c;为企业提供了广阔的宣传空间。云衔科技通过多元化的媒体渠道&#xff0c;…

485数据采集模块

在工业自动化与智能化的浪潮中&#xff0c;数据采集作为整个系统的基础和核心&#xff0c;其准确性和实时性直接关系到生产效率和产品质量。而485数据采集模块&#xff0c;作为连接现场设备与上位机的重要桥梁&#xff0c;其性能与稳定性对于整个系统的运行至关重要。HiWoo Box…

【AIGC X UML 落地】通过多智能体实现自然语言绘制UML图

前天写了篇博文讲到用PlantUML来绘制C类图和流程图。后台有读者留言&#xff0c;问这步能否自动化生成&#xff0c;不想学习 PlantUML 语法。 我想了下&#xff0c;发现这事可行&#xff0c;确实可以做到通过自然语言的描述就能实现 UML图的绘制&#xff0c;昨天晚上加了个班到…