Linux内核内存管理 您所在的位置:网站首页 linux内核管理 Linux内核内存管理

Linux内核内存管理

2022-03-26 03:43| 来源: 网络整理| 查看: 265

 

 

Linux

内核内存管理

 

 

 

 

linux

内存管理之伙伴系统分析

(

大内存分配

在内核模块的编写中

,

我们用

alloc_page()/alloc_pages()

来分配大内存

(

超过一个页面

,

4K).

free_page()/free_pages()

来释放

用前者分得的内存

.

今天我们就来分析一下

,

linux

内核中大内存分配的实现

跟以往一样

.

本文的代码分析是基于

linux 2.6.9

 

本文档包括:

 

一:准备知识

 

二:有关的数据结构

 

三:

alloc_pages()/alloc_page 

实现分析

 

四:

free_pages()

的相关实现

 

五:总结

 

:

准备知识

一个操作系统的内存管理方式很大程度上决定了它的效率

,

时间与空间的对立统一在内存管理上体现得最为明显

,

首先

,

分配

/

释放

内存是一个发生频率很高的操作

,

所以它要求有一定的实时性

,

另外

,

内存又是一种非常宝贵的资源

.

所以要尽量减少内存碎片的产

     

Linux

采用了伙伴系统算法来管理内存

,

即把内页按

2^0,2^1,2^2…2^10

大小进行分组

.

每次分配内存时

,

从相应大小的池中分

配内存

,

然后再把余下的内存分配给它的下一级缓存池

如下图所示

 

       

 

 

 

 

 

 

 

 

关于分配位图

         

linux

,

每一

个大小的缓存池都对应一个位图

,

然后

,

位图中的每一位对应一对空闲区的空闲标志

.

每分配一个分配区

,

都对相应的位图取反

.

例如

:

位图管理

A,B

两个分配块

.

初始化的时候

,

该位图置为

0.

此时

,

若把

A

分配出去

,

更新位图为

1.

若再把

B

分配出去

,

再取反

,

变为了

0.

仔细思考

,

不难发现有以下规律

若位图为

0:

表示两个分配块都空或者都已经分配出去

若位图为

1:

表示其中有一个已经分配出去

,

有一个空闲

 

特别的

,

关于分配位图

,

有几点值得注意的地方

1:

位图的大小只跟总内存有关

,

跟当前缓存池的空闲内存无关

例如

:

总内存为

style="font-size: 9pt;" lang="EN-US"4M

的系统

.

总共有

style="font-size: 9pt;" lang="EN-US"4M/4K = 1024

个页

 

那对应的

2^0

位图有

style="font-size: 9pt;" lang="EN-US"1024/1/2 512

 

2^1

位图有

style="font-size: 9pt;" lang="EN-US"1024/2/2= 256

 

…… 

2^10

位图有

1024/2^10/2 1

 

(

除以

2

是因为

1

位表示二个页面

2:

为什么一位要管理一对内存呢

?

其实这是为了更好的管理伙伴系统而设计的

,

当然

,

也有减少位图大小的因素

 

如下图所示

 

 

 

 

位图

1

表示

A,B

的分配情况

,

位图

2

表示

C,D

的分配情

.

.A.D

已经分配

出去了

,B,C

处于空闲状态

 

上图中

,

虽然

B,C

处理连续的页

,

且都空闲

,

但不可以把

B,C

合位为一块大内存

face="Times New Roman"  

:

有关的数据结构

我们以

NUMA

配置来分析伙伴系统算法中所涉及的数据结构



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有