引言
学到第三章,就正式步入我们OS的大门了
本章我们将围绕以下几个问题去解决
- 什么是进程?
- 进程状态有哪些?
- 进程如何描述?
- 进程如何控制?
本节内容主要是回答前两个问题,第二节回答后两个问题。
进程
众所周知,硬件家族过于庞杂,以CPU为例,我们熟知的电脑端有Intel和AMD,当然手机有麒麟和骁龙等,各大厂商产品标准不一,差异很大。如果说,我们的程序开发要适配这么多的硬件,为每一种硬件开发一种应用可想而知得多难(从上而下)。
根据所学,我们都知道OS是操作和协调各种硬件,为上层应用提供服务的一个“大管家”。
于是,为了给上层应用提供服务的统一和便利,OS解决了硬件适配的问题。程序开发者就只需要向OS去申请和释放资源就可以实现对底层硬件的控制了。
我们换一个角度,从OS的视角来看,我为上层应用提供了统一的接口,但是程序成千上万,我不可能对每一种特定的程序开发一种管理模式(自下而上)。于是,OS引入了进程,它是对正在运行的程序过程的抽象,即不管是什么样的程序,只要是在OS下运行的程序过程统称为“进程”。
进程的定义
可并发执行的程序在某个数据集合的一次计算活动,是操作系统进行资源分配和保护的基本单位。
从上面的定义可知,进程是OS资源分配和保护的基本单位。它为上层应用服务的时候,是以进程为基本单位的。一个程序往往对应着一个进程。
这样自然引入多进程,提高了对硬件资源的利用率,但又带来额外的空间和时间开销,增加了OS 的复杂性。
必要元素
一个进程至少要有程序代码和与之相关的数据集合组成。
- 程序代码(Program code):有可能与其他执行同一个程序的进程共享,比如打开多个QQ.exe
- 与代码相关的数据集合(A set of data associated with that code):包括进程向OS申请的各种资源,比如处理机
进程和程序
- 程序(Program):是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
- 进程(Process):是动态的,是程序的执行过程。
举个简单的例子,如果说我们打开了QQ,那么OS就会为QQ创建一个进程,如果说QQ需要传输文件,那么OS就会把文件和网络资源给到QQ对应的进程,至于QQ怎么使用这些资源那是另外一回事了。当我们打开多个QQ.exe(静态),需要登录多个账号的QQ时,此时OS就会为我们创建多个进程分别管理每一个QQ(动态)。
进程状态
两个基本状态
每个程序运行很难一气呵成的完成(同时有I/O,网络报文等),进程都是在OS的调度下交替进行,所以从这个角度来说,进程可分成两种状态。
- Running运行状态:占用处理机资源;
- Not-running未运行状态:等待进程调度分配处理机资源;
其中 - dispatch :从等待进程队列中选择一个进程(要求已完成I/O操作),进入运行状态
- pause:用完时间片或启动I/O操作后,放弃处理机,进入等待进程队列
进程由OS的分派程序分派到CPU,然后回到队列,反复直到任务完成
本质上就是不同进程的PCB(Process Control Block,即进程控制块)这个结构体在排队。
进程的创建和终止
如图所示,有四种创建和终止进程的方式,简单了解一下即可
三状态模型
有三个基本状态:就绪(Ready),阻塞(Blocked)和运行(Running)态,这三个状态是后面多状态模型的核心。
每个状态的含义及可能的状态转换如下:
-
运行状态(Running):表示进程正在执行。进程在运行状态时,可能发生以下状态转换:
- 运行 → 就绪:当进程的时间片用完或被其他高优先级进程抢占时,进程从运行状态转换为就绪状态,等待下一次调度。
- 运行 → 阻塞:当进程需要等待某个事件(如输入/输出操作,读磁盘等)完成时,进程从运行状态转换为阻塞状态,暂时停止执行,直到事件完成。
-
就绪状态(Ready):表示进程已准备好执行,但由于调度算法或其他原因尚未被分配到CPU执行。进程在就绪状态时,可能发生以下状态转换:
- 就绪 → 运行:当调度算法选择该进程并将其分配给CPU时,进程从就绪状态转换为运行状态,开始执行。
-
阻塞状态(Blocked):表示进程由于某个事件的发生而无法继续执行,需要等待事件完成。进程在阻塞状态时,可能发生以下状态转换:
- 阻塞 → 就绪:当等待的事件完成时,进程从阻塞状态转换为就绪状态,等待下一次调度。
五状态模型
- 新建状态(New):进程刚创建但还不能运行
- 就绪态(Ready):一个进程已经具备运行条件,但由于无CPU暂时不能运行的状态
- 运行态(Running):进程占有CPU并在其上运行
- 阻塞/等待态(Blocked/Waiting):指进程因等待某种事件的发生而暂时不能运行的状态
- 退出状态(Exit):进程已结束运行,回收除PCB之外的其他资源,并让其他进程从PCB中收集有关信息
PS:
注意这里面的进程状态转换过程,单向和双向的区别。
事实上,所有的状态都可能直接进入退出状态,在图中尚未体现。
进程挂起
挂起(Suspend):把一个进程从内存换出到外存;有以下几种情况:
- 阻塞→阻塞/挂起:没有进程处于就绪状态或就绪、运行进程要求更多内存资源时
- 就绪→就绪/挂起:空间需要;高优先级阻塞进程即将就绪,挂起低优先级就绪进程
- 运行→就绪/挂起:对可抢占式系统,当有高优先级阻塞/挂起进程因事件出现而进入就绪/挂起时,抢占CPU,运行进程让出内存、CPU
挂起发生的原因有以下几种:
- 进程均处于等待状态,需要把一些阻塞进程对换出去,腾出足够内存装入就绪进程运行。
- 进程竞争资源,导致系统资源不足,负荷过重,需要挂起部分进程以调整系统负荷,保证实时性或让系统正常运行(负载均衡)。
- 定期执行的进程(如审计、监控、记账程序)对换出去,以减轻系统负荷。
- 用户要求挂起自己的进程,以便进行某些调试、检查和改正。
- 父进程要求挂起后代进程,以进行某些检查和改正,或协调各子进程。
- 操作系统需要挂起某些进程,检查运行中资源使用情况,以改善系统性能;或当系统出现故障或某些功能受到破坏时,需要挂起某些进程以排除故障。
进程激活
激活(Activate):把一个进程从外存换进内存;
可能有以下几种情况:
-
就绪/挂起→就绪:当没有就绪进程或就绪/挂起进程优先级高于就绪进程
-
阻塞/挂起→阻塞:很少见。当一个进程释放足够内存,系统会把高优先级阻塞/挂起进程(高于所有就绪/挂起进程,事件很快发生)激活
其他状态
这里简单了解一下即可,一般考试不会考得这么细。
- 事件出现(Event Occurs)
这里的事件主要是指阻塞的进程等待的事件,可能会引起以下两种状态变化
- 阻塞→就绪
- 阻塞/挂起→就绪/挂起
- 收容(Admit)
收容主要是指新建的进程进入就绪队列的状态变化
- 新建→就绪
- 新建→就绪/挂起
- 释放(Release)
任意状态→退出