Linux内存管理笔记

第一部分 为什么要进行内存管理

Linux操作系统支持多进程,每个进程都需要占用一定内存,而内存是有限的,所以需要内存管理,把有限的内存及时有效的分配给多个进程。

第二部分 内存管理的方法

一、内存管理方法汇总
内存管理的方法很多,经过了很多次的演变。有单一连续分区、固定分区、动态分区、页式存储管理、段式存储管理、段页式存储管理。这些方法的差异可参考《内存管理:分页,分段,段页结合》。每种方法的简单介绍可参考《面试题总结之windows/linux内存管理》《操作系统知识回顾(5)-内存管理

二、Linux内存管理
0、核心思想
Linux采用虚拟内存管理技术,每个进程拥有独立的虚拟内存地址空间,并且这些地址是连续的,方便进程访问虚拟内存。虚拟内存被分为大小相等的多个块,称为页(Page), 每个页都是一段连续的地址。

物理内存地址也被分为大小相等的块,称为页框(一般跟Page大小相等), 物理内存和虚拟内存通过内存映射来关联,内核为每个进程维护了一张页表,存储在CPU内存管理单元MMU中,记录虚拟地址和物理地址的映射关系。一部分虚拟内存中的Page对应物理内存中的页框,一部分对于磁盘上的页框。

1、虚拟内存空间布局
说明:这里只考虑32位系统。

虚拟内存又分为两部分内核空间和用户空间。内核空间放内核的东西,用户空间放用户的东西。用户空间在下,在低地址,例如编号0到29;内核空间在上,在高地址,例如编号30到39。每个进程看到的用户空间都是唯一的,看到的内核空间都是共享的。
我们知道一个进程有5种数据段组成,代码段、数据段、BSS段、堆、栈。虚拟内存空间布局如下图:

各段说明:
代码段:可执行文件操作指令。
数据段:已初始化的全局变量。
BSS段:未初始化的全局变量。
堆段:存放进程运行中动态分配的内存段。
栈段:存放进程临时产生的局部变量,函数的参数和返回值等。

2、虚拟内存到物理内存的映射
虚拟地址到物理地址的转换常用的方式有分段、分页、段页式。
《现代操作系统》书中介绍Inter Pentium支持纯分段、纯分页、段页式管理。知乎上有资料显示现代os基本都是使用平坦寻址方式,分段机制除了管理特权级,没啥用可以忽略。

包括刘超也说Linux操作系统仅仅用分段做了一个权限审核,具体虚拟地址到物理地址的转换是通过分页来实现的。这里就采用这种观点,主要使用分页管理。

分页映射关系如下图:

每个进程的映射关系存储在页表中,实际情况会有多级页表。

3、页式管理页面置换算法
虚拟地址映射的物理地址不存在的时候,会发生缺页中断,需要经过一定算法把内存中一个页面换出内存。
常用算法有:
最优算法
最近未使用算法
先进先出算法
第二次机会算法
时钟算法
最近最少使用算法
最不经常使用算法
老化算法
工作集算法
工作集时钟算法

4、现代操作系统CPU
内存管理是通过CPU中内存管理单元(MMU)进行管理的。我们可以查看自己使用的OS CPU信息,大部分都是Inter。
个人Centos服务器CPU信息

grep "model name" /proc/cpuinfo
model name	: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz

个人Mac CPU信息

2.3 GHz Intel Core i5

而Inter CPU使用的是段页式的内存管理

第三部分 思考

一、操作系统在内存的高地址还是低地址?
有人说
从物理内存地址而言,一般都是放在低地址。
从虚拟内存地址而言,一般都是放在高地址。

也有人说
在windows下,使用了两种特权级别:0和3 (0为内核模式 ,3为用户模式)
内核模式的代码工作在高地址(0x80000000 ~ 0xffffffff)
用户模式的代码工作在地地址(0x00000000 ~ 0x7fffffff)

如 ntoskrnl.exe 是内核模式进程,工作在高地址。
并非所有系统进程都工作在高地址。

二、大小端模式
小端模式:低字节存储在低地址
大端模式:低字节存储在高地址

第四部分 参考资料

一、比较透彻参考
Linux内存管理(最透彻的一篇)
操作系统内存管理

二、宏观层面参考
Linux性能优化实战15:Linux内存是怎么工作的?
趣谈Linux操作系统:内存管理(上):为客户保密,规划进程内存空间布局
许式伟的架构课07:软件运行机制及内存管理
左耳听风77 | 程序员练级攻略:Linux系统、内存和网络

三、微观层面参考
Linux内存管理
Linux用户空间内存管理
Linux 内存分配原理
怎样通俗的理解操作系统中内存管理分页和分段
操作系统核心原理-5.内存管理(下):段式内存管理

四、其他
高地址和低地址、高字节低字节、大小端模式(及如何互换),存储顺序(!!)

发表评论

电子邮件地址不会被公开。 必填项已用*标注