文章目录
- 第二章 进程管理
- 进程的概念、组成、特征
- (一)进程的概念
- (二)进程的组成——PCB
- (三)进程的组成——程序段、数据段
- 补充:程序是如何运行的?
- (四)进程的特征
- 小结
第二章 进程管理
进程的概念、组成、特征
进程的
概念
理解“进程”和“程序”的区别
组成
一个进程由哪些部分组成
特征
进程有哪些重要的特征
首先认识一个新的概念:进程。
第一章中,我们经常会说,程序……,偶尔才会提到进程。不要把程序和进程这两个概念混淆了,一会儿会介绍。
(一)进程的概念
打开Windows系统的任务管理器,可以看到,系统中现在正在运行的进程有这么多。
如果打开了QQ程序,QQ会启动,同时在进程里,可以看到有一条和QQ相关的条目。
而此时,如果我想要登录两个、三个QQ。
这时会发现,进程栏里,QQ相关的条目,出现了3条,表示系统中有3个QQ进程正在运行。
虽然说,这三次我打开的都是QQ.exe
这个程序,但是这一个程序的三次执行,会对应三个不同的进程。
-
程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
-
进程(Process):是动态的,是程序的一次执行过程。
同一个程序多次执行会对应多个进程。
现在问题来了,既然这3个是不同的进程,但是它们执行的是同一个相同的程序。操作系统作为这些进程的管理者,怎么区分各个进程?不能都称之为“QQ进程”吧。
(二)进程的组成——PCB
问题:操作系统是这些进程的管理者,它要怎么区分各个进程?
解决方法:当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的“身份证号”——PID(Process ID,进程ID)
打开任务管理器,可以看到各个进程的PID,按照递减次序排列一下,很容易可以看出,每个进程的PID都是不重复的。
此时,我再打开一个Google Chrome,再打开一个网易云音乐。
可以发现,进程列表中多了两者的进程信息,其PID分别为17184、17872。
此时,我把这两个程序退出,然后重新再次打开。
可以看到,它们的PID又发生了变化,分别为18464、18224。
可见,我们每新建一个进程,都会给它分配一个不重复的、唯一的ID。
总之,再回到我们刚才的问题。我们运行的三个QQ进程,它们虽然都叫“腾讯QQ(32位)(2)”,但是它们背后各自有不同的PID
此外,刚刚的图中,每个进程的详细信息除了PID还有创建者(UID)、分配了多少内存、对I/O设备的使用情况等,操作系统会根据这些进程的各个信息,为其执行相应的管理策略。
操作系统要记录PID、进程所属用户ID(UID)——基本的描述信息,用来区分各个进程。
还要记录给进程分配了哪些资源(如:分配了多少内存、正在使用哪些I/O设备、正在使用哪些文件)——用于实现操作系统对资源的管理。
还要记录进程的运行情况(如:CPU使用时间、磁盘使用情况、网络流量使用情况等)——用于实现操作系统对进程的控制、调度。
既然操作系统要在背后为每一个进程记录这么多信息。那么这些信息,都会被统一地放在一个叫做PCB(Process Control Block)的数据结构当中,即进程控制块。
操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中。
所以,PCB是一个很重要的结构,它是进程存在的唯一标志,当一个进程被创建时,操作系统也会为它创建相应的PCB;而当一个进程结束的时候,操作系统就会回收它的PCB。
操作系统对进程进行管理工作所需的信息都存放在PCB中,PCB中的信息大致可按如下分类。(我们想要认识PCB当中每一个属性,是不可能的,也没必要)
(三)进程的组成——程序段、数据段
除了PCB之外,进程还有两个很重要的组成部分:程序段、数据段。
刚才说过,PCB是给操作系统用的一个数据结构。而程序段、数据段其实是给进程自己用的。
补充:程序是如何运行的?
第一章当中就讲过这个问题,此处再进行扩充。
程序要想运行,需要编译成二进制的指令。然后对这一条条的指令,再依次上CPU运行。
此处,我们把程序运行的过程,再进一步细致讨论一下。
我们的高级语言程序,经过一系列的编译、链接的步骤,最终会形成一个可执行文件(如Windows电脑里就是.exe
文件),这个可执行文件平时是保存在硬盘当中的。这个可执行文件里面保存的其实就是我们刚才说的那一系列的指令序列。
而当程序要运行之前,需要把它从硬盘读入到内存当中,并且操作系统会建立一个与它相对应的进程。
经过刚才的学习,我们知道,建立一个对应的进程,那么它会建立相对应的PCB。
除了PCB之外,这个程序的那一系列指令序列也需要读入内存当中。这一系列指令序列,我们把它称为程序段。那么,这个程序执行的过程,或者说这个进程执行的过程,其实就是CPU从内存当中读入这样一条条的指令然后来执行这些指令。
除了执行这些指令之外,其实在执行指令的过程当中,会有一些“中间的数据”,比如int x; x++;
,我们就定义了一个变量x。那么这些变量的内容,肯定也需要放在内存当中。所以还会有另外一个叫作数据段的区域,用来存放这个程序运行过程当中所产生的、所需要使用的各种数据。
所以,一个进程实体(进程映像)由PCB、程序段、数据段组成。
我们之前一直在说:进程由哪些部分组成。但是更严格的来说,应该是:一个进程实体(进程映像)由哪些部分组成。进程是动态的,进程实体是静态的。如何理解?我们可以把进程实体理解为这个进程在动态执行过程中某一时刻的一个快照,进程实体可以反映这个进程在某一时刻的状态(如:x++;
后,x=2)。
进程是动态的,进程实体(进程映像)是静态的。
进程实体反映了进程在某一时刻的状态。
程序段、数据段、PCB三部分组成了进程实体(进程映像)。
更确切的说,应该是“进程实体(进程映像)的组成”。不过,除非专门考察进程与进程实体的区别,不然也没必要去抠这个字眼。
PCB是给管理者,也就是给操作系统用的。
而程序段、数据段里面的内容,是给进程自己用的,与进程自身的运行逻辑有关。
所以在引入了进程实体的概念之后,我们可以把进程定义为:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
进程是一个资源分配的独立单位,也很好理解,从刚才我们看的任务管理器的进程列表里面,很清楚的可以看到,操作系统就是以进程为单位,给各个进程分配资源的,如内存。
还涉及到一个进程的“调度”。其实所谓的调度,就是指,操作系统决定让哪个进程上CPU运行。进程调度相关的内容会在之后的小节中进一步学习。
一个程序运行多次,会对应多个进程。如果我们同时挂三个QQ号,那么这三个QQ进程,它们的PCB、数据段是各不相同的。PCB不相同很好理解;而数据段不相同,是因为,我们这三个QQ号,它涉及的一些信息、数据都是存放在数据段当中的,肯定是不相同的。但是,这三个QQ进程背后,它们的程序段的内容是相同的,因为它们执行的是相同的QQ程序。
PCB是进程存在的唯一标志。
(四)进程的特征
程序是静态的,进程是动态的,相比于程序,进程有以下特征:
动态性是进程最基本的特征。
异步性会导致并发程序执行结果的不确定性。各进程独立、不可预知,但有时我们又必须让几个进程之间相互配合、协调着进行。具体会在后面“进程同步”相关部分进一步学习。
所有的这些特性,都不要死记硬背,而是理解。