<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

相关文章

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

使用docker搭建嵌入式Linux开发环境

《使用docker搭建嵌入式Linux开发环境》本文主要介绍了使用docker搭建嵌入式Linux开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录1、前言2、安装docker3、编写容器管理脚本4、创建容器1、前言在日常开发全志、rk等不同

ShardingProxy读写分离之原理、配置与实践过程

《ShardingProxy读写分离之原理、配置与实践过程》ShardingProxy是ApacheShardingSphere的数据库中间件,通过三层架构实现读写分离,解决高并发场景下数据库性能瓶... 目录一、ShardingProxy技术定位与读写分离核心价值1.1 技术定位1.2 读写分离核心价值二

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

从原理到实战解析Java Stream 的并行流性能优化

《从原理到实战解析JavaStream的并行流性能优化》本文给大家介绍JavaStream的并行流性能优化:从原理到实战的全攻略,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的... 目录一、并行流的核心原理与适用场景二、性能优化的核心策略1. 合理设置并行度:打破默认阈值2. 避免装箱

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet