<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(5)》(21)

本文主要是介绍<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(5)》(21),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Linux操作系统原理分析之linux存储管理(5)》(21)

  • 6 Linux存储管理
    • 6.6 Linux 物理空间管理
      • 6.6.1 Linux 物理内存空间
      • 6.6.2 物理页面的管理
      • 6.6.3 空闲页面管理——buddy 算法
    • 6.7 内存的分配与释放
      • 6.7.1 物理内存分配的数据结构

6 Linux存储管理

6.6 Linux 物理空间管理

本节介绍 linux 对进程虚拟空间的管理方法和内核提供的对进程虚拟空间进行管理的数据结构及有关函数。

6.6.1 Linux 物理内存空间

Linux 物理内存空间分成两个区域:
👉内核区:存放内核代码和数据,以及内核管理进程的数据结构等。低地址区
👉动态 RAM 区:存放各个用户进程的代码、数据等。高地址区。
需要注意: 内核区映射到进程线性地址空间时时在高地址区域,故内核在进程虚拟内存和物理内存所占据的位置不同。

6.6.2 物理页面的管理

Linux 以页面为单位来分配内存。
Linux 对每个物理页面都使用一个页面描述符( page 结构体)描述其物理特性。其定义包含在/include/linux/mm.h 中,并进一步被定义为 mem_map_t 类型。

typedef struct page 
{
struct page *next; /*双向链表的下一个*/
struct page *prev; /*双向链表的前一个*/
struct page *next_hash; /*指向 hash 表后一个*/
struct page *prev_hash; /*指向 hash 表前一个*/
unsigned dirty:16,age:8; /*age 记载被访问的情况;dirty:是否被修改*/
atomic_t count; /*共享进程数目*/
unsigned long flags; /*页面状态*/
/*当页面内容是文件的一部分*/
struct inode *inode; /*指向文件的 inode */
unsigned long offset; /*指出在文件中的偏移量 */
/*系统把所有 page 结构体集中组成一个 mem_map 数组*/
unsigned long map_nr; /*在 mem_map 数组中的下标*/
unsigned long swap_unlock_entry;
struct wait_queue *wait;
struct buffer_head * buffers;
} mem_map_t;

6.6.3 空闲页面管理——buddy 算法

为了提高访问页面的速度,以及满足使用连续面的要求(如较大的线性数组要求连续的页面)。操作系统在分配内存时要尽量保留连续的页面,所以实施分配时不能以单一页面分配,而是以多个页面为单位分配。根据这个思想,linux 对内存空间的管理和分配采用了 Buddy 算法。Buddy 是“伙伴”、“搭档”的意思。
Buddy 算法的基本思想:以多个页面为单位管理和分配空闲区域。

  1. 空闲页块组
    👉它把物理内存中的所有页面按照 2 的整数次幂(2n)进行划分,linux2.0 中年(0~5)对物理内存进行 6 次划分(1,2,4,8,16,32)。这样划分后形成大小不同的存储块,称为页面块(页块)。
    👉包含一个页面的块称为 1 页块,包含两个页面的块称为 2 页块,依次类推。将每种页块按照它们的先后顺序两两结合成一对对的 buddy“伙伴”,如:

1 页块中:0 和 1、2 和 3、4 和 5、…….;就是一对对的 1 页块 buddy“伙伴”
2 页块中:0~ 1 和 2~ 3、4~ 5 和 6~ 7、8~ 9 和 10~11、……. 就是一对对的 2 页块 buddy“伙伴”

👉对空闲区域的管理按照页块大小分组进行管理。
系统设置了一个静态数组 free_area[]来管理各个空闲页块组。在/mm/page_alloc.c 中。

#define NR_MEM_LISTS 6
Static struct free_area_struct free_area[NR_MEM_LISTS];
Struct free_area_struct
{
Struct page *next; /*空闲链表下一个节点*/
Struct page *prev; /*空闲链表前一个节点*/
Unsigned int *map; /*指向相应页块的位图,其位于内存 bitmap 区*/
}

该数组共 6 个元素,指向 1、2、4、8、16、32 六种页面块。

  1. 两种管理方法:位图法和空闲页块组链表 。
    1)位图法
    Linux 对内存页面块的每种划分都对应一个位图 map,图 6.19 给出了 1、2、4 页块位图示意图。在位图中每一位表示一对 buddy 页块的使用情况,方法:
    如:1 对都空闲,则该位为 0;
    1 对都占用(全部或部分),则该位为 0;
    1 对中,1 组空闲而另一组被占用(全部或部分),则该位为 1;
    2)空闲页块组链表
    系统按照 buddy 关系把具有相同大小的空闲页面块组成空闲页面块,每个空闲页块组用一个双向循环链表进行管理。见图

  2. 分配和释放管理

  3. 用事例说明
    在这里插入图片描述

在这里插入图片描述

6.7 内存的分配与释放

Linux 中设置了多个用于虚拟内存和物理内存分配和释放的函数,本节主要介绍其中两对:面向物理内存分配和释放的函数 kmalloc()和 kfree();面向虚拟内存的分配和释放的函数 vmalloc()和vfree();

6.7.1 物理内存分配的数据结构

Linux 中 kmalloc()和 kfree()用于分配和释放小于 128K 的连续物理内存空间。使用它可以分配到[32B,128KB]的连续的内存空间。它在 Baddy 算法的基础上又设置了专门的数据结构来管理内存。
在使用 kmalloc()和 kfree()分配和释放内存是以块为单位进行的。可以分配的块单位记录在blocksize 表中,它是一个静态数组,定义在/mm/kmalloc.c 中:

#if PAGE_SIZE ==4096
Static const unsigned int blocksize[]={
32,64,128,252,508,1020,……..,131072-16,0
}

对页面大小为 4K 的机器,块单位共 13 种,它们近似于 2 的次幂。
可以块的大小与页面大小不一致,可能小于或等于大于页面。
如小于一个页面时,需要将一个页面再次按照第一次使用该页面的块单位来划分页面。所以每个页面又需要一个 page_descriptor 结构体(页描述符)来记录它的划分情况,它放在页面首部。

这篇关于<Linux>(极简关键、省时省力)《Linux操作系统原理分析之linux存储管理(5)》(21)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/457755

相关文章

Spring Boot 实现 IP 限流的原理、实践与利弊解析

《SpringBoot实现IP限流的原理、实践与利弊解析》在SpringBoot中实现IP限流是一种简单而有效的方式来保障系统的稳定性和可用性,本文给大家介绍SpringBoot实现IP限... 目录一、引言二、IP 限流原理2.1 令牌桶算法2.2 漏桶算法三、使用场景3.1 防止恶意攻击3.2 控制资源

基于Linux的ffmpeg python的关键帧抽取

《基于Linux的ffmpegpython的关键帧抽取》本文主要介绍了基于Linux的ffmpegpython的关键帧抽取,实现以按帧或时间间隔抽取关键帧,文中通过示例代码介绍的非常详细,对大家的学... 目录1.FFmpeg的环境配置1) 创建一个虚拟环境envjavascript2) ffmpeg-py

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断