内核源码解读之内存管理(10)percpu_page_set分析

news2024/9/22 11:42:51

文章目录

    • 背景
    • 数据结构
    • pcp的初始化流程

背景

Linux系统中0阶内存分配需求是最多的, 而且经常存在频繁分配释放的行为,如果每次都去伙伴系统中申请,会经常需要获取zone->lock锁住整个zone区域。随着CPU核心数的增加,伙伴系统锁竞争激烈程度也会越来越大。
为了改善这个问题,linux内核中引入了per_cpu_pageset(下面简称pcp)。优化思路是先从zone一次性拿一些页出来,放到每个cpu自己本地中。释放也先放回到这里,等满了再一起还给zone。

数据结构

struct zone {
...
	struct per_cpu_pages	__percpu *per_cpu_pageset;
...
};

内核使用per_cpu_pageset数据结构记录pcp相关信息,其内嵌在zone数据结构中。
在这里插入图片描述

/* Fields and list protected by pagesets local_lock in page_alloc.c */
struct per_cpu_pages {
	spinlock_t lock;	/* Protects lists field */
	int count;		/* number of pages in the list */
	int high;		/* high watermark, emptying needed */
	int batch;		/* chunk size for buddy add/remove */
	short free_factor;	/* batch scaling factor during free */
#ifdef CONFIG_NUMA
	short expire;		/* When 0, remote pagesets are drained */
#endif

	/* Lists of pages, one per migrate type stored on the pcp-lists */
	struct list_head lists[NR_PCP_LISTS];
} ____cacheline_aligned_in_smp;

下面为几个关键成员的含义:
count记录了per_cpu缓存中页帧的总数,
high记录了per_cpu缓存中页帧的上限,如果超过这个值就将释放 batch个页帧到伙伴系统中去,如果per_cpu中没有可分配的页帧就从伙伴系统中分配batch个页帧到缓存中来。
per_cpu缓存中的页帧的page就挂接在链表数组struct list_head lists中。

为防止产生过多内存碎片,内核将页帧分类:可移动页,不可移动。内核还定义了一个枚举类型来表示这些可能的类型。

enum migratetype {
	MIGRATE_UNMOVABLE,
	MIGRATE_MOVABLE,
	MIGRATE_RECLAIMABLE,
	MIGRATE_PCPTYPES,	/* the number of types on the pcp lists */
	MIGRATE_HIGHATOMIC = MIGRATE_PCPTYPES,
#ifdef CONFIG_CMA
	/*
	 * MIGRATE_CMA migration type is designed to mimic the way
	 * ZONE_MOVABLE works.  Only movable pages can be allocated
	 * from MIGRATE_CMA pageblocks and page allocator never
	 * implicitly change migration type of MIGRATE_CMA pageblock.
	 *
	 * The way to use it is to change migratetype of a range of
	 * pageblocks to MIGRATE_CMA which can be done by
	 * __free_pageblock_cma() function.
	 */
	MIGRATE_CMA,
#endif
#ifdef CONFIG_MEMORY_ISOLATION
	MIGRATE_ISOLATE,	/* can't allocate from here */
#endif
	MIGRATE_TYPES
};

pcp页帧的类型只可能是:
MIGRATE_UNMOVABLE,
MIGRATE_MOVABLE,
MIGRATE_RECLAIMABLE,

不同类型和大小的pcp页帧挂在不同链表上,所以上面的lists是个数组。

pcp的初始化流程

在内核启动之初per_cpu机制还没有初始化,用于动态分配per_cpu变量的空间还没有分配,所以定义了一个静态的per_cpu变量boot_pageset,用以暂时管理内存域的per_cpu缓存。

mm/page_alloc.c
 
static DEFINE_PER_CPU(struct per_cpu_pageset, boot_pageset);

初始化内存域的zone->pageset字段:

start_kernel

     ------->setup_arch

              ----------->bootmem_init
              
                ------------->zone_sizes_init
                
                    ----------->free_area_init

                          ------------>free_area_init_node
                          
                             ------------->free_area_init_core
                             
                                ------------->zone_init_internals

                                      -------------->zone_pcp_init

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

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

相关文章

jumpserver堡垒机配置https访问

官方文档:https://docs.jumpserver.org/zh/master/ Jumpserver部署关闭防火墙开放策略 按照需要开放端口即可 firewall-cmd --permanent --add-port22/tcp 开放22端口 firewall-cmd --permanent --add-port80/tcp 开放80端口 firewall-cmd --permanent --add-po…

ctfshow-信息搜集

web1 右键查看源码得到flag web2 禁用了右键,可以ctrlu查看源码得到flag web3 抓包得到flag web4 题目提示在robots中,可以用dirsearch 扫出来 访问robots.txt 再访问/flagishere.txt得到flag web5 题目提示源码泄露,再用dirsearch扫…

如何在Linux上安装文件同步工具:FreeFileSync

文件同步是最需要的功能之一,尤其是在共享文件时,不仅如此,它还可以很好地用于将数据与云存储同步。因此,如果您正在寻找一种可免费获得且易于在 Linux 上使用的工具,请不要错过本文。 在 Linux Mint 21 上安装 FreeF…

【数据结构】(牛客)链表中倒数第k个结点,(LeetCode)合并两个有序链表,(牛客)CM11 链表分割

目录 一、链表中倒数第k个结点 1、题目说明 2、题目解析 二、合并两个有序链表 1、题目说明 2、题目解析 三、CM11 链表分割 1、题目说明 2、题目解析 一、链表中倒数第k个结点 1、题目说明 题目链接:链表中倒数第k个结点 输入一个链表,输出该链表中倒…

U3D客户端框架(资源管理篇)之自动化打Assetbundle包管理器

一、AssetBundle介绍 AssetBundle是将资源使用Unity提供的一种用于存储资源的压缩格式打包后的集合,它可以存储任何一种Unity可以识别的资源,如模型,纹理图,音频,场景等资源。也可以加载开发者自定义的二进制文件。他…

CleanMyMacX4.12最新免费版苹果电脑系统优化清理软件

CleanMyMac X是一款Mac上优秀的系统清理工具,它可以帮助用户清理垃圾文件、清理缓存、清理日志文件、清理应用程序等,可以让Mac系统保持良好的运行状态,提高Mac的运行速度。CleanMyMac X还可以帮助用户清理垃圾文件、清理缓存、清理日志文件、…

PCB翘曲度标准是多少

PCB翘曲其实也是指电路板弯曲,是指原本平整的电路板,放置桌面时两端或中间出现在微微往上翘起,这种现象被业内人士称为PCB翘曲。 电路板翘曲度计算公式将电路板平放在桌面上,电路板的四个角着地,测量中间拱起的高度&am…

乐观的调优(插入排序希尔排序)

学习目标 写在前面 1.插入排序 2.插入排序实战 3.插入排序的实现 4.插入排序的效率 5.平均情况 6.希尔排序 7.希尔排序的实现 8.希尔排序的效率 9.总结 写在前面 之前我们衡量一个算法的效率时,都是着眼于它在最坏情况下需要多少步。原因很简单&#x…

PyQt6快速入门-开发环境搭建

PyQt6开发环境搭建 文章目录 PyQt6开发环境搭建1、软件安装2 、创建工程2.1 创建Qt工程2.2 创建Python工程2.3 PyQt6启动失败问题解决本文将介绍如何在Windows下创建PyQt6的开发环境。 1、软件安装 第一步,下载并安装Python环境 https://www.python.org/downloads/windows/或…

effective C++读书笔记3

目录 在资源管理中小心copy行为 在资源管理中提供对原始资源的访问 以独立语句将newed对象置入智能指针 这是effectiveC中第三章内容:资源管理 在资源管理中小心copy行为 不是所有资源都是heap-based,对那种资源而言,像auto_ptr和 tr1 :…

【C语言进阶】数据在内存的存储

作者:匿名者Unit 目录一.数据类型分类1.整形2.浮点型3.构造类型4.指针类型5.空类型二.整形的存储1.原、反、补码2.大小端存储三.浮点数的存储一.数据类型分类 根据不同的数据类型,在内存中的人存储方法也有所差异,所以我们先来介绍一下数据类型的分类。…

(二)uboot移植--从零开始自制linux掌上电脑(F1C200S)<嵌入式项目>

目录 一、前言 二、F1C200s上电启动顺序 三、前期准备 四、新建用户 五、交叉编译环境配置 六、uboot简介 七、uboot移植 🍏 uboot下载 🍏 uboot默认配置 🍏 uboot图形界面配置 🍏 uboot编译 🍏 烧录bin…

Python-变量和简单数据类型

目录 1. 字符串 1.1. 修改字符串大小写 1.2. 合并字符串 1.3. 制表符与换行符 1.4. 删除空白 2. 数字 2.1. 使用 2.2. 使用str函数避免类型错误 2.3. 注释 2.4. Python之禅 1. 字符串 1.1. 修改字符串大小写 首字母大写:name.title()全部大写&#xf…

基于DDAUNet的CT食管肿瘤分割

摘要 在CT图像中手动或自动描绘食道肿瘤是非常具有挑战性的。这是由于肿瘤与邻近组织的对比度低,食道的解剖结构变化,以及偶尔存在异物(如喂食管)。 本文提出了一种基于卷积神经网络的全自动端到端食管肿瘤,本文所提出的网络称为扩张密集注意力网络,利用每个密集块中的空…

VScode代码片段尝试

最近开始尝试强迫自己使用 VSCode,毕竟 Webstorm 用了很多年了,依赖性比较严重。但是,最近 Webstorm 越来越难搞到免费永久合法使用方式了。 遂转向 VSCode 。 不过 VSCode 需要调教,不像 Webstorm 那么集成度比较高&#xff0c…

CalDAV网络服务器Baikal

什么是 Baikal ? Baikal 是一个免费的开源自托管 CalDav 和 CardDav 服务器,适用于想要管理其数据并确保其数据是私有的用户。 Baikal和群晖套件中的 Synology Calendar 是类似的应用; 什么是 CalDav ? CalDav 是一种互联网标准和协议&…

Qt扫盲-QVector理论总结

QVector理论总结一、概述二、使用1. 声明初始化2. 获取元素和链表信息3. 常用操作4. 迭代Vector三、注意一、概述 QVector是Qt的泛型容器类之一。它将每一个元素存储在相邻的内存位置,并提供快速的基于索引的访问。 QList, QLinkedList, QVe…

eurake原理分析以及搭建

消费者随时能够监控到服务的状态 消费者如何获取服务提供者具体的信息? 1)服务提供者启动时间eureka注册自己的信息 2)eureka保存这些信息 3)消费者根据服务名称向eureka拉取提供者的信息 如果有多个服务提供者,消费者…

VS代码生成工具ReSharper v2022.3官宣首发——支持C# 11

实质上,ReSharper特征可用于C#,VB.net,XML,Asp.net,XAML,和构建脚本。 使用ReSharper,你可以进行深度代码分析,智能代码协助,实时错误代码高亮显示,解决方案范…

网络OSI(七层模型)

OSIOSI是一个理论上的网络通信模型,而TCP/IP则是实际运行的网络协议。TCP/IPTCP/IP (传输控制协议/网际协议) 网络通信模型 以及一整个网络传输协议家族应用层应用层协议: FTP TFTP HTTP SNMP SMTP DNS Telnet表示层 数据格式化 代码转换 数据解密/加密会话层 解除或…