![没有虚拟内存的情况下 UNIX 多任务如何工作?](https://linux22.com/image/1285980/%E6%B2%A1%E6%9C%89%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%20UNIX%20%E5%A4%9A%E4%BB%BB%E5%8A%A1%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
如果没有虚拟内存,UNIX 多任务处理如何工作?应用程序是否仍需要自己的内存空间?或者应用程序是否必须知道现在所有可见的内存空间都是它们的?
(请注意避免混淆:“虚拟内存”是指虚拟化内存,而不是交换文件。)
答案1
在没有内存管理单元 (MMU) 提供虚拟内存的计算机上可以实现多任务和多处理。许多操作系统都支持没有 MMU 的处理器的多任务和/或多处理。我不知道 Unix 何时使用虚拟内存。
除了虚拟内存之外,Unix 还需要其他硬件来实现其多处理功能。关键是 CPU 的保护模式或管理模式,即内核模式与用户模式。
当前是否存在不使用虚拟内存的 Unix 系统?
我假设所有现代版本的 Unix 都使用 MMU。
uClinux 是 Linux 的一个版本,它不需要 MMU,也不使用虚拟内存。但不要期望它与真正的 Linux 进程之间的安全级别相同。它是用于嵌入式设备运行可信应用程序的操作系统。
C 运行时是否支持这一点?
C 编程语言不依赖于 Unix 或 Linux。它也不需要虚拟内存。C 可用于对 8 位微控制器进行编程。运行时库特定于操作系统和编译器的版本。uClinix 有适用于没有 MMU 的处理器的 C 运行时库版本。
答案2
旧版本的 Unix 通过交换实现多任务处理。当一个任务到达阻塞点(例如,等待读取)时,它将被交换到磁盘并换入另一个任务。
基本上,一次一个任务可以位于内存中,并且所有任务都映射到同一组内存位置。
“Fork”(开始新的子任务)是通过简单地换出当前任务,然后为仍在内存中的任务映像分配一个新的任务 ID 并让其继续运行(作为“分叉的”子任务)来完成的。
这种方法(最初的 Bell Unix)很简单,在原始硬件上运行得很好,但 Berkley Unix 利用较新处理器中的内存映射硬件,使多个任务可以同时在内存中执行,慢慢演变成完整的虚拟内存方案。
(我不知道Linux使用什么方案。)