写在前面:本文仅供个人学习使用,如有侵权,请联系删除。文章中所用图片绝大多数来源于《现代操作系统(第4版)》,请读者支持原版。 内存(RAM) 是计算机中一种需要认真管理的重要资源。一个事实是程序大小的正常速度比内存容量的增长速度要快得多。正如帕金森定律所指出的:“不管存储器有多大,程序都可以把它填满。”在这一章中,我们将讨论操作系统是怎样对存储器创建抽象模型以及怎样管理它们的。
每个程序员都梦想拥有这样的存储器:它是私有的、容量无限大的、速度无限快的,并且是永久性的(即断电时不会丢失数据)。当我们期望这样的存储器时,何不进一步要求它价格低廉? 遗憾的是,目前的技术还不能为我们提供这样的存储器。
除此之外的选择是什么呢? 经过多年探索,人们提出了分层存储器体系(memory hierarchy) 的概念,即在这个体系中,计算机有若干兆(MB)快速、昂贵且易失性的高速缓存(cache),数千兆(GB)速度与价格适中且同样易失性的内存,以及几兆兆(TB)低速、廉价、非易失性的磁盘存储,另外还有诸如DVD和USB等可移动存储装置。操作系统的工作是将这个存储体系抽象为一个有用的模型并管理这个抽象模型。
操作系统中管理分层存储器模型的部分称为存储管理器(memory manager) 。它的任务是有效地管理内存,即记录哪些内存是正在使用的,哪些内存是空闲的;在进程需要时为其分配内存,在进程使用完后释放内存。
最简单的存储器抽象就是根本没有抽象。每一个程序都直接访问物理内存。当一个程序执行如下指令
MOVE REGISTER1,1000计算机会将位置为1000的物理内存中的内容移到REGISTER1中。因此,那时呈现给编程人员的存储器模型就是简单的物理内存:从0到某个上限的地址集合,每一个地址对应一个可容纳一定数目二进制位的存储单元,通常为8个。
在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立即崩溃。
不过即使存储器模型就是物理模型,还是存在一些可行选项的。图3-1展示了三种变体。 在a)中,操作系统位于RAM(随机访问存储器)的底部;在b)中,操作系统位于内存顶端的ROM(只读存储器)中;在C)中,设备驱动程序位于内存顶端的ROM中,而操作系统的其他部分则位于下面的RAM底部。第一种方案以前用于大型机和小型计算机,现在很少使用了。第二种方案被用在一些掌上电脑和嵌入式系统中。第三种方案用于早期的个人计算机中(例如运行MS-DOS的计算机),在ROM中的系统部分称为BIOS(Basic Input Output System,基本输入输出系统)。第一种和第三种方案的缺点是用户程序出现的错误可能摧毁操作系统,引发灾难性后果。
当按这种方式组织系统时,通常同一时刻只能有一个进程在运行。一旦用户键入了一个命令,操作系统就把需要的程序从磁盘复制到内存中执行;当进行运行结束后,操作系统在用户终端显示提示符并等待新的命令。收到新的命令后,它把新的程序装入内存,覆盖前一个程序。
在没有存储器抽象的系统中实现并行的一种方法是使用多线程来编程。由于在引入线程时就假设一个进程中的所有线程对同一
在不使用存储器抽象的情况下运行多个程序
基址寄存器与界限寄存器