考研党修行——进程的自述
1.知识总览
2.进程的引入
当我们打开电脑的任务管理器时,实际上我们可以看到有许多进程正在运行,比如我的电脑此时正在运行百度网盘,Edge以及任务管理器。这些程序的执行过程实际上就引入了进程的概念。那问题来了,百度网盘不是应用程序吗?进程又是什么?
解决这个问题,那我们先区分什么是程序?什么是进程?
程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。比如在Windows中就是以后缀为.exe的可执行文件。
进程(process):是动态的,是程序的一次执行过程。
同一个程序多次执行会对应多个进程
3.进程的组成部分——PCB
那么既然操作系统是这些进程的管理者,它要怎么区分各个进程呢?
答案是当进程被创建时,操作系统会为该进程分配一个唯一的,不重复的“身份证号”——PID(process id,进程id)
(1)操作系统要记录PID,进程所属用户ID(UID),操作系统可以根据PID,UID这些基本的进程描述信息,让操作系统区分各个进程。
(2)操作系统要记录给进程分配了哪些资源(如:分配了多少内存,正在使用哪些I/O设备,正在使用哪些文件),这些信息可以用于实现操作系统对资源的管理。
(3)操作系统要记录进程的运行情况(如:CPU使用时间,磁盘使用情况,网络流量使用情况等),这些信息可以实现操作系统对进程的控制,调度。
既然操作系统要记录这么多信息,那该如何整理呢?其实这些信息都被保存在一个数据结构PCB(process control block)中,即进程控制块。总之,操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中。
PCB是进程存在的唯一标志,当进程被创建时,操作系统为其创建PCB,当进程结束时,会收回其PCB。
4.进程的组成部分——程序段和数据段
这里需要明确的是PCB是给操作系统用的;而程序段,数据段是给进程自己用的。
5.什么是程序的运行?
我们回顾之前的知识,程序是如何运行的?我们知道程序在运行之前,都需要通过编译器将代码“翻译”成二进制的机器指令,一条高级语言的代码翻译过来可能会对应多条机器指令。那么程序运行的过程其实就是CPU执行一条一条的机器指令的过程。
更深入的理解,当我们写完一个程序之后,经过编译链接等等一系列的步骤,最终会形成一个后缀为.exe的可执行文件(Windows系统),这个可执行文件一直是存放在硬盘当中的,在系统运行这个可执行文件前需要把程序放入内存中,同时操作系统会为其创建相应的PCB,以及其一些程序段也会调入内存中,我们知道程序段中包含了一条一条的指令,我们的CPU就是从内存中取出这些指令。此外,程序是基于代码的,那代码的一些运算结果同样需要被调用。换句话说,数据段也要被调入到内存之中,数据段包含了运行过程中产生的,需要使用的各种数据,比如我们定义了某些变量,就是包含在数据段里的。
总结:一个进程的实体(进程映像)是由PCB,程序段,数据段组成的
进程是动态的,进程实体(进程映像)是静态的
我们可以把进程实体理解为进程在执行过程中某一时刻的快照;进程实体反应了进程在某一时刻的状态(如:x++后,x=2)
6.进程的深度解读
注意:PCB是进程存在的唯一标志!
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。所谓调度,是指操作系统决定让这个进程上CPU运行。
7.进程的特征
注意:
(1)进程是动态的,动态性是进程最基本的特征
(2)异步性会导致并发程序执行结果的不确定性
8.小节概述