内存管理

 

目录

无存储抽象

存储抽象

地址空间

交换技术

空闲内存管理

位图管理:

链表管理:

虚拟内存

MMU映射

页表项的结构

加速分页过程:

转换检测缓冲区(Translation Lookaside Buffer, TLB)

软件TLB管理

如果虚拟地址空间足够大,那么页表也会足够大

页面置换算法

最优页面置换算法

最近未使用页面置换算法

先进先出页面置换算法

第二次机会页面置换算法

时钟页面置换算法

最近最少使用页面置换算法

用软件模拟LRU

工作集页面置换算法

工作集时钟页面置换算法

页面置换算法小结


无存储抽象

远古时代并不存储抽象的概念,因此每个程序都是直接操作物理内存。因此这种情况下,我们每次只能运行一个程序。一个程序运行结束后,另一个程序从磁盘调入内存,覆盖原有的程序。

人们不满足这一切,在无存储抽象时代,使用一些特别的硬件也完成了多程序运行。操作系统只需要把当前内存中所有内容保存到磁盘文件中,然后再把程序读入内存即可。只要某一个时刻内存只有一个程序再运行,就不会有冲突的情况发生。

通过使用PSW(Program Status Word,程序状态字),每个进程访问内存的时候会判断PSW是否相同,这个样子就能够防止进程之间,用户进程和操作系统之间的干扰。

存储抽象

地址空间

就像进程的概念创建了一种抽象的CPU来运行程序,地址空间创建了一种内存共程序使用。地址空间是进程可以用来寻址内存的地址集。每个进程都有它自己的地址空间,独立于其他进程的地址空间。

实现地址空间最简单的方法就是使用动态重定位技术,它就是通过一种简单的方式将每个进程的地址空间映射到物理内存的不同区域。具体的实现,我们现有两个硬件,即基址寄存器和变址寄存器。

  • 基址寄存器: 存储数据内存的起始位置
  • 变址寄存器: 存储应用程序的长度

每当进程引用内存以获取指令或读取,写入数据时,CPU都会自动将 基址值 添加到进程生成的地址中,然后再将其发送到内存总线上。同时,它检查程序提供的地址是否大于或等于变址寄存器 中的值。如果程序提供的地址超过 变址寄存器 的范围,那么会产生错误并中止访问。

交换技术

内存增大的速度远远更不是应用程序的增长速度。所以我们永远会面对内存不足问题。这里有两种处理方式。

  • 交换技术: 即把一个进程完整的调入内存,然后在内存中运行一段时间,再把它放回磁盘。
  • 虚拟内存: 见下面章节。

空闲内存管理

位图管理:

内存被划分为小到几个字或大到几千字节的分配单元。每个分配单元对应于位图中的一位,0表示空闲,1表示占用。

位图提供了一种简单的方法在固定大小的内存中跟踪内存的使用情况,因为位图的大小取决于内存和分配单元的大小。这种方法有一个问题是,当决定为把具有k个分配单元的进程放入内存时,内容管理器必须搜索位图,在位图中找出能够运行k个连续0位的串。在位图中找出制定长度的连续0串是一个很耗时的操作,这是位图的缺点。

链表管理:

维护一个记录已分配内存段和空闲内存段的链表,段会包含进程或者是两个进程的空闲区域。如上面的c图,链表中的每一项都可以代表一个空闲区(H)或者是进程(P)的起始标志,长度和下一个链表项的位置。

当按照地址顺序在链表中存放进程和空闲区时,有以下几种算法为创建的进程分配内存:

首次适配(first fit): 内存管理器沿着链表进行扫描,直到找到一个足够大的空闲区为止。除非空闲区大小和要分配的空间大小一样,否则将空闲区分为两部分,一部分供进程使用,一部分生成新的空闲区。首次适配算法是一种速度很快的算法,它会尽可能搜索链表。

下次适配(next fit):它和首次匹配的工作方式相同,只有一个不同之处就是下次适配在每次找到合适的空闲区时就会记录当时的位置。以便下次寻走空闲区时从上次结束的地方开始搜索,而不是像首次适配算法那样每次都会从头开始。

最佳适配(best fit):最佳适配会从头到尾寻走整个链表,找出能够容纳进程的最小空闲区。最佳适配算法会试图找出最接近实际需要的空闲区,以最好的匹配请求可用空闲区,而不是先一次拆分一个以后可能会用到的大的空闲区。但是最佳适配算法由于切割生成了更多无法利用的小缓冲区,所以造成了内存的浪费。

最差适配(worst fit):即总是分配最大的内存区域,使新分配的空闲区比较大从而可用继续使用。

快速适配(quick fit):类似与STL中的内存分配。为常用大小的空闲区维护单独的链表。快速适配算法寻找一个指定代销的空闲区也是十分快速的,但它和所有将空闲区按大小排序的方案一样,都有一个共同的缺点,即在一个进程终止或被换出时,寻走它的相邻块并查看是否可用合并的过程都是非常耗时的。如果不进行合并,内存将会很快分裂出大量无法利用的小空闲区。

 

虚拟内存

虚拟内存的基本思想是,每个程序都有自己的地址空间,这个地址空间被划分为多个称为页面(page)的块。每一页都是连续的地址范围。这些页被映射到物理内存,但并不是所有的页都必须在内存中才能运行程序。当程序引用到一部分在物理内存中的地址空间时,硬件会立刻执行必要的映射。当程序引用到一部分不在物理内存中的地址空间时,由操作系统负责将缺失的部分装入物理内存并重新执行失败的指令。

在没有虚拟内存的计算机上,系统直接将虚拟地址送到内存总线上,读写操作都使用同样地址的物理内存。在使用虚拟内存时,虚拟地址不会直接发送到内存总线上。相反,会使用MMU(Memory Management Unit)内存管理单元把虚拟地址映射为物理内存地址。如上图所示。

MMU映射

虚拟地址(0010000000000100)用上面的页表映射图所示的MMU映射机制进行映射,输入的16位虚拟地址被分为4位的页号和12的偏移量。4位的页号可以表示16个页面,12位的偏移可以为一页内的全部4096字节。

虚拟地址到物理地址的映射可以总结如下:虚拟地址被分为虚拟页号(高位部分)和偏移量(低位部分)。虚拟页号可作为页表的索引用来找到虚拟页中的内容。由页表项可以找到页框号。然后把页框号拼接到偏移量的高位段,以替换虚拟页号,形成物理地址。

对于存在映射的页,我们就按照上述情况映射。如果映射不存在,CPU就会陷入到操作系统中,这个陷入称为缺页中断或者说缺页错误。操作系统会选择一个很少使用的页并把它的内容写入磁盘(如果该页已被修改)。随后把需要访问的页面读到刚才回收的页框中,修改映射关系,然后重新启动引起陷入的指令。

页表项的结构

强调一下:虚拟内存本质上是用来创造一个地址空间的抽象,虚拟内存的实现,本质是将虚拟地址空间分解成页,并将每一项映射到物理内存的某个页框。因为我们的重点是如何管理整个虚拟内存的抽象。

加速分页过程:

虚拟地址到物理地址的映射速度必须要快

转换检测缓冲区(Translation Lookaside Buffer, TLB)

TLB其实就是一种内存缓存,用于减少访问内存所需要的时间,它就是MMU的一部分,TLB会将虚拟地址到物理地址存储起来,通常可以称为地址翻译缓存。

软件TLB管理

 

如果虚拟地址空间足够大,那么页表也会足够大

页面置换算法

最优页面置换算法

最近未使用页面置换算法

先进先出页面置换算法

第二次机会页面置换算法

时钟页面置换算法

最近最少使用页面置换算法

用软件模拟LRU

工作集页面置换算法

工作集时钟页面置换算法

页面置换算法小结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值