什么情况下需要覆盖与交换
要弄清楚什么是覆盖与交换的概念,首先我们要知道在什么情况下才会使用到覆盖与交换。
在早期的计算机内存很小的时候,比如 IBM 推出的第一台 PC 机最大只支持 1 MB 大小的内存,因此会经常出现内存大小不够的情况,后来就引入了 覆盖技术
用来解决程序内存大小超过了物理内存总和的问题。
说白了就是我需要运行一个 20 MB 大小的程序,但是这台计算机内存大小只有 10 MB 那怎么运行呢? 带入这个问题,我们接着往下看 覆盖技术
是如何解决这个问题的。
覆盖的实现方式
覆盖技术的思想:将程序分为多个段,常用的段常驻内存,不常用的段需要时调入内存。
简单点说,就是将内存分为一个固定区
,若干个覆盖区
,经常需要用到的程序就会放入这个固定区,调入后就不再调出,除非程序结束运行。不常用的程序就会放在覆盖区,需要用的时候就调入内存,用不到的时候就调出内存。
接下来我们来看个实际的例子,更加容易理解:
有一个程序 X,这个程序指定了调用结构,如图上所示, A 是主要的调用,所以 A 是被放在了固定区当中,紧接着 A 调用了 B、C,在这个时候 B、C 属于同一个层级,被放入了同一个覆盖区,但是覆盖区域大小是以 C 为主,选择最大的,否则就不满足内存大小了,这个覆盖区,让那些不可能同时被访问的程序段,共享一个覆盖区。 同样的道理 D、E、F 共用一个覆盖区。
原本 B、C、D、E、F 它们共占了 44 K 的内存,但是由于覆盖技术,只需要占用 22 K 的内存就搞定了。
在这里就有同学好奇了,那程序是如何指定调用结构的呢? 这个呀,必须由程序员声明覆盖结构,然后由操作系统完整自动覆盖。 缺点:对用户不透明,而且还增加了程序员编程的负担,覆盖技术只用于早期的操作系统中,现在已经成为历史了
。
那既然覆盖技术已经不再使用了,那现在用的啥技术呀? 我们接着往下看
交换的实现方式
交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出到外存,把外存中某些已具备运行条件的进程换入内存,也就是进程在内存与硬盘之间动态调度,也就是我们之前章节所讲的中级调度。
大家一起来思考一下如下几个问题:
1、应该在外存的什么位置保存被换出的进程?
2、什么时候应该交换?
3、应唤出哪些进程?
我们一个个问题来看,先看第一个:应该在外存的什么位置保存被换出的进程?
如果你当前使用的操作系统,它是具备交换功能的,那么通常操作系统会把磁盘空间划分为两个部分:文件区、对换区
。 文件区
主要就是用来存放文件,被唤出的进程数据就保存在对换区
。
既让这个对换区
是和我们内存打交道比较频繁的,会直接影响系统的整体速度,所以对换区通常采用的是连续分配方式,I/O 的速度是肯定要比文件区的速度更快。在这里还有同学可能不理解什么是连续分配方式,这个在文件管理的章节中会讲到。
接着来看第二个问题,交换通常是在许多进程运行并且内存吃紧时进行交换,等待系统负荷降低了就暂停。比如说:在发现很多进程在运行的时候经常发生缺页,就说明内存比较紧张了,此时就可以换出一些进程。
那最后操作系统发现内存资源紧张了,那该换出哪些进程呢? 有这么几个参考条件: 可优先换出当前处于阻塞状态的进程,也可以优先换出优先级比较低的进程。 但是要注意一点,被唤出的进程所属的 PCB 是会常驻在内存的,如果 PCB 都没有了,那内存对应的记录都找不到了,PCB 通常会记录该进程被唤出在外存的具体位置,便于重新调入时可找。