Linux物理内存:伙伴系统(buddy system)

news2025/1/10 23:56:40

引入

  1. 之前写过一篇文章将伙伴系统,可以参考:内存池算法简介

从上面的虚拟机上可以看到,X86系统上,有三个物理内存区,DMA,DMA32,Normal,可以看到阶数为11。

atomic_t _mapcount; : _mapcount初始值为-1,说明没有发生映射,用户没有使用这块内存,这个时候这块物理页应该在伙伴系统上挂着。

unsigned long private; :这个private 表示当前内存块的大小。page_order =1 代表 2^1

atomic_t _refcount; : 引用计数

枚举类型:migratetype

  1. 查看页面类型:cat /proc/pagetypeinfo

  1. 可以移动的:用户进程申请的内存

  1. 可回收的:文件系统的page cache

  1. 不可移动的:内核镜像区的物理内存。内核中很多物理地址,都是fireware中固定好的,是不能改变的,所以要求它所对应的页是不可移动的。

为什么引入迁移类型?

  1. 伙伴系统存在的问题:我们知道伙伴系统可以自动的进行页面合并,在很大的程度上可以避免内存碎片。但是也存在一些极端情况,比如,就是某些时候,需要一大块的连续内存,而这个时候物理内存页快已经满足不了。

  1. 引入迁移类型目的就是为了改进伙伴系统。

  1. page migratetype :不同类型的页面分类存储

  1. memory compaction :内存碎片整理,如下图所示,假如,我们需要连续4个页,但是现在已经没有连续4个页了,这个时候如果页面都是不可移动的,那么申请内存肯定会失败。

  1. memory compact 的几种方式:COMPACT_PRIO_SYNC_FULL : 以同步的方式压缩和迁移;COMPACT_PRIO_SYNC_LIGHT :压缩同步,迁移异步;COMPACT_PRIO_SYNC_ASYNC,以异步方式压缩和迁移。

  1. 什么时候会触发memory compaction? 1.没有申请到内存的时候。2.当内存阈值不够的时候,后台的 kcompaction守护线程 会被唤醒,会执行内存迁移的操作。 3.memory compaction开销是挺大的,对性能有一定的影响。

  1. Linux下可以这样查看,ls /proc/sys/vm | grep compact_memory

Per-CPU页帧缓存

  1. per-cpu页帧缓存也是对伙伴系统的一种完善和补充。

  1. pcp : per CPU pages

  1. 单个物理页的申请与释放

struct free_area free_area[MAX_ORDER]; 大部份物理页是放在伙伴系统的链表上的。

long lowmem_reserve[MAX_NR_ZONES]; 还有一些预留的页

struct per_cpu_pageset __percpu *pageset; 还有一些缓存页,目的就是为了降低锁的开销,提高性能。每一个CPU都有一个本地的缓存,只缓存单个物理页。

__percpu 关键字是内核提供的一种机制,降低锁的开销,提高性能。怎么实现的?申请内存并不是从伙伴系统上去拿,而是到 per_cpu_pages 结构体中 struct list_head lists 这个链表中去拿,如果拿不到,再才会到伙伴系统中去拿;释放流程:不会释放到伙伴系统中,而是释放到 per_cpu_pages 结构体中 struct list_head lists 这个链表中,这样就避免了多个CPU加锁,去锁的开销,也不用去全局到伙伴系统中去拿内存页了,性能就提高了。

伙伴系统提供的页分配/释放接口:alloc_pages、free_page

  1. 头文件 include/linux/gfp.h

参数掩码gfp_mask : 代表在那个区域去找内存?ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM 等?

参数order : 代表伙伴系统的阶数

接下来,来看一下 call-flow。

最关键就是这两个函数,导致是走 fastpath ,还是 slowpath

fastpath : 从伙伴系统的空闲链表中获取 page

slowpath : 对内存进行整理,迁移,压缩,交换,腾出大块连续的内存

连续内存分配器:CMA

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

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

相关文章

J DBC相关

JDBC基础什么是JDBC入门程序功能类工具类SQL注入攻击原理PreparedStatement的介绍数据库连接池原理自定义连接池归还连接JDBC框架自定义JDBC框架JDBC基础 什么是JDBC 用于执行SQL语句的java API,实现不同关系型数据库的连接 入门程序 导入jar包 注册驱动 获取连…

Linux驱动开发基础__gpio子系统重要概念

目录 1 引入 2 在设备树中指定引脚 3 在驱动代码中调用GPIO子系统 4 sysfs 中的访问方法 1 引入 要操作 GPIO 引脚,先把所用引脚配置为 GPIO 功能,这通过 Pinctrl 子系统来实现。 然后就可以根据设置引脚方向(输入还是输出)、读值──获得电平状…

Windows Docker Desktop开放API端口2375用于远程调用

Windows Docker Desktop开放API端口2375用于远程调用问题解决开启IP Helper服务开启Docker配置开放2375端口端口映射找到需要暴露的IP执行端口映射命令Windows防火墙关闭防火墙添加防火墙规则测试问题 Windows Docker Desktop为了安全,默认设置中只有localhost:237…

入门的葡萄酒知识

葡萄酒的分类(根据制造方法) 静态葡萄酒 红葡萄酒 Red Wine,白葡萄酒 White Wine,玫瑰红/桃红/粉红葡萄Rose Wine。 气泡(起泡)葡萄酒 有气泡的葡萄酒,分香槟Champagne及气泡葡萄酒两类。只有在…

Servlet(上)

Servlet组件(上) 学习目标 了解Web资源的概念了解为什么需要Servlet掌握Servlet是什么掌握Servlet的HelloWorld掌握Servlet的执行原理掌握Servlet的生命周期和生命周期方法掌握ServletConfig的使用掌握Servlet的体系结构掌握Servlet的映射路径的编写方式掌握创建Servlet最常用…

机器学习简单介绍

机器学习简介 定义 机器学习是人工智能(AI)和计算机科学的一个分支,专注于使用数据和算法来模仿人类的学习方式,逐步提高其准确性。 简单来说,是一种运用数学公式来对问题进行最优化求解的方法 分类 一般来说将:机器学习分为…

睿联技术在创业板过会:收入依赖摄像机单机,计划募资11亿元

2023年1月6日,深圳证券交易所披露的信息显示,深圳市睿联技术股份有限公司(下称“睿联技术”)获得创业板上市委员会审议通过。据贝多财经了解,睿联技术的上市申请于2022年6月2日获得创业板受理。 本次冲刺创业板上市&am…

Unity 3D 地形系统概述|| Unity 3D 创建地形

在三维游戏世界中,通常会将丰富多彩的游戏元素融合在一起,比如游戏中起伏的地形、郁郁葱葱的树木、蔚蓝的天空、、凶恶的猛兽等,营造出身临其境的游戏沉浸感,让玩家置身游戏世界,忘记现实。 地形作为游戏场景中必不可…

Git 基本概念

一、git 官网 https://git-scm.com/ 二、git 数据传输命令 三、基本操作 1、命令整理 命令说明git init初始化 git 库git config获取和设置存储库或全局配置项git status显示工作树状态git add将文件内容添加到index(暂存区)git commit将index(暂存区)修改提交到本地仓库gi…

你知道微服务架构中的“发件箱模式”吗

前言 微服务架构如今非常的流行,这个架构下可能经常会遇到“双写”的场景。双写是指您的应用程序需要在两个不同的系统中更改数据的情况,比如它需要将数据存储在数据库中并向消息队列发送事件。您需要保证这两个操作都会成功。如果两个操作之一失败&…

数据结构与算法—稀疏数组

稀疏数组 稀疏数组与二维数组 当一个数组中大部分元素都是0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 二维数组转成稀疏数组: 从图中可以看出: 稀疏数组的行、列、值的 (1)[0]行&#x…

linux下软硬链接到底是什么?

文章目录前言硬链接软链接前言 在了解软硬链接之前,可以先来了解一下磁盘以及inode到底是什么 Linux文件管理—磁盘上文件如何管理(inode) 硬链接 什么是硬链接 在Linux下,系统标识文件的唯一方式就是inode号,而对…

【初阶数据结构】——双“指针”求解数组常见问题

文章目录前言题目1:移除元素思路1:暴力求解思路2:时间换空间思路3:双指针原地删除(解法2的再优化)思路分析代码实现题目2:删除有序数组中的重复项思路:双指针代码实现题目3&#xff…

【JavaScript】BOM 学习总结

基础知识&#xff1a; 获取浏览器窗口的尺寸&#xff1a; innerHeight&#xff1a;获取高度 innerWidth&#xff1a;获取宽度 跳转与刷新 location.href location.reload() body><button id"btn">跳转到下一个页面</button><button id"btn…

Java实现文件操作

目录 一、文件概述 二、常见文件操作 1、获取文件路径 2、判断文件存在以及判断类型 3、文件的创建与删除 4、展示文件夹的文件 5、创建文件夹 三、用数据流来读取文件内容 1、操作字节流文件 a、读取字节流文件 b、写字节流文件 2、操作字符流对象 a、读取…

C++ · 入门 · 03 | 函数重载

啊我摔倒了..有没有人扶我起来学习.... 目录前言函数重载1.1 函数重载概念1.2 函数重载的意义1.3 C支持函数重载的原理--名字修饰(name Mangling)1.4 返回值不同能否构成函数重载?前言 自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真…

小米 2021 秋招面试总结

岗位:嵌入式软件工程师(相机驱动岗) 面试时间: 40 分钟 薪资: 28w+ 面试过程 面试官上来先来了一段他自己的自我介绍,流程还是比较规范的。 1、请进行一个简单的自我介绍(2分钟) 2、C语言全局变量可否定义在头文件中? 回答:不能,并且这不是一个好的习惯。 3…

【自学C++】C++输出cout

C输出cout C输出cout教程 在 C 语言 中我们需要输出一个 变量&#xff0c;可以使用 printf。printf 函数 在输出时&#xff0c;我们必须要指定输出的数据类型对应的格式化符&#xff0c;挺不方便。 在 C 中&#xff0c;我们要输出变量&#xff0c;直接使用 std 命名空间中的…

国科大抢课避坑+选课指南+教务系统操作

博客园&#xff1a; https://www.cnblogs.com/phoenixash/p/13669461.html 9月12日12&#xff1a;30&#xff0c;本菜鸡终于经历了国科大传说中的抢课大战&#xff0c;虽然自己之前准备的较多&#xff0c;但还是在抢课的时候掉进了不少坑里&#xff0c;趁现在还记忆犹新&#x…

【pandas】教程:10-文本数据的操作

Pandas 文本数据的操作 本节使用的数据为 data/titanic.csv&#xff0c;链接为 pandas案例和教程所使用的数据-机器学习文档类资源-CSDN文库 读入数据 import pandas as pd titanic pd.read_csv("data/titanic.csv")PassengerId Survived Pclass \ 0 …