一个理想内存(RAM)应该是:私有的、容量无限大的、速度无限快的、永久非易失的。但技术所限,并不存在这样的内存。
分层存储器体系包括:
- 若干兆(MB)快速、昂贵且易失性的高速缓存(cache);
- 数GB速度与价格适中且同样易失性的内存;
- 数TB低速、廉价、非易失性的磁盘存储;
- 诸如U盘等可移动存储装置。
操作系统中管理分层存储器体系的部分称为存储管理器,它的任务是有效地管理内存、即记录哪些内存是正在使用的,哪些内存是空闲的;在进程需要时为其分配内存,在进程使用完后释放内存。
地址空间
就像进程的概念创造了一类抽象的CPU以运行程序一样,地址空间为程序创造了一种抽象的内存。
地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有自己独立于其他进程的地址空间。
地址空间很常见,例如电话号码。地址空间可以不是数字的,一套“.com”的互联网域名也是地址空间。
给每个进程单独的地址空间的最简单方法就是利用基址寄存器和界限寄存器。程序的起始物理地址装载到基址寄存器中,程序的长度装载到界限寄存器中。
空闲内存管理
在动态分配内存时,操作系统必须对其管理。有两种方式可以跟踪内存使用情况:位图和空闲链表。
位图
内存被划分成小到几个字,大到几千字节的分配单元,每个分配单元对应位图中的一位,0表示空闲,1表示占用。内存和分配单元的大小决定了位图的大小。
链表
另一种记录内存使用情况的方法是:维护一个记录已分配内存段和空闲内存段的链表。链表的一个结点或许表示一个进程,或许表示两个进程间的一个空闲区。每个结点都包含以下域:空闲区(H)或进程(P)的指示标志、起始地址、长度和指向下一个结点的指针。
当按照地址顺序在链表中存放进程和空闲区时,有几种算法可以用来为新进程分配内存。
- 首次适配算法:存储管理器沿着链表进行搜索,直到找到一个足够大的空闲区。
- 下次适配算法:在首次适配的基础上,每次还记录当时的位置,以便在下次寻找空闲区时从上次结束的地方开始搜索。
- 最佳适配方法:搜索整个链表,找出能容纳进程的最小的空闲区。
虚拟内存
虽然存储器容量增长迅速,但是软件大小的增长更快。需要运行的程序往往大到内存无法容纳,而又需要系统能够支持多个程序同时运行。
和存储器层次结构中其他缓存一样,磁盘(较低层)上的数据被分割成块,这些块作为磁盘和主存(较高层)