<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 结构体(页描述符)来记录它的划分情况,它放在页面首部。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++数据结构:B树

目录 一. 常见的搜索结构 二. B树的概念 三. B树节点的插入和遍历 3.1 插入B树节点 3.2 B树遍历 四. B树和B*树 4.1 B树 4.2 B*树 五. B树索引原理 5.1 索引概述 5.2 MyISAM 5.3 InnoDB 六. 总结 一. 常见的搜索结构 表示1为在实际软件开发项目中,常用…

分享几个电视颜色测试图形卡

介绍 本文分享几个常见的电视颜色测试图形卡和一段matlab程序,完成JPG转FPGA烧写文件,便于把彩色图片预装载到FPGA内。 电视颜色测试图形卡 一种专业检测电视显示效果的工具。它通常由一张卡片和一些色块组成,可以根据标准色彩空间和颜色渐…

JVM类加载全过程

Java虚拟机类加载的全过程,即加载,验证,准备,解析,初始化 一、加载 加载 是 类加载过程中的一个阶段, 有以下三部分组成 1)通过一个类的全限定名来获取定义此类的二进制流 2)将这…

2023-2024-1-高级语言程序设计-第2次月考函数题

6-1-1 调用函数求分段函数 编写函数fun计算下列分段函数的值&#xff1a; 。 函数接口定义&#xff1a; float fun(float x); 其中 x 是用户传入的参数。 函数须返回分段函数的计算结果。 裁判测试程序样例&#xff1a; #include <stdio.h> #include <math.h> …

【C语言】预处理详解

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家再次优化上一篇的通讯录&#xff0c;实现将录入的数据在程序退出后存储到文件中&#xff0c;在下一次程序开始时打开文件获取数据&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&…

netcore swagger 错误 Failed to load API definition

后端接口报错如下&#xff1a; 前端nswag报错如下&#xff1a; 根据网上查询到的资料说明&#xff0c;说一般swagger这种错误都是控制器里有接口代码异常造成的&#xff0c;通常是接口没有加属性Attribute&#xff0c; 比如[HttpPost("Delete")]、[HttpGet("Del…

【开源】基于Vue+SpringBoot的康复中心管理系统

项目编号&#xff1a; S 056 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S056&#xff0c;文末获取源码。} 项目编号&#xff1a;S056&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员…

【Unity动画】Unity 动画播放的流程

本文以2D为案例&#xff0c;讲解Unity 播放动画的流程 准备和导入2D动画资源 外部导入序列帧生成的 Unity内部制作的 外部导入的3D动画 2.创建动画过程 打开时间轴Ctrl6 选中场景中的一个未来需要播放动画的物体 回到时间轴点击Create一个新动画片段 拖动2D动画资源放入…

根据已有安装的cuda配置合适的pytorch环境

目前网络上根据电脑配置安装合适的深度学习环境的帖子已经很多了&#xff0c;但是现实中会出现很久之前已经安装了对应的cuda&#xff0c;但是现在忘记了当时安装的是什么版本。本文针对这一问题展开攻略。 1 cuda安装版本查询 我们在查询自己应该安装什么版本的cuda时&#…

vue:ESLint如何自动修复代码

在vue开发过程中第一步总会遇到一个问题&#xff0c;就是 代码本身没有问题&#xff0c;但是因为这是一个ESLint的错误提示&#xff0c;但是它指出了在文件E:\vscode\vuesua\src\views\HomeView.vue中的第18到33行存在缩进错误。具体来说&#xff0c;第18到25行的缩进应该是2个…

IntelliJ IDEA的下载安装配置步骤详解

引言 IntelliJ IDEA 是一款功能强大的集成开发环境&#xff0c;它具有许多优势&#xff0c;适用于各种开发过程。本文将介绍 IDEA 的主要优势&#xff0c;并提供详细的安装配置步骤。 介绍 IntelliJ IDEA&#xff08;以下简称 IDEA&#xff09;之所以被广泛使用&#xff0c;…

开源堡垒机Jumpserver

文章目录 开源堡垒机JumpserverJumpserver介绍安装环境部署安装jumpserver访问jumpserver的web界面 开源堡垒机Jumpserver Jumpserver介绍 Jumpserver 是全球首款完全开源的堡垒机&#xff0c;使用 GNU GPL v2.0 开源协议&#xff0c;是符合 4A 的运维安全审计系统。 Jumpse…

人工智能|网络爬虫——用Python爬取电影数据并可视化分析

一、获取数据 1.技术工具 IDE编辑器&#xff1a;vscode 发送请求&#xff1a;requests 解析工具&#xff1a;xpath def Get_Detail(Details_Url):Detail_Url Base_Url Details_UrlOne_Detail requests.get(urlDetail_Url, headersHeaders)One_Detail_Html One_Detail.cont…

大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现

大数据项目——基于Django协同过滤算法的房源可视化分析推荐系统的设计与实现 技术栈&#xff1a;大数据爬虫/机器学习学习算法/数据分析与挖掘/大数据可视化/Django框架/Mysql数据库 本项目基于 Django框架开发的房屋可视化分析推荐系统。这个系统结合了大数据爬虫、机器学习…

图像万物分割——Segment Anything算法解析与模型推理

一、概述 在视觉任务中&#xff0c;图像分割任务是一个很广泛的领域&#xff0c;应用于交互式分割&#xff0c;边缘检测&#xff0c;超像素化&#xff0c;感兴趣目标生成&#xff0c;前景分割&#xff0c;语义分割&#xff0c;实例分割&#xff0c;泛视分割等。 交互式分割&am…

WPF halcon 机器视觉

1 鼹鼠的故事第14集 鼹鼠与智能房 鼹鼠无意中坐进了一辆小汽车&#xff0c;小汽车开进了一所智能住宅。鼹鼠看到房主在智能房里&#xff0c;享受着现代化的服务。趁着主人看电视的时候&#xff0c;鼹鼠也享用了一顿丰盛的智能晚餐。 小编大胆的畅想&#xff0c;这些食物 前一秒…

【安卓】安卓xTS之Media模块 学习笔记(1) xTS介绍

0. 声明 因为安卓的迭代比较快&#xff0c;大框架更新也是常有的事&#xff0c; 在此单独声明&#xff0c;本系列内容适用于 安卓13/安卓14&#xff08;2023.12 左右&#xff09;。 更早的版本和往后的版本不做保证。 1.背景 Media的安卓xTS相关测试和功能修复已经进行了一段…

C语言小游戏:三子棋

目录 &#x1f30d;前言 &#x1f685;目录设计 &#x1f48e;游戏逻辑设置 ⚔三子棋棋盘设计 ⚔三子棋运行逻辑 &#x1f440;怎么设置人下棋 &#x1f440;怎么设置电脑下棋 ✈如何判断输赢 ✍结语 &#x1f30d;前言 Hello,csdn的各位小伙伴你们好啊!这次小赵给大…

问题:HTTP method names must be tokens

问题&#xff1a;HTTP method names must be tokens 2023-12-04T09:43:16.65408:00 INFO 7808 --- [nio-6600-exec-1] o.apache.coyote.http11.Http11Processor : Error parsing HTTP request headerNote: further occurrences of HTTP request parsing errors will be logg…

freeRTOS创建任务

一.动态创建任务 1.函数xTaskCreate() BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, // 函数指针, 任务函数const char * const pcName, // 任务的名字const configSTACK_DEPTH_TYPE usStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters, // …
最新文章