没有虚拟内存的 UNIX 多任务是如何工作的?

And*_*ehm 7 unix virtual-memory

UNIX 多任务处理在没有虚拟内存的情况下如何工作?应用程序不是仍然需要自己的内存空间吗?或者应用程序是否必须知道现在所有可见的内存空间都是他们的?

(注意避免混淆:“虚拟内存”是指虚拟化内存,而不是交换文件。)

Dan*_*cks 5

旧版本的 Unix 通过交换进行多任务处理。当任务到达阻塞点(例如,等待读取)时,它将被换出到磁盘并换入另一个任务。

基本上一次一个任务可以在内存中,并且所有任务都映射到同一组内存位置。

“分叉”(启动新的子任务)是通过简单地换出当前任务,然后为仍在内存中的任务映像分配一个新任务 ID 并让它继续运行(作为“分叉”子任务)来完成的。

这种方法(最初的 Bell Unix)很简单,并且在原始硬件上工作得很好,但是 Berkley Unix 利用较新处理器中的内存映射硬件来使多个任务同时在内存中,慢慢演变成一个完整的虚拟内存方案。

(我不知道 Linux 使用什么方案。)


saw*_*ust 2

多任务和多处理可以在没有内存管理单元(MMU)来提供虚拟内存的计算机上完成。有许多操作系统支持没有 MMU 的处理器的多任务和/或多处理。我不知道Unix什么时候使用了虚拟内存。

除了虚拟内存之外,Unix 还需要实现其多处理功能,还需要其他硬件要求。关键是CPU 的保护模式或管理模式,即内核模式与用户模式。

当前是否有不使用虚拟内存的 Unix 系统?

我假设所有现代版本的 Unix 都使用 MMU。

uClinux是一个不需要MMU并且不使用虚拟内存的Linux版本。但不要指望进程之间具有与真实 Linux 相同的安全级别。它是一种供嵌入式设备运行可信应用程序的操作系统。

C 运行时是否支持这一点?

C 编程语言与 Unix 或 Linux 无关。它也不需要虚拟内存。C 可用于对 8 位微控制器进行编程。运行时库特定于操作系统和编译器的版本。uClinix 有一些版本的 C 运行时库适用于没有 MMU 的处理器。