进程的基础概念与管理命令
进程的基础概念与管理命令
一:什么是进程:
我们都知道程序是存储在磁盘上可执行的二进制文件,那么进程就是运行中的程序(执行时,将程序加载到内存上)。
也就是说进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统进行资源分配的单位。
我们画图示意:
就比如,我们平时看到的乐谱就是程序,音乐大师演奏的过程就是所谓的进程。
二:进程与程序的差别
- 程序是一组有序的指令集合,属于静态概念。而进程是程序的一次执行过程,属于动态概念
- 进程是暂时的,而程序是永久的。进程是一个状态转换的过程,而程序可长久保存。
- 进程和程序的组成不同。进程的组成包括程序,数据,和进程控制块。
三:进程的状态与转换
①:进程的三种基本状态
- 就绪状态:进程已获取了除CPU外的所有必备资源,由于其他进程占用CPU而暂时无法运行,只需要等待CPU时所处的状态。(一个系统会将多个处于就绪状态的进程排成一个就绪队列)
- 运行状态:进程已经获取CPU,正在执行。(单CPU系统中,处于运行状态的进程只有一个,而多CPU系统中,同时有多个处于运行状态的进程)
- 阻塞状态:正在执行的进程由于某种原因而暂时无法继续运行,则放弃运行,处于暂停状态,即进程运行受阻。(这种状态又称等待状态或者*状态)
通常导致进程受阻的典型情况有:请求I/O,申请缓冲空间等。
另外,在实际系统中,由于管理需要,所以还会有两种常见状态:创建状态和终止状态。
创建状态:进程有了PCB,但是所需的其他必要资源还没有分配,进程自身还未进入主存,进程还不能够被运行。
终止状态:进程完成后,首先需要等待操作系统进行善后事宜,然后讲其PCB清除,并将PCB空间返还系统。
②:进程状态转换
- 就绪状态 ===》运行状态:就绪状态的进程被进程调用程序选中,分配到CPU中运行,则由就绪状态转换为运行状态。
- 运行状态 ===》就绪状态:为处于运行状态的进程分配的时间片用完了,则让出CPU,让下一个进程上,自身由运行状态转换为就绪状态。
- 运行状态 ===》阻塞状态:例如正在运行的进程提出了I/O请求,则由运行状态转换为阻塞状态。
- 阻塞状态 ===》就绪状态:例如请求I/O操作完成后,则由阻塞状态转换为就绪状态,重新排队等待CPU的调度。
我们看一看状态转换图:
③:进程的类型
- 系统进程:操作系统用来管理资源的进程,当系统进程处于运行状态时,CPU处于管态,系统进程之间的关系由操作系统负责。
- 用户进程:操作系统可以独立执行的用户程序段,当用户进程处于运行状态时,CPU处于目态,用户进程之间的关系由用户负责。
大多数计算机系统将CPU执行状态分为管态和目态,那么什么是管态以及目态呢?
- 管态又称为特权状态、系统态或核心态。通常,操作系统在管态下运行。
- 目态又叫做常态或用户态,用户程序只能在目态下运行,如果用户程序在目态下执行特权指令,硬件将发生中断,由操作系统获得控制,特权指令执行被禁止,这样可以防止用户程序有意或无意的破坏系统。
- 从目态转换为管态的唯一途径是中断。
四:进程控制块(PCB)
在Linux系统上,如何表示一个进程:
/proc(虚拟目录):这个目录中是以进程为单位存储内存的映射
操作系统为了唯一标识一个进程,会为进程分配一个PID,唯一标识这个进程。
那么这个PID在哪呢?
那么这个时候我们就要了解一下进程的结构组成了。
①:进程的三个组成部分:
- 程序
- 数据
- 进程控制块(PCB)
其中最重要的当属进程控制块PCB,所以我们这里详细了解一下PCB。
进程控制块(PCB):为了管理和控制进程,系统在创建每个进程时,都为其开辟一个专用的存储空间,用来记录它在系统中的动态特性,系统根据这块存储区的信息对其进行控制管理。进程任务完成后,系统会回收该存储区,进程随之消亡,这一存储区就是进程控制块。
重点:系统根据PCB来感知一个进程的存在,所以PCB是进程存在的唯一物理标识。
②:进程控制块(PCB)的内容
- 标识符pid:操作系统对进程的唯一标识,用来区分其他进程。
- 状态state:可以是new、ready、running、waiting或blocked等。
- 优先级priority:优先级用于区分各种进程运行的先后顺序,为了给CPU调度提供支持。
- 程序计数器:程序中即将执行的下一条指令的地址
- 程序上下文:进程是需要切换的,切换进程时需要保留进程的上下文,以防进程切换时丢失现场数据,不知进度了。
重要性:
进程控制块(PCB)是操作系统为支持多进程并提供多重处理技术的关键。
所以有时进程进行切换时,PCB就可以保证进程在恢复后,像从未中途切换过一样。
所以我们经常说:PCB是进程存在的唯一标识。
五:进程控制块的组织形式
系统中,有着不同状态的进程,为了方便调度和管理,常将进程控制块(PCB)用适当的方式组织起来。
①:线性结构
把所有不同状态的进程PCB组织在一个表格中。
②:索引结构
分别把具有不同形态的进程PCB组织成一个表,于是就有了就绪进程表、运行进程表,以及各种等待事件的阻塞进程表。
③:链式结构
采用队列形式时,每个进程PCB中要增加一个链指针表项,指向队列的下一个进程PCB的起始位置。
为了对这些队列进行管理,操作系统需要做三件事:
- 把处于同一状态的进程PCB通过各自队列的指针表项链接在一起,形成队列。
- 为每一个队列设立一个对头指针,总是指向队首的PCB。
- 排在队尾的PCB的指针表项内容应该是“-1”或者是一个特殊符号,表示这是队尾的PCB。
六:前台进程、后台进程、守护进程
- 前台进程:直接与用户交互,用户是可以直接看到的。
- 后台进程:用户无法直接看到,但是前台进程与后台进程是可以相互转换的。
- 守护进程:是一种特殊的后台进程,它独立于控制终端,并且周期性的执行某种任务,或等待处理某些发生的事件,它只能在后台运行。
七:进程管理命令
㈠:查看进程
①:ps:仅仅显示与当前终端相关的进程
- -e 显示系统所有的进程
- -f 显示进程的详细信息
②:top:实时显示进程的状态
③:也可以通过管道命令“|”与“grep”过滤,将前一个命令的结果流向后一个命令。
④:也可以通过jobs显示后台执行的任务。
㈡:启动进程
进程的运行方式:
- ./main 前台运行
- ./main & 后台运行
㈢:关闭进程
前台运行可以通过“Ctrl + c”终止进程,也可以通过“kill pid”终止指定的进程。
㈣:挂起进程
我们可以通过“kill -stop pid”命令将指定的进程挂起。
也可以通过“Ctrl + z”挂起正在前台执行的进程。
㈤:前台进程与后台进程的切换
jobs:显示后台执行的任务
fg + pid:将挂起的进程或者后台执行的进程放到前台执行
bg + pid:将挂起的进程放到后台执行
至此,我们将进程的基础了解完毕。