操作系统设计/存储的演变:机制
操作系统设计经常反映了它们时代的存储能力。虽然最早的存储机制是在操作系统出现之前就存在的,但为了完整起见,这里也包含了它们。
第一个已知的人工存储技术可能是液压的。很少有人意识到,过去的艺术喷泉实际上是试图开发内存系统。
到了巴贝奇的时代,机械装置开始具备存储信息的能力。他的差分机虽然没有达到他预期的效果,但也能够存储数字并进行加减等运算。我父亲时代的机械计算器,演变成了我童年的电子计算器。
最初,存储数据的电气设备本质上是模拟的。但是,模拟组件往往存在很大差异,除非它们经过精心制造,所以模拟计算机从未实现大规模生产。
使数字存储成为可能的的发明是高电压与低电压检测的约定。尽管模拟组件的值范围很大,但可以标准化电路,以检测大约 5 伏的电压差。从这个标准开始,可以定义一个稳定的 5 伏信号为 1,任何低于大约 2 伏的电压为 0。开发了一系列存储电路,每个电路具有独特的特性,但可以在数字存储所需的特定电压范围内工作。
数字存储发明后,有人必须发明方法来编码信息,另一个人必须提出如何存储事物的理论。最终,一种被称为信息论的理论揭示了如何存储几乎所有可以用数字、字母或图片表示的事物。
一旦有了关于如何存储几乎所有可以用数字表示的事物的理论,下一个问题就是标准存储大小应该是什么。数字可以存储在 4 位中,整个英文字母表可以存储在 8 位中,世界上几乎所有的字母表都可以存储在 32 位中。
从 1950 年代到 1980 年代初,许多计算机使用 36 位数据总线。[1]
第一个微处理器(从 1971 年开始)拥有 4 位数据总线。虽然像 Altair 这样的早期微型计算机有 4 位数据总线,但微型计算机直到架构扩展到 8 位才开始流行起来。今天,微型计算机架构使用大约 32 到 64 位的字来通过每个提取周期移动更多字符来加速吞吐量。许多操作系统的有一个问题是,它们将字长设置为数据路径宽度,而最终市场会超越该数据路径宽度。
在 Windows 的生命周期中,计算机的数据路径宽度已经翻了 3 倍。[2] (虽然 8088 基于 16 位芯片,但它实际上具有 8 位的有效数据路径宽度。还要注意具有隔离地址总线的芯片,不要将数据总线与地址总线混淆)每次翻倍时,都会编写一个新的 Windows 版本,利用更大的数据路径宽度,并使之前的版本过时,迫使人们升级。问题的一部分在于,我们用其编写操作系统的语言限制了数据字的大小,使其不超过该 cpu 架构中可用的最大值。当为 cpu 创建一个新的数据路径宽度时,语言需要一段时间才能升级以处理更大的数据路径。幸运的是,只需用零填充即可在更大的数据路径中模拟较小的字。但是,通过使用两个单独的字并将它们逻辑地组合起来,模拟更大的数据路径宽度也同样容易。这样做不常见的原因仅仅是营销。每次数据路径宽度增加时,每个人都可以出售其软件的新版本,使以前的版本看起来过时。
对特定元素进行编码的方式决定了存储它需要多少内存。更高效的编码技术存储在更少的空间中,效率较低的存储技术存储在更多的空间中。虽然存储的最初概念是它很昂贵,因此应该尽量减少对任何元素的存储,但随着我们发现冗余存储技术的新的应用,这种观点已经越来越受到重新考虑。另一方面,数字存储只存储我们要存储的事物的符号。经验告诉我们,该符号的大小部分取决于我们对该符号了解的信息量。鉴于我们只需要发出一个信息,并且信息的內容是已知的,那么一个比特就足够了。但是,存储技术越通用,对每个信号的了解越少,符号集就必须更大才能涵盖所有信号,因此代码就必须更大。
在某些情况下,将数据存储得尽可能高效并不合理,仅仅因为我们无法以其最有效的形式在一个数据路径宽度为任何大小的 CPU 中获取它。这方面的一个例子,将是一个小整数或真假逻辑符号。由于我们通常希望以单个数据字的获取周期移动数据,为了将该字的大小减少到一个小整数或逻辑符号的大小,我们将不得不进行更多必要的处理,如果我们只是使用更大的存储大小来象征该元素。另一方面,如果我们希望将尽可能多的存储空间压缩到尽可能小的区域,我们希望获得最紧凑的存储方案,并且我们可能希望使用某种压缩机制来减少存储冗余,使记录更小。
一旦我们确定了数据的符号格式,这并不像看起来那么微不足道,因为计算机倾向于有字节序,以及负整数和浮点数的不同表示形式,下一个问题出现是因为存储本身取决于存储器的技术。不同类型的存储器以不同的电路存储数据,这些电路的特性也不同。
对存储器类型的兴趣主要在于 RAM 和 Rom 之间的区别。本质上,ram 可以很容易地写入,并且必须通过电池备份,或者必须不断刷新,这取决于它是静态 RAM 还是动态 RAM。当计算机关闭时,动态 RAM 在几秒钟内就会清空并丢失。带有电池的静态 RAM 会保留一段时间,但往往更复杂,因此也更昂贵。另一方面,Rom 在没有电力的情况下会保留一段时间,但并不容易写入。
因此,计算机的初始化通常依赖于 ROM,而日常使用则基于 RAM。
虽然早期的 ROM 芯片必须在工厂制造,但一种新型的 ROM 被开发出来,称为 PROM,其中熔丝可以在芯片离开工厂后烧毁以对芯片进行编程。后来,这些芯片被 Eproms 替代,Eproms 是具有可擦除熔丝的芯片,以后可以重新编程。虽然这些在一段时间内被 EEproms 或电气可擦除 Eproms 替代,但 Flash Rom 的出现使这些笨重的芯片过时,因为 Flash Eproms 可以在线路中写入。如今,Flash Rom 芯片非常便宜,使用 Flash 技术的多吉字节存储单元可以放在钥匙链上。这样就消除了对小型引导扇区来加载操作系统的需求,因为操作系统可以轻松地放入一小块 Flash Rom 芯片中。
操作系统也可以根据它们对辅助存储的依赖程度来进行分类。例如,第一代操作系统没有很大的存储能力,因此它们倾向于在运行之间将存储卸载到一些辅助介质上。
最早的辅助存储形式是穿孔卡片。本质上,霍勒瑞斯穿孔卡片是雅卡尔提花机的改编,雅卡尔提花机通过将带有孔的卡片穿过一个特殊的读头,机械地检测卡片上的孔,并设置大型提花机上的综线来匹配卡片上的图案,提升或落下线,使经线位于纬线的前面或后面,从而自动化了布料中的图案。
霍勒瑞斯的发明是对这一概念的电气化,这样当卡片穿过读取器时,当孔通过两个触点之间并充当绝缘体或允许接触时,就会激活不同的电气触点,从而激活电路。
下一种辅助存储类型是磁带。这通常用于存储批处理数据和程序,以便可以多次运行它们。这种存储类型的一个必要条件是能够在磁带的开头附近快速确定要走多远才能找到特定的程序。为了做到这一点,磁带操作系统会在磁带上写入一组特殊的记录,称为目录,并在磁带上写入计时标记以对其进行格式化,以便能够找到磁带的正确部分。
这两种形式之间的一种中间形式是纸带,它被特别用于电传打字机。本质上,可以创建长的纸带,使用与霍勒瑞斯卡片上打孔相似的打孔。
磁带上的一个有趣的变体是所谓的鼓或圆柱体存储器,它使用多个读写头在本质上是一个磁鼓上存储数据。
更有趣的是硬盘,其中磁性介质的磁盘堆叠在一起形成簇,每个簇在磁盘的顶部和底部都有一个读头。随着这些磁盘越来越小,单个磁盘中可以保存的存储量越来越大,直到今天,单个 3.5 英寸格式设备中可以保存数百吉字节。
在软盘中也可以找到类似的存储能力,其中一层略厚的磁性材料被用作临时存储,以及在计算机之间移动数据。虽然 3.5 英寸软盘几乎已经过时,但至今仍在某些计算机上提供。早期版本为 8 英寸和 5 1/4 英寸软盘。8 英寸软盘的存储密度较低,5 1/4 英寸软盘的存储密度有所提高,但 3.5 英寸软盘的存储密度最大约为 1.4 兆字节。软盘价格便宜,可以丢弃。
光盘的想法是,通过激光束之类的光学设备写入和读取的数据,如果激光束的频率足够高,其波长可以聚焦在比磁性磁盘上的最小磁畴更小的区域,则可以存储在更小的区域中。
12 英寸激光唱片的发明是为了让人们能够像购买唱片一样购买电影。然而,这项技术的时机不对,因为人们正从唱片中转移到其他存储介质。由于行业在 VHS 录像带的分配上实现了标准化,激光唱片的创造者最终得到了一种新奇的产品。
索尼作为激光唱片的开发者之一,决定制作一种更小的激光唱片格式,称为“光盘”,因为它采用 5 1/4 英寸的格式。他们的想法是将这种光盘推广为音乐发行的一种媒介。
然后,利用批量生产带来的成本节约,他们创建了一种名为 CD-ROM 的计算机存储设备,用于应用程序的分发。计算机版本存储 625 兆字节的数据,并且生产成本越来越低,以至于现在可刻录版本的空白盘价格不到一美元一张。
通过降低 CD 刻录机的生产成本,从而降低在 CD 上存储各种格式数据的成本,CD 制造商创造了一个用于计算机备份存储和程序分发的市场。
一种不同的磁盘格式被设计为具有更好的存储特性,使其可以用于存储电影。这种名为 DVD 的光盘可以在单条轨道上存储 4.7 吉字节的数据,并且提供双轨道配置,如果对第二条轨道进行编程,光盘可以存储 7 吉字节的数据。
就像以前一样,DVD 制造商设计了一种计算机存储设备,并利用电影发行格式的批量生产带来的成本节约来降低设备价格,使其成为将 DVD-RAM 光盘作为计算机标准配置的经济选择。
坦率地说,对于操作系统来说,存储技术的实现方式并不重要,除了实现设备控制机制的驱动程序之外。从操作系统的角度来看,有趣的是它如何使用存储。
使用非易失性存储器的原因之一是它不会改变。无论恶意软件黑客尝试做什么,通常非易失性存储器都不会受到影响。黑客必须实际更换芯片才能影响计算机的运行。当然,与 ROM 相比,这种保证对于闪存来说并不那么有效,但光盘等非易失性辅助存储器使得在不担心病毒破坏的情况下存储程序成为可能。
事实上,在 Windows 98 时代,从大多数病毒中恢复,无论它们有多么致命,都和从光盘重新加载所有软件一样容易。当然,您会丢失任何未备份的数据,但这就是备份存在的意义。
另一方面,易失性存储器价格便宜,而且越来越便宜。每一代主板都可以比上一代在动态 RAM 中存储更多数据。当然,如果电源中断,您会丢失这些内存,但有了大型硬盘,程序和数据通常可以通过很少的努力恢复。
因此,原始存储很容易。但是,除了存储数据的程序之外,以可使用的方式检索数据可能很麻烦。这就是创建一种称为数据库的特殊数据存储和检索引擎的原因。其想法是程序可以以比通常的存储功能允许的更多方式存储和检索数据。数据库已经存在足够长的时间,以至于程序现在开始调用它们进行存储,或者在程序中使用自己的专有数据库来加快存储访问速度。
问题是,数据库系统依赖于人员以某种形式向它们提供数据,或者依赖于程序向它们提供预先格式化的记录。没有数据库设计经验的人员不愿意尝试理解它们,因为他们可以在效率较低的存储机制中存储内存并以这种方式使用它。一个很好的例子是 Microsoft Office 数据库引擎 Access。人们总是试图在 Excel 电子表格中存储数据库,而不是使用 Access。
现代存储设备的一个问题是,它们很少被设置为最佳的归档或备份操作。当您完成某些数据但不想丢弃它们时会发生什么?它们是否以允许您在一年或两年甚至十年后检索的方式存储?
当能够恢复旧文件很重要时,您需要一种特殊的存储能力,一种相对便宜的存储能力,并且可以自动或至少定期用于创建数据的映像,以便以后可以检索它们。
这就是归档和备份工具的作用。将大量数据存储在压缩格式中,以降低存储成本,但保留多年未使用的完整数据,以便以后即使遇到电源中断、恶意软件攻击、系统升级或其他导致内存轨迹失真的更改也能恢复。
在这种情况下,实现这种数据持久性保证的一种方法是在您的操作系统中实现透明持久性。透明持久性不会强制操作员经常写入磁盘来存储数据,而是像文字处理器在工作正在进行中并且发生电源中断时保存大部分工作那样。类似的过程可能例如在维基百科上保存本文,而无需作者告诉维基百科保存它。最近,操作系统一直在推出带有日志存储功能的操作系统,其中对文件的更新会暂时存储到日志中,以便即使在电源中断时也能恢复。这意味着,即使最新的更改可能尚未记录,大部分工作都存储在日志中,并且可以在重新启动程序时作为一部分恢复。
在 Linux 中,操作系统的存储日志化意味着挂载自上次超级块更新以来已发生更改的卷不需要长时间的恢复过程,因为更改会输入日志并可以相当快地更新。由于操作员没有明确告诉计算机存储数据,透明持久性被视为隐式内存的早期模型。
如果透明持久化被视为一种隐式记忆的形式,那么被称为工作区的概念就不足为奇了。工作区是一个常用的术语,指的是用作工作记忆的黑板系统,它可能代表一种中间短期记忆,可以被多个程序同时使用。
道格拉斯·霍夫斯泰德设计了一个名为 Copycat 的程序,它展示了如何使用一个简单的联想记忆(称为滑网)来定位信息,在不同信息片段之间建立关系,从而找到信息中的归纳模式。当然,他的工作是为了找到简单文本字符串的等效字谜,但后来斯坦·弗兰克林展示了如何扩展这样一个程序,使其成为一个名为 IDA 的认知架构的一部分。它依靠工作区来实现联想记忆。
可以通过以下方式将该想法与透明持久化结合起来:首先将要持久化的内容放入工作区,然后让滑网为其构建联想模式,最后进行永久存储。这样,原始数据加上关联内容就会同时存储在持久化内存中。
- ↑ 36bit.org
- ↑ Barry B. Brey The Intel Microprocessors: 8086/8088, 80186/80188, 80286, 80386, 80486, Pentium, Pentium Pro processor, Pentium II, Pentium III, and Pentium 4: Architecture Programming and Interfacing, 第 6 版,Pearson Education Ltd.(2003) ISBN 0-13-060714-2 第 310 页