早期的计算机一次只能执行一个程序。这种程序完全控制系统,并且访问所有系统资源。相比之下,现代计算机系统允许加载多个程序到内存,以便并发执行。这就要求操作系统对各种程序提供更严的控制和更好的划分。这些需求导致了进程概念的产生,即进程为执行程序,是现代分时操作系统的工作单元。
操作系统越复杂,有望为用户做的也越多。虽然它主要关注的是执行用户程序,但是也要顾及各种系统任务(这些任务留在内核之外会更好)。因此,系统会由一组进程组成:操作系统进程执行系统代码,而用户进程执行用户代码。
通过 CPU 的多路复用,所有这些进程可以并发执行。通过在进程之间切换 CPU,操作系统能使计算机更为高效。
前面说,进程是执行的程序,这是一种非正式的说法。进程不只是程序代码(文本段或代码段),通常还包含以下内容:
进程的内存结构如图 1 所示。
强调,程序本身不是进程。程序只是被动实体,如存储在磁盘上包含一系列指令的文件(经常称为可执行文件)。相反,进程是活动实体,具有一个程序计数器,用于表示下个执行命令和一组相关资源。当一个可执行文件被加载到内存时,这个程序就成为进程。
可执行文件的加载通常有两种方法:
虽然两个进程可以与同一程序相关联,但是当作两个单独的执行序列。例如,多个用户可以运行电子邮件的不同副本,或者同一用户可以调用 Web 浏览器程序的多个副本。每个都是单独进程;虽然文本段相同,但是数据、堆及堆栈段却不同。
注意,进程本身也可作为一个环境,用于执行其他代码。Java 编程环境就是一个很好的例子。在大多数情况下,可执行 Java 程序在 Java 虚拟机(JVM)中执行。作为一个进程来执行的 JVM,会解释所加载 Java,并根据代码采取动作(按本机指令来执行)。例如,如要运行编译过的 Java 程序 Program.class,我们可以输入
命令 java 将 JVM 作为一个普通进程来运行,而这个进程会在 JVM 内执行 Java 程序 Program。这个概念与模拟是一样的,不同的是,代码不是采用不同指令集,而是采用 Java 语言。