什么是进程
早期的计算机一次只能执行一个程序。这种程序完全控制系统,并且访问所有系统资源。相比之下,现代计算机系统允许加载多个程序到内存,以便并发执行。这就要求操作系统对各种程序提供更严的控制和更好的划分。这些需求导致了进程概念的产生,即进程为执行程序,是现代分时操作系统的工作单元。
操作系统越复杂,有望为用户做的也越多。虽然它主要关注的是执行用户程序,但是也要顾及各种系统任务(这些任务留在内核之外会更好)。因此,系统会由一组进程组成:操作系统进程执行系统代码,而用户进程执行用户代码。
通过 CPU 的多路复用,所有这些进程可以并发执行。通过在进程之间切换 CPU,操作系统能使计算机更为高效。
前面说,进程是执行的程序,这是一种非正式的说法。进程不只是程序代码(文本段或代码段),通常还包含以下内容:
进程的内存结构如图 1 所示。
图 1 内存中的进程
强调,程序本身不是进程。程序只是被动实体,如存储在磁盘上包含一系列指令的文件(经常称为可执行文件)。相反,进程是活动实体,具有一个程序计数器,用于表示下个执行命令和一组相关资源。当一个可执行文件被加载到内存时,这个程序就成为进程。
可执行文件的加载通常有两种方法:
虽然两个进程可以与同一程序相关联,但是当作两个单独的执行序列。例如,多个用户可以运行电子邮件的不同副本,或者同一用户可以调用 Web 浏览器程序的多个副本。每个都是单独进程;虽然文本段相同,但是数据、堆及堆栈段却不同。
注意,进程本身也可作为一个环境,用于执行其他代码。Java 编程环境就是一个很好的例子。在大多数情况下,可执行 Java 程序在 Java 虚拟机(JVM)中执行。作为一个进程来执行的 JVM,会解释所加载 Java,并根据代码采取动作(按本机指令来执行)。例如,如要运行编译过的 Java 程序 Program.class,我们可以输入
操作系统越复杂,有望为用户做的也越多。虽然它主要关注的是执行用户程序,但是也要顾及各种系统任务(这些任务留在内核之外会更好)。因此,系统会由一组进程组成:操作系统进程执行系统代码,而用户进程执行用户代码。
通过 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 语言。所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算