<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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

Redis中Hash从使用过程到原理说明

《Redis中Hash从使用过程到原理说明》RedisHash结构用于存储字段-值对,适合对象数据,支持HSET、HGET等命令,采用ziplist或hashtable编码,通过渐进式rehash优化... 目录一、开篇:Hash就像超市的货架二、Hash的基本使用1. 常用命令示例2. Java操作示例三

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他