<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.mzph.cn/news/197782.shtml

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

相关文章

canvas绘制小丑

说明&#xff1a; 借鉴博主基于canvas绘制一个爱心(10行代码就够了) - 掘金 (juejin.cn) 代码实现 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

实现简单的Http服务器+SpringMvc,集成到Spring

实现简单的Http服务器SpringMvc&#xff0c;集成到Spring 1、Http协议 1.1、HTTP 协议请求格式 方法 空格 URL 空格 版本 回车符 换行符头部域名称&#xff1a;头部域值 回车符 换行符...头部域名称&#xff1a;头部域值 回车符 …

《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-03-嵌入式

文章目录 1. 基本概念2. 嵌入式系统的组成3. 嵌入式系统的特点4. 嵌入式系统分类4.1 分类4.2 实时系统(Real-Time System,RTS)4.3 安全攸关系统 (Safety-Critical System)7. 嵌入式软件7.1. 嵌入式系统软件组成架构7.1.1 硬件层7.1.2 抽象层7.1.3 操作系统层7.1.4 中间件层7.1…

【云备份】服务端热点管理业务处理模块

28. 服务端热点管理模块实现-热点管理实现思路 服务器端的热点文件管理是对上传的非热点文件进行压缩存储&#xff0c;节省磁盘空间。 而热点文件的判断在于上传的文件的最后一次访问时间是否在热点判断时间之内&#xff0c;比如如果一个文件一天都没有被访问过我们就认为这是…

【UGUI】sprite精灵的创建与编辑

如何切图&#xff08;sprite editor&#xff09; 有时候一张图可能包含了很多张子图&#xff0c;就需要在Unity 临时处理一下&#xff0c;切开&#xff0c;比如动画序列帧图集 虽然我们可以在PS里面逐个切成一样的尺寸导出多张&#xff0c;再放回Unity&#xff0c;但是不需要这…

音视频技术开发周刊 | 322

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 超级AI不会主宰人类&#xff0c;但人工智能必须开源&#xff01;LeCun最新采访引全网300万人围观 LeCun最新访谈视频中&#xff0c;再次坦露了自己对开源AI的看法。超级AI…

安路Anlogic FPGA下载器的驱动安装教程

安路FPGA下载器驱动安装教程 安路FPGA下载器&#xff1a;EN-ALC10,是一款高性能FPGA下载线&#xff08;编程器&#xff09;&#xff0c;支持安路的开发软件TDS和全系列FPGA芯片下载编程&#xff0c;支持全速USB2.0与电脑进行数据通信&#xff0c;通过JTAG协议与FPGA进行程序下…

鸿蒙开发:UIAbility组件间交互探索实战【鸿蒙专栏-22】

UIAbility组件间交互(设备内) 在设备内,UIAbility(用户界面能力)是系统调度的最小单元,它们负责展示用户界面和执行相关的业务逻辑。设备内的不同功能模块之间的交互是应用程序开发中的重要部分。本文将探讨设备内UIAbility之间的交互方式,包括启动应用内的UIAbility、…

LeetCode330. Patching Array

文章目录 一、题目二、题解 一、题目 Given a sorted integer array nums and an integer n, add/patch elements to the array such that any number in the range [1, n] inclusive can be formed by the sum of some elements in the array. Return the minimum number of…

Redux

一、纯函数 1、react 中的纯函数 react 中组件就被要求像是一个纯函数&#xff08;因为还有类组件&#xff09;redux 中有一个reducer 的概念&#xff0c;也是要求必须是一个纯函数 2、 纯函数的条件 确定的输入一定会产生确定的输出函数在执行过程中&#xff0c;不能产生副…

vue自定义指令:指定文字高亮

vue自定义指令&#xff1a;指定文字高亮 自定义指令 除了核心功能默认内置的指令 (v-model 和 v-show)&#xff0c;Vue 也允许注册自定义指令。注意&#xff0c;在 Vue2.0 中&#xff0c;代码复用和抽象的主要形式是组件。然而&#xff0c;有的情况下&#xff0c;你仍然需要对…

【重点】【区间问题】56.合并区间

题目 注意有个类似的题目&#xff1a;&#xff0c;注意区分。 class Solution {public int[][] merge(int[][] intervals) {List<List<Integer>> res new ArrayList<>();Arrays.sort(intervals, (a1, a2) -> {return a1[0] - a2[0];});int left Intege…

JS实现成才网注册系统(网页数据验证)

主代码 <!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><meta http-equiv"Conten…

Hadoop进阶学习---HDFS分布式文件存储系统

1.hdfs分布式文件存储的特点 分布式存储:一次写入,多次读取 HDFS文件系统可存储超大文件,时效性较差. HDFS基友硬件故障检测和自动快速恢复功能. HDFS为数据存储提供很强的扩展能力. HDFS存储一般为一次写入,多次读取,只支持追加写入,不支持随机修改. HDFS可以在普通廉价的机器…

Linux: 文档 :相关接口文档手册还是需要仔细阅读

接口文档的阅读&#xff0c;一定要仔细。最近遇到一个问题&#xff0c;明明文档里有说&#xff0c;read函数读取到的是一个或者多个events&#xff0c;但是代码里依然按照一个来处理。就会导致漏event的可能。漏了event&#xff0c;后续的逻辑就会受影响。 Each successful rea…

llama.cpp部署(windows)

一、下载源码和模型 下载源码和模型 # 下载源码 git clone https://github.com/ggerganov/llama.cpp.git# 下载llama-7b模型 git clone https://www.modelscope.cn/skyline2006/llama-7b.git查看cmake版本&#xff1a; D:\pyworkspace\llama_cpp\llama.cpp\build>cmake --…

Leetcode1038. 从二叉搜索树到更大和树(每日一题)

目录 ⚽题目&#xff1a; &#x1f3d0;题目分析&#xff1a; &#x1f3c0;题目解答&#xff1a; &#x1f94e;代码如下&#xff1a; ⚽题目&#xff1a; 给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值…

Stream 流

配合Lambda表达式&#xff0c;简化集合和数组的操作 获取Stream流对象 集合 Collection接口中的方法&#xff1a;stream() 单列&#xff1a;直接调用stream() 多列&#xff1a;间接获取&#xff0c;map.entrySet() ArrayList<String> list new ArrayList<>();…

SSM项目实战-前端-在Index.vue中展示第一页数据

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/schedule.js import request from "../util/request.js";export let getSchedu…

4-Docker命令之docker run

1.docker run介绍 docker run命令是用来创建新的容器并运行相关命令 2.docker run用法 docker run [参数] [root@centos79 ~]# docker run --helpUsage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]Create and run a new container from an imageAliases:docker conta…