操作系统越复杂,有望为用户做的也越多。虽然它主要关注的是执行用户程序,但是也要顾及各种系统任务(这些任务留在内核之外会更好)。因此,系统会由一组进程组成:操作系统进程执行系统代码,而用户进程执行用户代码。
通过 CPU 的多路复用,所有这些进程可以并发执行。通过在进程之间切换 CPU,操作系统能使计算机更为高效。
前面说,进程是执行的程序,这是一种非正式的说法。进程不只是程序代码(文本段或代码段),通常还包含以下内容:
- 当前活动,如程序计数器的值和处理器寄存器的内容等。
- 进程堆栈(包括临时数据,如函数参数、返回地址和局部变量)和数据段(包括全局变量)。
- 堆,这是在进程运行时动态分配的内存。
进程的内存结构如图 1 所示。
图 1 内存中的进程
强调,程序本身不是进程。程序只是被动实体,如存储在磁盘上包含一系列指令的文件(经常称为可执行文件)。相反,进程是活动实体,具有一个程序计数器,用于表示下个执行命令和一组相关资源。当一个可执行文件被加载到内存时,这个程序就成为进程。
可执行文件的加载通常有两种方法:
- 双击一个代表可执行文件的图标;
- 在命令行上输入可执行文件的名称(如prog.exe或a.out);
虽然两个进程可以与同一程序相关联,但是当作两个单独的执行序列。例如,多个用户可以运行电子邮件的不同副本,或者同一用户可以调用 Web 浏览器程序的多个副本。每个都是单独进程;虽然文本段相同,但是数据、堆及堆栈段却不同。
注意,进程本身也可作为一个环境,用于执行其他代码。Java 编程环境就是一个很好的例子。在大多数情况下,可执行 Java 程序在 Java 虚拟机(JVM)中执行。作为一个进程来执行的 JVM,会解释所加载 Java,并根据代码采取动作(按本机指令来执行)。例如,如要运行编译过的 Java 程序 Program.class,我们可以输入
java Program
命令 java 将 JVM 作为一个普通进程来运行,而这个进程会在 JVM 内执行 Java 程序 Program。这个概念与模拟是一样的,不同的是,代码不是采用不同指令集,而是采用 Java 语言。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/21979.html