计算机操作系统的主要目标
抽象:内存管理方式的抽象
保护:限制不同进程对内核的访问
共享:各个进程共享相同的内核空间(程序中的内核段)
虚拟化:操作系统为每个进程虚拟出更多的空间(虚拟内存)
下面是CPU和操作系统配合下,一次内存数据访问过程:
内存分配策略
连续内存分配:
首次适配:只要遇到空闲块,适合当前所需内存的大小,便将这一块内存分出去。
最优适配:找最合适的内存空间分配。
最差内存分配:找和请求内存大小差距较大的内存块进行分配。
连续内存分配的缺点:产生的内存碎片太多,内存利用率太低。
内存整理策略:压缩式内存整理,交换式内存整理。
非连续内存分配策略
- 分段内存管理策略
将程序可以分成代码段,堆栈段,共享段,数据段等。为每个数据段分配相应的段号和段偏移量,在CPU访问物理内存中的段空间时,CPU先通过段号和段基址找到段偏移,并在MMU中通过段号与相应的段空间中的起始物理地址匹配,通过段起始物理地址加上段偏移即可找到相应的段数据。详细流程如下所示:
不同段的物理地址不一定连续,但相同的段地址一定是一截连续的地址空间。分段内存管理策略使得不同进程可以方便的共享内存中的数据。不同段的长度是不固定的。
- 分页存储管理
页:一个程序的逻辑地址空间被划分成大小相等的页。
系统中页的大小是2的幂,物理内存被分成大小相等的帧。内存物理地址通过一个二元组确定(f,o)f是帧号(F位2的F次方个帧),o是帧内偏移(S位,2的S字节个字节)。
帧号计算公式:2^S×f+o
下面是页存储管理寻址过程:
逻辑空间中页的大小相等且连续,但在物理内存中会被映射到不同的物理地址段,是不连续的。
分页管理的访问性能:访问一个存储单元要两次内存访问,第一次获取页表项,第二次访问数据。
大小问题:页表可能会很大。所占的内存大小不容忽视。
如何处理?
缓存常用数据,间接访问多级页表的机制。
CPU快表?缓存最近访问过的页表项,TLB使用关联存储实现,具备快速访问性能。
多级页表:通过多级引用将页表分成多级,建立页表树。减少每级页表长度。
多级页表访问内存大致流程:
页寄存器:
每个帧与页寄存器相关联。
寄存器内容:使用位:此帧是否已被进程占用。
占用页号:对应的页号
保护位:读写访问权限
- 段页式存储管理
段页式存储管理很方便实现用户进程之间的内存共享,集中了分段存储管理和分页存储管理的优点。
- 伙伴系统内存管理
原理:根据应用的需求,实现规则的划分内存策略。
举个例子相信你会懂的。现在有2^u大小的内存空间,应用程序需要内存的空间是m。
如果2×m<2^u的大小,则比较2×m是否小于2^(u-1)大小。
如果2^(n-1)<2×m<2^u则将2^u内存分给应用程序。
释放内存并合并:合并条件是:内存是两块相邻且大小为2的幂的相等的块才能合并。