文章目录
进程的由来(1⭐)
程序并发执行的特征(解释为何失去了封闭性)
间断性
程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,这些并发执行的程序之间形成了相互制约的关系。
如图所示I、C、P是三个互相合作的程序。当计算程序Ci-1完成计算时,如果输入程序Ii尚未完成数据输入,,则计算程序Ci就无法进行数据处理,此时必须暂停执行。
失去封闭性
系统中存在多个可以并发执行的程序时,系统中的各种资源将为它们所共享,而这些资源的状态也会由这些程序来改变,致使其中任一程序在执行时,其执行环境必然会受到其他程序的影响。
不可再现性
程序并发时,失去封闭性会导致失去可再现性。
例如程序A和B,共享变量N。
// 程序A
N = N +1;
// 程序B
printf("%d",N);
N = 0;
执行种可能有几种结果
-
A程序在B之前执行
-
N = n+1
-
输出N = n+1
-
N = 0
-
-
B在A前
-
输出N = n
-
N = 0
-
N = 1
-
-
N+1在printf和N=0之间执行
-
输出N = n
-
N = n+1
-
N = 0
-
进程概念的由来
多道程序环境下,程序的执行属于并发执行,因此它们会失去封闭性,并具有间断性和运行结果不可再现性。
通常,程序是不能参与并发执行的,否则程序就失去了意义。
为了使得程序可以并发执行,并且可以对并发执行的程序加以描述和控制,所以人们在OS中引入了“进程”这个概念。
PCB
Process Control Block
系统利用进程控制块来描述进程的基本情况和活动过程,进而控制和管理进程,是进程存在的唯一标识。
进程控制块信息
进程的概念/描述(2⭐)
进程的定义
从不同的角度可以有不同的定义
- 进程是程序的一次执行。
- 进程是一个程序及其数据在处理机上顺序执行所发生的活动。
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位(最小单位)。
引入进程的概念后,我们可以把传统OS中的进程定义为:
进程是程序的执行过程,是系统进行资源分配和调度的一个独立单位。
进程的特征
进程和程序是不同的概念,除了进程具有程序所没有的PCB结构外,还具有下面一些特征:
动态性(最基本)
进程的实质是程序的执行过程。
进程有一定的生命期:进程由创建产生,由调度而执行,由撤销而消亡。
并发性
多个进程共存于内存中,且能在一段时间内同时执行。
引入进程也正是为了使进程能和其他进程并发执行。
而没有建立PCB的程序是不能参与并发执行的。
独立性
进程是一个能够独立运行、独立获取资源、独立接收调度的基本单位。
没有建立PCB的程序都不能作为一个独立的单位参与并发执行。
异步性
进程按各自独立的、不可预知的速度向前推进。
总结:程序经过多次执行后,虽然多次执行时的环境和初始条件相同,但得到的结果却各不相同。
进程的状态(3⭐)
为什么要引入状态
由于多个进程在并发执行时需要共享资源,它们会在执行过程中呈现间断性规律,因此,进程在其生命周期内可能具有多种状态。
三大基本状态
就绪(Ready)
此时进程已分配到除CPU以外的所有必要资源,只要获得CPU后,便可立即执行。
如果系统中有多个就绪进程,通常它们按照一定的策略*(e.g. 优先级策略)排成队列,则该队列就成为就绪队列*。
执行(Running)
在单处理系统中,只有一个进程处于执行状态。
多处理机系统中,则可能会有多个进程处于执行状态。
阻塞(Block)
由于发生某事件*(e.g. I/O请求、申请缓冲区失败)而暂时无法继续执行,即进程的执行收到了阻塞。
此时会引发进程调度,OS会把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态(又称阻塞状态、等待状态或封锁状态)。
通常系统会将阻塞状态的进程排成一个队列,则该队列就成为阻塞队列*。
在较大的系统中,为了减少阻塞队列的操作开销,提高系统效率,则会设置多个阻塞队列。
创建状态和终止状态
为满足PCB对数据与操作的完整性要求和增强管理灵活性,则通常会引入这两种状态。
创建状态
进程进程一般要通过多个步骤才能完成
- 进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息。
- 为该进程分配运行时所需的资源。
- 把该进程状态转换为就绪状态,并将其插入到就绪队列中。
如果进程所需的资源不足,此时进程将不能被调度运行,此时进程所处的状态称为创建状态(新建状态)。
终止状态
- 等待OS善后处理。
- 将进程的PCB清零,并将PCB空间返还给OS。
进程进入终止状态后,OS中依然会保留一个记录,保存状态码和一些计时统计数据以供其他进程收集。
进程状态的转换(5⭐)
进程挂起(1⭐)
挂起状态引入的原因
终端用户的需要
终端用户发现自己的程序在运行时有可疑问题,希望暂停程序运行,以便用户研究其执行情况或对其进行修改。
父进程的需要
父进程有时候需要考察和修改子进程,协调各子进程间的活动。
负荷调节的需要
实时系统工作负荷较重时,可能会影响到对实时任务的控制,系统可以将不重要的进程挂起,保证自身的运行正常。
操作系统(OS)的需要
OS有时需要挂起进程,以便检查进程运行过程中资源使用情况或进行记账。
进程挂起状态图(3⭐)
实现进程通信的方式
共享存储器
相互通信的进程通过共享某些数据结构或存储区来进行通信,可分为
- 共享数据结构方式
仅适用于传送相对较少的数据,通信效率低下,属于低级进程通信。 - 共享存储区方式
属于高级进程通信。
管道(共享文件)
利用共享文件来实现进程间的通信。
消息传递
进程间的消息交换以消息或报文为单位,程序员利用一组通信**命令(原语)**来实现通信,可分为
- 直接通信方式
- 间接通信方式
常用原语
- 创建、撤销原语
- 阻塞(Block)原语,由执行到阻塞状态。
- 唤醒(Wake Up)原语,由阻塞到运行状态。
线程
拥有资源所有权的称为进程,而调度的最小单位称为线程,或轻量级进程。
进程是资源独立占有的单位。