学习路线:
一、进程的概念及组成
我们通过一个例子来说明进程的概念以及程序和进程的区别。
我们在Windows操作系统中打开任务管理器,在任务管理器当中能看到此时系统当中运行的进程有哪些,如下图所示:
此时,如果我想要使用QQ的话,我打开我的QQ应用程序,于是我的QQ程序就开始运行,相应的在进程这一栏里我会看到和QQ相关的一个条目,如下图所示:
而如果说此时我想要同时登录两个甚至三个QQ,那我可以再打开两次QQ程序,那在这个时候会发现进程这一栏里QQ相关的条目出现了三条,如下图所示。也就是说,在系统当中,此时有三个QQ进程正在运行,虽然说这三次我打开的都是.exe程序,但是这个程序的三次执行会对应三个不同的进程。
那么接下来我们便可以给出程序和进程这两个概念到底是什么了?
程序:是静态的,就是存放在磁盘里的可执行文件,就是一系列的指令集合。
进程(Process) :是动态的,是程序的一次执行过程。
注意:同一个程序多次执行会对应多个不同的进程。那么就有一个问题,即:操作系统是这些进程的管理者,它要怎么区分各个进程?
答案:当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的“身份证号” -- PID(Process ID,进程ID)。
操作系统除了要记录进程的PID【可以让操作系统区分各个进程】之外,还要记录给进程分配了哪些资源【可用于实现操作系统对资源的管理】(如:分配了多少内存、正在使用哪些I/O设备、正在使用哪些文件),还要记录进程的运行情况【可用于实现操作系统对进程的控制、调度】(如:CPU使用时间、磁盘使用情况、网络流量使用情况等)。
上述的这些信息都被保存在一个数据结构PCB(Process Control Block)中,即进程控制块。操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中。PCB中可包括的信息如下图所示:
除了PCB之外,进程还有两个很重要的组成部分,即程序段、数据段,如下图所示:
PCB是给操作系统用的;程序段、数据段是给进程自己用的。
结合上面的知识,我们分析程序是如何运行的?
程序在运行之前需要编译成二进制的机器指令,如下图所示:
程序执行的过程,其实就是CPU执行一条一条指令的过程,如下图所示:
那接下来我们把程序运行的过程再进一步细化一下:
我们把程序写完之后,经过编译链接等操作,最终会形成一个可执行文件,例如Windows系统下的.exe可执行文件,这个可执行文件一般存放在硬盘当中,这个可执行文件当中保存的其实是上图中一系列的二进制指令,而在这个程序运行之前,需要将其从硬盘读入到内存当中,并且操作系统要建立一个与他相对应的进程,在建立进程的过程中,操作系统会为其建立一个PCB,该可执行文件中所存放的一系列二进制指令也需要读入到内存之中,这一系列的指令序列我们将其称之为程序段。
程序【指可执行应用程序】执行的过程或者说这个进程执行的过程,就是CPU从内存当中读入这些一条一条的二进制指令然后来执行这些指令。
在我们编写的程序当中,我们定义了一些变量,这些内容也需要放入内存当中,这就是数据段。
进程是动态的,进程实体(进程映像)是静态的。进程实体反映了进程在某一时刻的状态(如:x++后,x=2)。
因此,更确切的说,进程实体(进程映像)由PCB、程序段、数据段这三部分组成。
定义:
程序段、数据段、PCB三部分组成了进程实体(进程映像)。
引入进程实体的概念后,可把进程定义为:
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
来自百度:
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
注意:PCB是进程存在的唯一标志!
问题:若同时挂三个 QQ 号,那么三个不同的进程的PCB、程序段和数据段是否不同?
答案:同时挂三个QQ号,会对应三个QQ进程,它们的PCB、数据段各不相同,但程序段的内容都是相同的(都是运行着相同的QQ程序)。
二、进程的特征
程序是静态的,进程是动态的,相比于程序,进程拥有以下特征:
动态性是进程最基本的特征。
异步性会导致并发程序执行结果的不确定性。