尽管任意时刻会有许多进程同时运行,但每个进程都觉察不到系统有其他进程在运行。实际上,在没有显式代码的情况下,一个进程无法与另一个进程交互,也不能对其行为产生影响。 操作系统为每个进程提供了一段可操作的内存,我们称之为进程的地址空间。地址空间是动态的,它在进程执行期间随其内存分配而发生变化。如果一个进程试图读/写其地址空间外的内存地址,操作系统通常会将其终止,并通知用户该应用程序已经崩溃。 尽管受保护的内存并非新生事物,但也是近十年才出现在用户的桌面系统中。在Mac OS X之前,Mac OS 9上运行的进程可以读/写任何内存地址,即使该地址是由另一个进程分配的缓冲区或属于操作系统本身。 没有内存保护,应用程序可以绕过操作系统,直接修改不同进程的内存和变量(无论是否得到该进程的允许),以实现进程间的通信。对操作系统结构来说也是如此。例如,Mac OS 9有一个内部全局变量,它包含每个打开的GUI窗口链表。尽管该链表名义上由操作系统拥有和操作,但实际上应用程序无须对操作系统进行任何调用,就可以遍历和修改该链表。 没有内存保护,操作系统容易受用户应用程序中bug的影响。应用程序在有内存保护的系统上运行时,最坏的情况是损坏自身的内存和结构,但这种损坏仅局限于应用程序本身。在没有内存保护的系统上(如Mac OS 9),应用程序中的程序错误还有可能覆盖操作系统的内部结构,使系统完全崩溃,需要重启才能恢复。 请注意,在现代操作系统(如Mac OS X)中,内核都拥有自己的地址空间。在这种情况下,它可以独立操作所有运行的进程。在Mac OS X上,一个地址空间可以同时用于内核和所有加载的内核扩展。这意味着没有相应的措施保护操作系统核心结构不被有问题的驱动程序无意覆盖。用户进程可以轻易中止,但如果内核中也发生同样的情况,整个系统就会出现故障,必须重启计算机才能解决问题。这类错误在Mac OS X上表现为内核恐慌,即Windows上的“蓝屏死机”。为此,内核扩展开发者必须审慎使用内存管理,保证所有的内存访问都有效。