Linus 在他的自传中谈到的“页面到磁盘”功能本质上是我们今天使用的交换概念吗?

com*_*ium 28 linux swap minix

在他的自传Just for Fun 中,Linus 提到了“页面到磁盘”功能,该功能对于使 Linux 成为当时 Minix 和其他 UNIX 克隆的有价值的竞争对手至关重要:

我记得,在 12 月,德国有一个人只有 2 兆字节的 RAM,他试图编译内核,但无法运行 GCC,因为当时 GCC 需要超过 1 兆字节的内存。他问我是否可以使用不需要那么多内存的较小编译器来编译 Linux。所以我决定即使我不需要特定的功能,我也会为他实现。它被称为页到磁盘,这意味着即使某人只有 2 毫克 RAM,他也可以使它看起来更多地使用磁盘作为内存。那是 1991 年圣诞节前后。

页面到磁盘是一件相当大的事情,因为这是 Minix 从未做过的事情。它包含在 0.12 版本中,该版本于 1992 年 1 月的第一周发布。立即,人们开始将 Linux 不仅与 Minix 进行比较,而且与 Coherent 进行比较,后者是由 Mark Williams 公司开发的小型 Unix 克隆。从一开始,添加页面到磁盘的行为就使 Linux 在竞争中脱颖而出。
那是Linux起飞的时候。突然间有人从 Minix 切换到 Linux。

他基本上是在谈论swapping这里吗?对 Linux 有一些历史观点的人可能会知道。

Ste*_*itt 36

是的,这是有效的交换。引用0.12发行说明

虚拟内存。

除了“mkfs”程序之外,现在根磁盘上还有一个“mkswap”程序。语法是相同的:“mkswap -c /dev/hdX nnn”,再说一遍:这会覆盖分区,所以要小心。然后可以通过将引导映像中偏移 506 处的字更改为所需设备来启用交换。使用与设置根文件系统相同的程序(但当然将 508 偏移量更改为 506)。

笔记!这已经由拥有 2M 机器的 Robert Blum 测试过,它允许您在没有太多内存的情况下运行 gcc。但是,我不得不停止使用它,因为我的磁盘空间被 beta-gcc-2.0 吃掉了,所以我想听到它仍然有效:我完全无法为基本的交换分区从圣诞节开始测试。因此,新的更改可能只会在 VM 上适得其反,但我对此表示怀疑。

在 0.12 中,分页用于许多功能,而不仅仅是交换到设备:按需加载(仅在使用时从二进制文件加载页面)、共享(在进程之间共享公共页面)。

  • 呵呵。想象一下,几乎没有足够的磁盘空间来存储 GCC 的源代码。 (10认同)
  • @user253751 想象一下,没有足够的磁盘空间来制作 512Kb 的分区进行测试。 (5认同)

Gil*_*il' 30

是的,这正是称为分页或交换的概念。(很久以前,这些术语的含义略有不同,但在 21 世纪,它们是同义词,除非在某些非 Unix 操作系统的上下文中。)

需要明确的是,交换并不是一个创新的特性:大多数“严肃”的 Unix 系统都有它,而且这个特性比 Unix 还要老。交换对 Linux 的作用是把它变成一个“严肃的”Unix,而 MINIX 是为了教育目的。

今天交换仍然是相同的概念。决定保存哪些页面以及何时保存它们的启发式方法变得更加复杂,但基本原则仍然存在。

  • @EthanReesor 页面交换是 1960 年代初以来的事情。它比 Unix 还要古老,更不用说 Linux。我引用的维基百科文章有参考资料。甚至在 Linux 出现之前,Windows 就有页面交换(Windows 3.0 于 1990 年发布)。 (8认同)
  • 使用 MMU 后,部分交换已经存在很长时间了(如果内存只是闲置,则不必要地将整个映像放到磁盘中);但是在可恢复的页面错误之前,整个图像需要在您可以恢复进程之前。请求分页在 80386 之前就已为人所知并使用,但当时在芯片上安装 MMU 并不常见。它曾经是一个可选的外部组件。虽然当然“外部”只对微处理器有意义,但请求分页开始于更大的事情。 (2认同)
  • IIRC 交换是 Windows 1.0 的基本功能之一。这就是使用超过 640kB 内存的原因。但是由于 8086 没有带页表的 MMU,它交换了段。 (2认同)

小智 22

交换是一个早于虚拟内存甚至内存保护的概念:它只是意味着将一个进程放在磁盘上为另一个进程腾出空间。最初的 Unix 在这方面有两个怪癖:“共享文本”程序,它只将程序代码保存在内存中一次,并且只换出数据部分。它有一个“fork”系统调用,可以将进程交换到磁盘,同时不替换内存映像,而是保持副本(子进程)运行。

与交换相反,页到磁盘允许不适合物理内存的进程运行。它需要所有可保护的内存、虚拟地址到物理地址的内存映射,以及一个可重新启动的页面错误机制,允许将映射从未映射的虚拟地址更改为合理可选的物理地址并恢复必须中止的命令,因为缺失的映射。

UNIX 能够在没有 MMU 的情况下在 68000 个处理器(包括交换)上运行,并且如果 MMU 可用于内存保护,它可以很好地利用 MMU,但是 68010 才真正拥有允许在页面错误后恢复程序的机制。

80386 在许多方面都是一个糟糕和过时的设计。但它的内置 MMU 和正确页面错误的能力使它立即更适用于类 UNIX 系统,这些系统不仅能够交换,而且能够进行页面到磁盘。

具有历史讽刺意味的是,这种对现代系统之神的硅(成熟的 MMU 和具有虚拟能力的 CPU 设计占用了相当多的芯片空间)的巨大牺牲主要由业余爱好者承担,“像 Xenix 和 OS/2 这样的大鱼最终落入了半途而废。

虽然您可以将“没有调入且未计划运行的任何内容”与“交换”相同,但它并不是真正的像“交换”的原始含义那样全有或全无的命题。

从那以后的几十年里,这种差异消失了,因为请求分页比普通交换更有用,扩展性更好,一旦必要的 CPU 和 MMU 功能变得司空见惯,它就会取代它,但与两者相关的减速和颠簸造成了类似的外观和感觉。

  • 哇哦,*那*是`fork`语义的来源吗?写时复制“共享”每个页面一开始似乎总是有点奇怪的语义,但在交换整个过程图像而不是页面的上下文中更有意义。 (8认同)
  • 嗯,是的,组合 `fork`&`exec` 基本上是零额外成本,因为内存在运行到 `exec` 之前已经包含了分叉进程映像的副本。 (5认同)