跳转到内容

操作系统设计/存储演变:寻址方案

来自维基教科书,开放的书籍,开放的世界

存储:寻址方案

[编辑 | 编辑源代码]

存储系统的容量和配置一直影响着可安装操作系统的性质。一些早期的监控系统必须将自己放置在极小的内存中,并为其他程序留出空间。重要的是要认识到,例如关于可以使用卡片安全构建的程序大小的假设,限制了计算机的大小,直到多道程序设计和分时系统改变了规则。

内存库

[编辑 | 编辑源代码]

最初,内存是建立在框架上的,并组织成由多个内存框架组成的长“库”。从那时起,任何线性的内存体系结构都被称为内存库。

内存阵列

[编辑 | 编辑源代码]

随着内存越来越大,增加了更多的库,创建了二维排列,称为内存阵列。后来,技术将这些二维结构缩小到可以安装在硅芯片上的小型电路中。

内存模块

[编辑 | 编辑源代码]

如今,我们拥有二维内存排列,其中每个库都是一个内存模块,它包含多个芯片,这些芯片构建在小型印刷电路板上,将它们组织成特定的内存[检查拼写] 体系结构,例如 DDR2 DIMMS of SDRAM。如今的内存阵列往往在主板上存储千兆字节的数据。

内存缓存

[编辑 | 编辑源代码]

尽管现代内存芯片速度很快,比历史上任何时候都快,但微处理器的芯片速度增长更快,并且一直受到主内存芯片速度的限制。为了让处理器更高效地运行,构建了称为缓存的更快的静态 RAM 区域,这些区域可以以处理器的全速为处理器提供服务。现代计算机在 CPU 中内置了两个这样的缓存,因此即使主内存的频率通常仍然以兆赫兹为单位,CPU 也可以在多千兆赫兹范围内运行。

其理念是,大部分进程都保存在单个内存页面中,并且可以使用本地跳转进行寻址。因此,我们将几个内存页面存储在缓存中,处理器在它们之间来回切换,同时运行程序。这意味着只要我们不需要远调用,我们的处理就会保留在缓存中。但是,一旦我们需要远调用,就会产生缓存未命中,并且我们必须在从较慢的下一级内存加载缓存之前暂停处理。最终,我们从主内存加载内存,并将其传播回顶级缓存,在那里程序可以再次运行一段时间,而无需再次降低到较低的内存速度。

寻址的长短

[编辑 | 编辑源代码]

在大多数现代机器语言中,有两种类型的获取操作:近调用和远调用。正如我们所见,大部分编程都是这样完成的,即内存可以存储在页面集群中,并且可以预测,以便内存获取可以在实际需要特定内存页面之前开始。只要获取可以在需要页面之前很久开始,页面就可以准备好使用,而不会出现明显的等待缓存未命中处理。现代优化编译器可以预测这种预加载的需要并将其构建到程序中,以便缓存始终预测对新页面的需求。问题出现在我们需要对属于另一个程序或部分(例如操作系统)的例程进行远调用时。由于它是在另一个时间编译的,因此编译器除了预测您需要更改页面之外,无法预测任何内容,因此它必须在开始处理新内存部分之前才能预测哪些页面需要预加载。这是机器语言对近跳转和远跳转使用不同调用的原因之一。当然,另一个原因是近跳转不需要完整地址来访问内存,而远跳转则需要。

内存页和交换文件

[编辑 | 编辑源代码]

就像处理器预先获取内存页面以加载到缓存中一样,已经开发了一种类似的体系结构,允许将大型程序大部分保留在辅助存储设备上,并根据需要按页面加载。涉及的机制称为交换文件或虚拟内存设备。它包括一个内存框架来容纳活动页面,以及一个辅助存储设备上的文件来保存实际程序。根据需要,页面将从交换文件移动到主内存框架,在那里它们可以被缓存访问。如果没有一个称为内存管理器的程序或设备将绝对地址映射到虚拟内存框架地址,这将造成混淆。

为了使这种类型的寻址实用,内存系统被组织成基于页面的结构,内存很少以小于页面获取的精度进行访问。一旦创建了这种体系结构,加载页面并将其交换到磁盘就变得相对容易,从处理器的角度来看,主内存只是辅助存储设备的缓存。

内存分区和内存虚拟化

[编辑 | 编辑源代码]

直到第三代操作系统,才需要将内存的大部分区域留出来,以便在多道程序设计或分时系统体系结构中处理不同的用户或不同的应用程序。一种方法是在 80X86 系列(从 286 开始)的体系结构中展示的。通过创建特殊的分区寄存器并将分区地址与基地址寄存器逻辑地组合,即使是同一个程序的访问相同基地址的不同版本也可以通过简单地更改分区寄存器中的分区地址来隔离。通过将特定分区与特定进程关联,可以创建彼此隔离的虚拟内存区域。

CP 操作系统是为了利用这种能力而编写的,它为自己的每个克隆分配一个分区来运行。因此,CP 既是第一个虚拟机,也是第一个能够隔离不同功能或为每个用户提供其自身虚拟机的多处理系统之一。这使得批处理系统能够摆脱 1401 前端和后端处理器,并在主内存的不同分区中运行其软件。正是这个程序的相对成功,引发了 360 系列计算机和 OS360 的开发,后者是运行这些计算机的操作系统。

直接访问硬件

[编辑 | 编辑源代码]

计算机需要时间来处理数据密集型进程。然而,当一个程序想要执行数据密集型进程时,操作系统本身的开销可能是影响数据处理量的因素。这在 HCI 中最为明显,因为用户是处理循环的一部分。开销至关重要的地方的一个很好的例子是动画图形。如果操作系统将屏幕更新的优先级低于同时运行的其他进程,则屏幕更新可能会被显著延迟。例如,如果你正在观看一部电影,这会导致电影画面卡顿,并会在奇怪的时间停顿,打破声音和视频之间的联系。另一个对时间要求很高的方面是声音本身,因为卡顿的声音几乎不可能转换为语音。

这里我们遇到了一个问题:在一个单线程、单用户系统中,允许进程接管处理控制权,并直接写入物理硬件,而无需经过系统调用接口是可行的。然而,在一个多编程或分时系统中,这样做会降低其他人或其他程序对计算机的使用效率,因为当该程序直接控制时,其他进程无法运行。

此外,允许直接访问硬件还有一个负面影响,那就是所有安全机制都被绕过,恶意程序可以实际接管计算机,创建帐户或复制数据,同时表面上显示一部电影。

由于这后两个因素,直接访问硬件存在争议,在设计操作系统时必须仔细考虑。操作系统为程序提供了哪些选择?它是在沙箱中运行,还是可以随意修改内存和辅助存储?任何使计算机更安全的操作,都会降低动画的质量,而任何提高动画质量的操作,都会降低其他程序和其他用户的服务质量。

就我个人而言,我记得我发现我的 TRS-80 袖珍电脑没有实现 peek 或 poke 命令(Basic 的直接访问命令),因此我无法用机器语言对其进行编程。正是在那个时候,我放弃了用袖珍电脑制作东西的计划,开始考虑购买更强大的玩具。

扩展内存

[编辑 | 编辑源代码]

由于英特尔作为芯片制造商设计了 80286 来与 8086 向后兼容,并希望保持与 DOS 的兼容性,因此出现了一个有趣的问题。问题是 DOS 是基于一个将内存限制为 640K(千字节)的架构构建的,而 286 具有扩展内存,可以访问更大的地址空间。为了访问这部分内存,操作系统必须处理 640 KB 和 1 MB 之间的空间地址已被 ROM 使用的事实。通过允许 ROM 停留在第一个 1 MB 空间内,芯片制造商实际上创建了两个具有间隔的 RAM 内存空间:第一个 640 KB 的常规内存和从 1 MB 开始的扩展内存。

程序必须要么意识到这个间隔并跨越它加载,要么必须被分成模块,并将一个模块加载到一个内存空间,另一个模块加载到另一个内存空间。Windows 可以做到这一点,因为它有一个内存管理器,但很少有 DOS 程序如此复杂,因此 DOS 程序往往局限于前 640 KB。正是由于 Windows 允许使用更大的电子表格,286 和 Windows 比 8086/8 版本的 Dos 机器更受欢迎。

最终,到 80386 出现时,Dos 开发了自己的内存管理器,成为一个扩展操作系统,但在 286 时代,它被限制在最底部的 640 KB 内存中。

增强内存

[编辑 | 编辑源代码]

一些主板制造商对基于 286 的计算机中内存寻址的不一致感到困扰,因此设计了一种新的内存映射,称为增强内存,它允许他们通过在 BIOS 加载后进行银行切换 ROM 来填补两个内存空间之间的间隔。这种架构已经成为标准,现在操作系统不必再处理由于将 ROM 保留在第一个 1 MB 地址范围内而导致的不一致。然而,DOS 已从 Windows 中消失,现在只是一个由命令行模式中使用的命令语言语法保留的内存。

华夏公益教科书