固定分区的主要问题是进程的大小必须受到分区的最大大小的限制,这意味着一个进程永远不能跨越另一个进程。为了解决这个问题,早先人们使用了一些解决方案称为叠加。
覆盖的概念是,每当一个进程运行时,它不会同时使用完整的程序,它只会使用其中的一部分。完成,然后您只需卸载它,这意味着只需将其拉回并获取您需要的新零件并运行它。
正式地,
“将程序代码块或其他数据块传输到内部存储器中,替换已存储的内容的过程”。
有时会发生与最大分区的大小相比,程序的大小会更大,那么,在这种情况下,您应该使用叠加层。
因此,覆盖是一种通过仅保留在任何给定时间需要的那些指令和数据来运行大于物理内存大小的程序的技术。同时在记忆中。
优势 –
- 减少内存需求
- 减少时间要求
坏处 –
- 重叠图必须由程序员指定
- 程序员必须知道内存要求
- 重叠模块必须完全不相交
- 叠加结构的编程设计很复杂,并非在所有情况下都可行
例子 –
覆盖的最好例子是汇编器。考虑到汇编器有 2 次传递,2 次传递意味着在任何时候它只会做一件事,第一次传递或第二次传递。这意味着它将首先完成第一次传递,然后完成第二次传递.假设可用主内存大小为 150KB,总代码大小为 200KB
Pass 1.......................70KB
Pass 2.......................80KB
Symbol table.................30KB
Common routine...............20KB
由于总代码大小为200KB,主存大小为150KB,不可能同时使用2个pass。所以,在这种情况下,我们应该使用overlays技术。 根据overlays的概念,任何时候只有一个pass被使用并且两个pass总是需要符号表和通用例程。现在的问题是如果overlays-driver*是10KB,那么所需的最小分区大小是多少?对于pass 1所需的总内存是=(70KB + 30KB + 20KB + 10KB) = 130KB 并且第 2 轮所需的总内存 = (80KB + 30KB + 20KB + 10KB) = 140KB。所以如果我们有最小 140KB 大小的分区,那么我们可以很容易地运行这段代码。
*覆盖驱动:-用户负责覆盖,操作系统不会提供任何东西。这意味着用户应该在第一遍中写下需要的部分,一旦第一遍结束,用户应该编写代码拉出pass 1并加载pass 2。这就是用户的责任,也就是所谓的Overlays驱动程序。Overlays驱动程序只会帮助我们移出和移入各个部分代码。
问题 –
程序的覆盖树如下图所示:
加载(和
运行)这个程序?
(a) 12 KB (b) 14 KB (c) 10 KB (d) 8 KB
解释 –
使用覆盖概念,我们实际上不需要在主存储器中拥有整个程序。我们只需要在那个时刻需要的部分,我们需要 Root-AD 或 Root-AE 或 Root-BF 或 Root- CG部分。
Root+A+D = 2KB + 4KB + 6KB = 12KB
Root+A+E = 2KB + 4KB + 8KB = 14KB
Root+B+F = 2KB + 6KB + 2KB = 10KB
Root+C+G = 2KB + 8KB + 4KB = 14KB
所以如果我们有 14KB 大小的分区,那么我们可以运行它们中的任何一个。
答案 -(b) 14KB