这篇文章我们详细说下进程的组成、状态及特点。
进程线程概念全解析二 - 进程的组成、状态、特点
进程的组成主要包括三大部分:PCB、程序段与数据段。程序段和数据段比较好理解,程序段就是当前正在执行的程序代码,而数据段则是在运行时动态产生的数据,比如全局变量等。我们已经知道,进程是操作系统用于实现多道程序并发执行而产生的,操作系统为了管理和控制进程的运行,需要记录一些信息,这些用于存放进程的管理和控制信息的数据结构就是 PCB(Process Control Block)。
从 PCB 的定义可以看出,它实际上是一种数据结构,而存放的是一些管理信息。主要包括如下信息:
通常我们所说的创建进程,其他就是创建 PCB,而销毁进程,即销毁 PCB。一般来说,进程的创建步骤如下:
进程创建在不同的操作系统里方法也不一样。UNIX 将进程创建分为两个步骤,第 1 步是 fork,创建一个与自己完成一样的新进程;第 2 步是 exec,将新的进程的地址空间用另一个程序的内容覆盖,然后跳转到新程序的起始地址,从而完成新程序的启动。而 Winkdows 使用一个系统调用(CreateProcess)就可以完成进程创建,在调用时把要执行的程序名称作为参数传入,创建新的页表,而不需要复制别的进程。
这里进程的创建其实也可以理解为进程的复制或创建子进程。过程是一样的。下面以 Python 代码为例,实现创建进程:
import os
print(f'Main Process ({os.getpid()}) start...')
pid = os.fork()
if pid==0:
print(f'I am child process ({os.getpid()}) and my parent is {os.getppid()}.')
else:
print(f'I ({os.getpid()}) just created a child process ({pid}).')
# 运行结果,运行时 pid 数值可能不一样
# Main Process (15174) start...
# I (15174) just created a child process (15175).
# I am child process (15175) and my parent is 15174.
进程一般分为三种状态:就绪、阻塞和运行。在 3 种状态之间可以进行转换,但并不是两两状态均可以转换的,可以转换的有如下几种:
这三种状态是比较典型的进程状态分类方式,但并不是唯一的分类方式,许多商业操作系统的进程状态不止 3 个。不管如何做分类,其目的都是便于操作系统管理进程。是否细分的唯一依据就是是否对管理有利。
进程,表示是当前正在运行的进程实体(也可以理解为程序代码),“正在运行”体现了进程一个很重要的特征,那就是动态性。
其次,我们都知道多进程并发,一个时间段是允许多个程序并发执行的,所以进程还具有并发性。
另外,每个进程都有独立的 PCB 来管理相关信息,所以每个进程都是独立的个体,且是有有结构的个体。即独立性与结构性。
最后,进程在并发执行时,每个进程是独立的,以不可预知的顺序和速度向前推进的,因此还具有异步性,这也引出在某些情况下需要使用进程同步机制来解决异步带来的问题。
本小节介绍了进程组成相关知识点,我们需要知道: