一、存储器抽象
1.无存储器抽象
早期的大中小型计算机都没有存储器抽象。每一个程序都直接访问物理内存,这么做相当于把物理地址暴露给进程,这样会带来几个严重的问题:
- 如果用户程序可以寻址内存的每个字节,他们就可以很容易地破坏操作系统,从而使系统慢慢停止运行
- 使用这种模型,想要同时运行多个程序是很困难的
2.一种存储器抽象:地址空间
要保证多个应用程序同时处于内存中并且不互相影响,需要解决两个问题:保护和重定位。这就要创造一个新的内存抽象:地址空间。地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有自己的地址空间,并且这个地址空间独立于其他进程的地址空间。
二、基址寄存器和界限寄存器
那么,如何为每一个进程独立出地址空间呢?这里有一种曾经很常见的策略:基址寄存器和界限寄存器。每次一个进程访问内存,取一条指令,读或者写一个数据字,CPU硬件就会把地址发送到内存总线前,如果访问的地址超过了界限,会产生错误并中止访问。
但是,使用这种方式进行重定位的缺点是,每次访问内存都需要进行加法和比较运算。比较可以做得很快,但是加法由于进位传递时间的问题,在没有使用特殊电路的情况下会显得很慢。
现在已经有更好的机制代替此策略。
三、操作系统的空闲内存管理机制
在动态分配内存时,操作系统必须对其进行管理。一般而言,有两种方式跟踪内存使用情况:
位图和
空闲链表。
1.使用位图的存储管理
使用位图方法时,内存可能被划分成小到几个字或大到几千字的分配单元。每个分配单元对应于位图中的一位,0表示空闲,1表示占用(或者相反)。一块内存区和对应的位图如下图左半部分所示:
2.使用链表的存储管理
这种方法维护一个记录已分配内存段和空闲内存段的链表。其中链表中的一个节点或者包含一个进程,或者是两个进程间的一个空的空闲区。如上图右半部分所示,链表中的每一个节点都包含以下域:空闲区(H)或进程(P)的指示标志、起始地址、长度和指向下一节点的指针。
空间分配算法
当按照地址顺序在链表中存放进程和空闲区时,有几种分配算法可以用来为创建的进程分配内存,下面介绍:
- 首次适配算法
存储管理器沿着段链表进行搜索,知道找到一个足够大的空闲区,除非空闲区的