linux物理内存管理:node,zone,page

一、总览

对于物理内存内存,linux对内存的组织逻辑从上到下依次是:node,zone,page,这些page是根据buddy分配算法组织的,看下面两张图:

上面的概念做下简单的介绍:

  • Node:每个CPU下的本地内存节点就是一个Node,如果是UMA架构下,就只有一个Node0,在NUMA架构下,会有多个Node
  • Zone:每个Node会划分很多域Zone,大概有下面这些:
  • ZONE_DMA:定义适合DMA的内存域,该区域的长度依赖于处理器类型。比如ARM所有地址都可以进行DMA,所以该值可以很大,或者干脆不定义DMA类型的内存域。而在IA-32的处理器上,一般定义为16M。
  • ZONE_DMA32:只在64位系统上有效,为一些32位外设DMA时分配内存。如果物理内存大于4G,该值为4G,否则与实际的物理内存大小相同。
  • ZONE_NORMAL:定义可直接映射到内核空间的普通内存域。在64位系统上,如果物理内存小于4G,该内存域为空。而在32位系统上,该值最大为896M。
  • ZONE_HIGHMEM:只在32位系统上有效,标记超过896M范围的内存。在64位系统上,由于地址空间巨大,超过4G的内存都分布在ZONE_NORMA内存域。
  • ZONE_MOVABLE:伪内存域,为了实现减小内存碎片的机制。
  • 分配价值链
    • 除了只能在某个区域分配的内存(比如ZONE_DMA),普通的内存分配会有一个“价值”的层次结构,按分配的“廉价度”依次为:ZONE_HIGHMEM > ZONE_NORMAL > ZONE_DMA。
    • 即内核在进行内存分配时,优先从高端内存进行分配,其次是普通内存,最后才是DMA内存
  • Page:zone下面就是真正的内存页了,每个页基础大小是4K,他们维护在一个叫free_area的数组结构中
    • order:数组的index,也叫order,实际对应的是page的大小,比如order为0,那么就是一堆1个空闲页(4K)组成的链表,order为1,就是一堆2个空闲页(8K)组成的链表,order为2,就是一堆4个空闲页(16K)组成的链表

二、源码分析

内存节点结构体在linux内核include/linux/mmzone.h文件

levelstructdesc
nodestruct pglist_data

NUMA下每个node由一个pglist_data结构体描述

UMA下只有一个node,即全局变量struct pglist_data contig_page_data;

zonestruct zone每个node下的物理内存被划分为不同zone,体现不同用途。整个系统里可能只有几个struct zone
pagestruct page描述每个物理页(page frame)的结构,每个物理页都有一个struct page,寸土寸金。

2.1、 struct pglist_data

mmzone.h - include/linux/mmzone.h - Linux source code v5.4.285 - Bootlin Elixir Cross Referencer

每个NUMA node对应一个struct pglist_data结构体,一些重要成员有:

nametypedesc
node_zonesstruct zone数组,长度为MAX_NR_ZONES该node下的zone。数组长度虽然是MAX_NR_ZONES,但是不代表当前node的实际zone数目就是MAX_NR_ZONES。实际的数量用nr_zones表示
node_zonelistsstruct zonelist数组,长度为MAX_ZONELISTS内存分配器在分配内存时,按照一定的策略遍历不同的内存区域,以找到合适的内存块。不同的内存区域可能有不同的属性(dma,normal,high等),node_zonelists帮助内存分配器根据需求选择合适的区域
nr_zonesint该node下实际zone的数量
node_start_pfnunsigned long longnode的起始pfn号,起始的物理地址
node_present_pagesunsigned long longnode实际包括的page数目(不含空洞)
node_spanned_pagesunsigned long long

node横跨的page数目(包括空洞)

kswapd

struct task_struct *

每个node都有一个kswapd线程,用于回收不经常使用的页面或者内存不足时回收内存
kswapd_waitstruct wait_queue_head kswapd_wait表示是一个kswapd等待队列,里面存放的是等待kswapd线程执行异步回收的线程,在free_area_init_core 函数中被初始化。

pfmemalloc_wait

struct wait_queue_head

 表示等待直接内存回收(direct reclaim)结束的线程等待队列。里面存放的都是等待由kswapd帮忙做完直接内存回收的线程。当kswapd直接内存回收后,整个node的free pages满足要求时,在kswapd睡眠前,kswapd会唤醒pfmemalloc_wait里面的线程,线程直接进行内存分配,这个等待队列的线程跳过了自己direct reclaim的操作。

kswapd_order

int表示kswapd线程内存回收的单位(2^kswapd_order),要求大于线程内存分配所需求的order,否则会更新为线程内存分配对应的order。
node_mem_map;

struct page *

当前node中所有struct page构成的mem_map数组

 常见的zone类型有:

  • ZONE_DMA,一些设备地址线数目有限(如24位),进行DMA时只能使用低地址(如<16MB),划分出ZONE_DMA防止低地址的页被分出去导致设备无法进行DMA。
  • ZONE_DMA32,64位系统下,区分支持32位地址线和24位地址线的DMA设备。
  • ZONE_NORMAL,一般内存处于这个zone区域。
  • ZONE_HIGHMEM,32位系统虚拟地址空间太小,只有1G给内核态,因此只能映射最多1G物理内存。高端内存区用于建立到物理地址的临时映射,使内核态可以寻址更多物理地址。64位架构下虚拟地址空间足够大,不需要这个zone。
enum zone_type {
#ifdef CONFIG_ZONE_DMA/** ZONE_DMA is used when there are devices that are not able* to do DMA to all of addressable memory (ZONE_NORMAL). Then we* carve out the portion of memory that is needed for these devices.* The range is arch specific.** Some examples** Architecture		Limit* ---------------------------* parisc, ia64, sparc	<4G* s390, powerpc	<2G* arm			Various* alpha		Unlimited or 0-16MB.** i386, x86_64 and multiple other arches* 			<16M.*/ZONE_DMA,
#endif
#ifdef CONFIG_ZONE_DMA32/** x86_64 needs two ZONE_DMAs because it supports devices that are* only able to do DMA to the lower 16M but also 32 bit devices that* can only do DMA areas below 4G.*/ZONE_DMA32,
#endif/** Normal addressable memory is in ZONE_NORMAL. DMA operations can be* performed on pages in ZONE_NORMAL if the DMA devices support* transfers to all addressable memory.*/ZONE_NORMAL,
#ifdef CONFIG_HIGHMEM/** A memory area that is only addressable by the kernel through* mapping portions into its own address space. This is for example* used by i386 to allow the kernel to address the memory beyond* 900MB. The kernel will set up special mappings (page* table entries on i386) for each page that the kernel needs to* access.*/ZONE_HIGHMEM,
#endifZONE_MOVABLE,
#ifdef CONFIG_ZONE_DEVICEZONE_DEVICE,
#endif__MAX_NR_ZONES};

2.2、 struct zone

mmzone.h - include/linux/mmzone.h - Linux source code v5.4.285 - Bootlin Elixir Cross Referencer

zone通过pfn和一些计数器描述它管理的物理地址空间:

  • zone_start_pfn,该zone所描述空间的起始页号。
  • spanned_pages,整个空间(包括空洞)占据的物理页数目,它等于zone_end_pfn - zone_start_pfn
  • present_pages,存在于空间中的物理页数目,等于spanned_pages减掉空洞中的页数目。
  • managed_pages,被buddy system管理的页数目,等于present_pages减掉被zone预留做其他用途的页数目。
  • struct free_area free_area[MAX_ORDER]buddy system使用的空闲链表,是一个per zone的结构。它直接存储了指向struct page*的指针。(详细见:伙伴(buddy)系统原理_伙伴系统算法-CSDN博客)
  • unsigned long _watermark[NR_WMARK]:内存水位值,分别为WMARK_MIN, WMARK_LOW, WMARK_HIGH水位,这在页面分配器和kswapd页面回收中会用到。
  • long lowmem_reserve[MAX_NR_ZONES]:zone中预留的内存。在内存分配时,高区的内存不足可以向低区的内存申请。reserve内存是确保在内存紧张的时候,仍然保留一定数量的低区内存,确保高区内存不会完全耗尽低区内存资源。

 2.3、 struct page

mm_types.h - include/linux/mm_types.h - Linux source code v5.4.285 - Bootlin Elixir Cross Referencer

这是一个特别复杂的结构,里面有很多的 union,这里之所以用了 union,是因为一个物理页面使用模式有两种。第一种模式,仅需分配小块内存,Linux 系统采用了一种被称为 slab allocator的技术。第二种模式,要用就用一整页。这一整页的内存,或者直接和虚拟地址空间建立映射关系,我们把这种称为匿名页(Anonymous Page)。或者用于关联一个文件,然后再和虚拟地址空间建立映射关系,这样的文件,我们称为内存映射文件(Memory-mapped File)。

每个物理页对应一个page结构体,称为页描述符,内存节点的pglist_data实例的成员node_mem_map指向该内存节点包含的所有物理页的页描述符组成的数组。

一些重要成员有:

nametypedesc
flagsunsigned longenum pgdat_flags 可以指示节点的状态或特定的内存管理属性。以便在内存分配、回收和其他操作中做出相应的决策。
以下是一些常见的 pgdat_flags 标志:
PGDAT_CONGESTED:表示该节点的内存可能处于拥塞状态。
PGDAT_WRITEBACK:表示该节点的内存正在进行写回操作。
PGDAT_RECLAIM_LOCKED:表示该节点的内存回收操作被锁定。
 

三、建立与初始化过程

ref:

Linux内存管理-1 | Do not touch fish!

Linux内存初始化(3)——pglist_data/zone初始化_linux struct page结构初始化-CSDN博客

Linux 物理内存管理涉及的三大结构体之struct pglist_data_linux的三种内存模型-CSDN博客

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

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

相关文章

Pr:视频过渡快速参考(合集 · 2025版)

Adobe Premiere Pro 自带七组约四十多个视频过渡 Video Transitions效果&#xff0c;包含不同风格和用途&#xff0c;可在两个剪辑之间创造平滑、自然的转场&#xff0c;用来丰富时间、地点或情绪的变化。恰当地应用过渡可让观众更好地理解故事或人物。 提示&#xff1a; 点击下…

使用vscode 连接linux进行开发

1. 在Vscode中安装扩展功能remote ssh 2. 打开命令窗口 3. 在弹出的命令窗口输入ssh&#xff0c;并从弹出的提示中选择 Add New SSH Host 4. 在弹出的输入窗口中输入类似下面形式的 连接地址&#xff1a; 5. 输入回车后出现下面的对话框&#xff0c;这个对话框是说你要用哪个…

面试击穿mysql

Mysql三大范式: 第一范式&#xff08;1NF&#xff09;&#xff1a; 不符合第一范式的典型情况是在一个字段中存放多种不同类型的详细信息。例如&#xff0c;在商品表中&#xff0c;若将商品名称、价格和类型都存储在同一个字段中&#xff0c;会带来诸多弊端。首先&#xff0c;在…

excel功能

统计excel中每个名字出现的次数 在Excel中统计每个名字出现的次数&#xff0c;您可以使用COUNTIF函数或数据透视表。以下是两种方法的详细步骤&#xff1a; 方法一&#xff1a;使用COUNTIF函数 准备数据&#xff1a;确保您的姓名列表位于一个连续的单元格区域&#xff0c;例如…

单体架构 IM 系统之长轮询方案设计

在上一篇技术短文&#xff08;单体架构 IM 系统之核心业务功能实现&#xff09;中&#xff0c;我们讨论了 “信箱模型” 在单体架构 IM 系统中的应用&#xff0c;“信箱模型” 见下图。 客户端 A 将 “信件” 投入到客户端 B 的 “信箱” 中&#xff0c;然后客户端 B 去自己的 …

webpack loader全解析,从入门到精通(10)

webpack 的核心功能是分析出各种模块的依赖关系&#xff0c;然后形成资源列表&#xff0c;最终打包生成到指定的文件中。更多复杂的功能需要借助 webpack loaders 和 plugins 来完成。 1. 什么是 Loader Loader 本质上是一个函数&#xff0c;它的作用是将某个源码字符串转换成…

web——sqliabs靶场——第一关

今天开始搞这个靶场&#xff0c;从小白开始一点点学习,加油&#xff01;&#xff01;&#xff01;&#xff01; 1.搭建靶场 注意点&#xff1a;1.php的版本问题&#xff0c;要用老版本 2.小p要先改数据库的密码&#xff0c;否则一直显示链接不上数据库 2.第一道题&#xff0…

Linux基础—网络设置

linux系统的网络设置 1、网络的基本设置 2、dhcp和ftp 3、nfs共享文件共享系统和ssh远程连接 4、dns解析 5、pxe自动装机&#xff08;centos&#xff09; 网络的基本设置 查看网络接口信息: ipaddr/ip a 简略的查看网络接口信息 ifconfig 表示只显示当前活跃的设备 ifc…

ST-GCN模型实现花样滑冰动作分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

android studio 配置过程

Android studio版本&#xff1a;Android Studio Ladybug | 2024.2.1 windows 10 x64 关键问题解决方法&#xff1a; 1.设置代理&#xff1a; 退出首次配置&#xff0c;进入ide&#xff08;必要时新建工程&#xff09;然后&#xff1a; 然后重启ide 等待下载完成。 代理地…

关于分治法左右区间单调遍历应该如何设计

阅读以下文章&#xff0c;首先至少要求通过一道分治法的题目或听过一道该类型的讲解。 对于分治的题目&#xff0c;想必你应该知道&#xff0c;通常我们是对于一个区间拆分两个部分&#xff0c;而最小子问题通常是只包含一个元素的区间数组。为了后续方便处理更大范围的区间&am…

【软件测试】敏捷模型(Scrum模型)和V模型、W模型

敏捷模型 前面的那些模型以前非常流行&#xff0c;但现在开发人员在使用的时候会遇到各种问题。主要困难包括在项目开发期间处理来自客户的变更请求&#xff0c;以及合并这些变更所需要的高成本和时间。 在实际工作中&#xff0c;一款产品的功能是不断在变化的 所以为了克服这…

大数据新视界 -- 大数据大厂之 Impala 性能优化:数据加载策略如何决定分析速度(上)(15/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

掌握核密度图:精准描绘不同年龄段的血糖分布

在医学研究中&#xff0c;数据的可视化是理解复杂信息和做出科学决策的关键。今天&#xff0c;我们将深入探讨一种强大的数据可视化工具——核密度图&#xff08;Kernel Density Plot&#xff0c;简称KDE&#xff09;&#xff0c;并通过Python代码实例&#xff0c;展示如何基于…

实验室信息管理系统源码,医院LIS系统源码,C/S结构,C#语言开发,适合上项目。

实验室信息管理系统源码&#xff0c;医院LIS系统源码&#xff0c;三甲以下医院需求都能满足。 LIS系统即实验室信息管理系统。LIS系统能实现临床检验信息化&#xff0c;检验科信息管理自动化。其主要功能是将检验科的实验仪器传出的检验数据经数据分析后&#xff0c;自动生成打…

计算机在启动一直到系统加载完成期间进行了哪些操作

零 扇区和分区的概念与联系 概念 扇区&#xff08;Sector&#xff09;&#xff1a; 扇区是硬盘中最小的物理存储单位&#xff0c;每个扇区通常为512字节&#xff08;一些新硬盘为4KB&#xff09;。硬盘在制造时会被划分成许多扇区&#xff0c;这些扇区在硬盘中依次排列。数据被…

Meta AI 新技术,赋予机器人 “触觉” 的革命

Meta AI 新技术&#xff0c;赋予机器人 “触觉” 的革命 简介 传统机器人的局限 Meta AI 的新技术突破 技术应用前景 未来展望 简介 在科技飞速发展的今天&#xff0c;人工智能领域不断取得令人惊叹的突破。11月4日&#xff0c;Meta公司宣布其基础人工智能研究团队(FAIR)在…

IPguard与Ping32加密软件对比评测,哪款更适合企业数据保护?

在信息化时代&#xff0c;企业的数据安全至关重要&#xff0c;特别是在文件管理和源代码加密方面&#xff0c;更需要强有力的防护工具。目前&#xff0c;IPguard与Ping32是市场上两款常用的企业数据加密软件。今天&#xff0c;我们从多方面进行对比&#xff0c;为大家解析哪款软…

【linux】CentOS 的软件源(Repository)学习

CentOS 7 的软件源&#xff08;Repository&#xff09;是用于分发和管理软件包的集中存储库。这些源包含了操作系统所需的各种软件包&#xff0c;包括系统工具、库、应用程序等。通过配置不同的软件源&#xff0c;用户可以选择从不同的服务器下载软件包&#xff0c;以提高下载速…

PyQt5超详细教程终篇

PyQt5超详细教程 前言 接&#xff1a; [【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;](【Python篇】PyQt5 超详细教程——由入门到精通&#xff08;序篇&#xff09;-CSDN博客) 建议把代码复制到pycahrm等IDE上面看实际效果&#xff0c;方便理…