`
java-mans
  • 浏览: 11344122 次
文章分类
社区版块
存档分类
最新评论

关于Linux物理内存管理的理解

 
阅读更多

唉,我真笨,终于明白了Linux物理内存管理的模式。
总是想,物理内存还得内存管,一旦要分配新数据结构,就成了鸡蛋问题。
心得如下:

首先,假设我们有4G+的物理内存。

Linux下物理内存用page结构管理。理解后抽象出的简化page结构如下:

structpage page {
structpage
*next;/*下一个“页内存区”*/
longused;/*是否被使用*/
};
/* sizeof(page)=8bytes*/

--------------------
在系统初始化的时候,在内核空间中空出(4G/4K)*8bytes=8M的空间出来,如,1M~9M的区域,将这个区域全部置零。实质上这等价于着我们在内存中分配了2^20个page结构。

我们不能用类似于:

page_ptr = (page*)malloc(sizeof(page)*1M);

来分配,为什么?---“鸡蛋问题”,malloc函数背后用来做记录的数据的空间哪里来?谁管理?

--------------------
如果使用Buddy Allocator来管理物理页,我们可以采取的管理方式如下:
用一个

struct page * FreeList[32]; /* 可以管理的最大空闲区域为4G */

来记录所有内存空洞(1page, 2pages, 4pages, 8pages, etc)
假设我们真的有4G的物理内存,那么FreeList[31] = &page[0]; 这意味着page[0]之后的2^32 bytes空间是空闲的。
FreeList[0:30] = NULL;

在假设我们做了如下两个操作:
get_pages(1); /* 分配1页 */
get_pages(5); /* 分配5页 */

看看我们的allocator怎么处理,从这个处理过程中也就可以看出物理页的管理方式了。Go!
首先请求分配1页,FreeList[0] = NULL; 表示正好没有合适的1页,那么allocator就会沿着FreeList往上找,最后找到了FreeList[31],这么有米!就拿它开刀了!--- 我们要从2^32字节中切出2^12字节来~~
2^32 = 2^31 + 2^ 30 + 2^ 29 + …… + 2^13 + 2^12 + 2^12
切出 2^12 字节后,FreeList[31]再也没有资格指向page[0]后的4G内存了,它完了!被一个小小的4K页面给干掉了!
此时,FreeList[31] <- NULL,表示没有连续的2^32 字节的内存区域了。但是,FreeList[31]的灭亡,却带来了无数小集团的诞生:
2^31,2^ 30, 2^ 29, …… ,2^13 ,2^12等, 我们可以采取这样的方式来排列这些小集团

|/////| 1page | 2pages | … | 512K pages |

//////表示被分配出去的2^12字节。然后,分别让FreeList[0] = &page[1], FreeList[1] = &page[2], FreeList[3]=&page[4],…… page[i]中的i需要计算一下,按照从大到小的块来切,不难算出。

下面执行get_pages(5),5页内存需要到指示8页内存的的FreeList[3]中找,将那8页中的高5页切出来分配给用户,剩余的3页可以分为1页+2页,1页可以链入FreeList[0]中,2页可以链入FreeList[1]中。最初我对这个很迷惑:这么一链,岂不是又要分配新的指针之类的结构么?其实不用!不妨在去看看page结构的定义~:) 明白了吧?其中的next项就是应付这个的.大体的操作方式如下:

/*将page[5]之后的两页链入FreeList[1]的链表头*/
page[
5].next=FreeList[1];
FreeList[
1]=&page[5];/*5,6两页*/

/*将page[4]这一页页链入FreeList[0]的链表头*/
page[
4].next=FreeList[0];
FreeList[
0]=&page[4];/*第4页*/

有了这样一种方式,就算最后的内存零散为了一页一页的(第奇数页空闲,第偶数页已被分配)也不怕了:所有零散页都被链入到FreeList[0]所指示的链表中了 *_*

分享到:
评论

相关推荐

    基于ARM CPU的Linux物理内存管理

    这样方便理解为什么内存管理中需要虚拟地址,物理内存和访问保护。 第二部分介绍在ARMC CPU上是如何支持内存管理的。操作系统对内存的管理的目的就是满足应用程序(当然也有部分内核代码)的内存申请和释放,而内存...

    了解Linux虚拟内存管理器Understanding the Linux Virtual Memory Manager

    详细描述Linux虚拟内存,提供理论基础和逐行源代码注释。 它系统地涵盖了从物理内存描述到内存不足管理的所有内容。

    内存管理内存管理内存管理

    计算机上的每一个进程都认为自己可以访问所有的物理内存。显然,由于同时在运行多个程序,所以每个进程不可能拥有全部内存。实际上,这些进程使用的是虚拟内存。 只是作为一个例子,让我们假定您的程序正在访问地址...

    操作系统课程设计实验报告:内存管理

    1、物理内存管理:理解位示图;理解物理内存的管理机制; 2、分页机制:深入理解内存“分页机制”;认识页目录、页表及地址变换; 3、地址映射与 do_fork():深入理解内存页表结构的构建;深刻理解地址变换过程;...

    操作系统(内存管理)

    文将对 Linux™ 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言。文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半...

    linux内存页表创建

    对linux内存页表创建的详细讲解,和本博客前面文章紧密联系,讲解了物理内存、硬件IO、中断是如何映射的,什么是内存,内存映射是怎么一回事,另有例子演示,适合正确理解概念的文章

    linux x86内存管理之分段与分页

    主要分析了linux启动过程中,对分段与分页的理解,以及虚拟地址到物理地址的转换。

    VMMap 可以用来分析应用程序使用虚拟和物理内存的情况

    VMMap是一个免费的工具,可以用来分析应用程序使用虚拟和物理内存的情况。 VMMap对程序员是非常有用的。如果您在寻找免费的工具来理解和优化您的应用程序的内存使用量 ,那么你可以尝试VMMap。 除了内存使用图形来...

    Linux内存管理之分段机制

    而物理地址是实际在地址总线上传输的地址,也是物理内存访问的真正地址。  如上图,Linux在内存管理上,把逻辑地址通过分段机制变化成线性地址,线性地址也是4G(32位系统)的程序地址。线性地址再通过分页机制...

    Linux应用技术:Linux系统命令.pptx

    项目3 Linux磁盘文件管理 第三讲 主要内容 Linux操作命令 Linux目录管理 Linux文件管理 拓展:管道和重定向 Linux文件系统 ...功能:查看当前系统内存的使用情况,包括系统中剩余和已用的物理内存和交换内存,

    如何理解Linux中进程,线程等概念

    线程是进程的一条执行路径,它包含独立的堆栈和...线程和进程的关系是:线程是属于进程 的,线程运行在进程空间内,同一进程所产生的线程共享同一物理内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。

    Linux底层通信的分析及改进设计

    本文通过对最新内核的Linux底层通信方式的分析,使用现有的网卡物理地址通信技术和内存共享技术,分析并改进Linux现有的低层通信方式,在X公司实际电信板间通信环境中,测试时间延迟,吞吐量和丢包率这些通信效率测试标准...

    jvm内存详解

    jvm内存详解,理解 JVM 如何使用 Windows 和 Linux 上的本机内存

    Linux内核工作原理 word版本 强烈推荐

    内存管理这章描叙了Linux如何处理物理内存以及虚拟存储技术。 进程管理描叙了进程的概念以及Linux核心是如何创建、管理与删除系统中的进程。 进程间及进程与核心间通讯以协调它们的活动。Linux支持大量进程间通讯...

    linux-mm-notes:linux mm 子系统简明笔记

    这是一组关于linux内存管理子系统的笔记。 它们假定采用 x86-64 架构,所有对内核代码的特定架构引用都将引用 x64-64 特定数据结构和代码。 实际代码的链接将取自 5.10 左右的当前提示(通过 github 永久链接)。 ...

    编写程序实现虚拟存储管理中OPT,FIFO,LRU页面置换算法

    1、任意给出一组页面访问顺序(如页面...5、通过给出特殊的页面访问顺序,分配不同的物理块,利用FIFO算法计算其缺页率,进一步理解Belady现象。 6、(附加)实现CLOCK置换算法,修改位可在确定页面号时直接任意给出。

    课程设计---操作系统课程设计之Linux磁盘空间管理.doc

    学习使用位示图管理磁盘空间的分配与回收,了解程序运行前和回收磁盘的 物理地址过程。学会用模拟UNIX系统的成组链接法实现磁盘空间的管理。了解UNIX的命 令及使用格式,熟悉UNIX/LINUX的常用基本命令,练习并掌握...

    Linux0.11内核初始化讲解与调试

    结合bochs仿真调试工具边讲解边调试linux0.11版本内核初始化过程,通过该课程可以学习和理解关于linux内核在内存中的分布、分段及分页机制、逻辑地址线性地址及物理地址的区别,更系统的理解CPU实模式及保护模式等。...

    Linux内核反向映射机制的详细资料说明

    Cheetah,曾为U-boot社区和Linux内核社区提交过若干补丁,主要从事Linux相关系统软件开发工作,负责Soc芯片BringUp及系统软件开发,喜欢阅读内核源代码,在不断的学习和工作中深入理解内存管理,进程调度,文件系统...

    入门学习Linux常用必会60个命令实例详解doc/txt

    要想真正理解Linux系统,就必须从Linux命令学起,通过基础的命令学习可以进一步理解Linux系统。 不同Linux发行版的命令数量不一样,但Linux发行版本最少的命令也有200多个。这里笔者把比较重要和使用频率最多的命令...

Global site tag (gtag.js) - Google Analytics