操作系统概念(三):进程
前言
本章目标:
- 介绍进程的概念
- 介绍进程的特点
操作系统原理是武汉大学计算机学院软件工程专业所学习的一门专业课,教材为机械工业出版社的操作系统概念,本系列博客为该课程的学习笔记。
正文
1. 进程的概念
进程是资源分配的基本单位,也是独立运行的基本单位。
前趋图是一个有向无循环图,用于描述程序、程序段或语句执行的先后次序。
1.1. 程序的顺序执行
程序的顺序执行:程序必须按照某种先后顺序来执行,当前操作完成后才能执行后续操作。 程序顺序执行的特征:
- 顺序性
- 封闭性:程序一旦开始运行,其执行结果不受外界因素影响。
- 可再现性:程序执行的初始条件和执行环境相同时,将获得同样的结果。
1.2. 程序的并发执行
程序的并发执行是指若干个程序(或程序段)同时在系统中运行,这些程序(或程序段)的执行在时间上是重叠的。 程序并发执行的特征:
- 间断性:并发程序具有“执行—暂停—-执行”这种间断性的活动规律。
- 失去封闭性:多个程序共享系统中的资源,这些资源的状态将由多个程序来改变,致使程序之间相互影响。
- 不可再现性:在初始条件相同的情况下,程序的执行结果依赖于执行的次序。
1.3. 进程的特征
- 动态性:进程是程序的一次执行过程。动态性还表现为它因创建而产生,因调度而执行,因无资源而暂停,因撤消而消亡。而程序是静态实体。
- 并发性:多个进程实体同时存在于内存中,能在一段时间内同时运行。
- 独立性:在传统OS中,进程是独立运行的基本单位,也是系统分配资源和调度的基本单位。
- 异步性:也叫制约性,进程以各自独立的不可预知的速度向前推进。
- 结构性:进程实体由程序段、数据段及进程控制块组成,又称为进程映像。
1.4. 进程与程序的关系
- 进程是动态概念,程序是静态概念。(进程是程序的一次执行过程,而程序是指令的集合。)
- 进程是暂时的,程序是永久的。(进程是一个状态变化的过程;程序可以长久保存。)
- 进程与程序的组成不同。(进程的组成包括程序、数据和进程控制块。)
- 进程与程序是密切相关的。一个程序可以对应多个进程;一个进程可以包括多个程序。
- 进程可以创建新进程,而程序不能形成新程序。
1.5. 进程状态
- 新建状态:进程正被创建。
- 执行状态:指令在执行。
- 阻塞状态:进程等待某事件发生。
- 就绪状态:进程等待分配处理器。
- 终止状态:进程执行完毕。
大多数状态不可逆转,如等待不能转换为运行。 状态转换大多为被动进行,但运行→等待是主动的。 一个进程在一个时刻只能处于上述状态之一。
1.6. 进程控制块(PCB)
PCB是描述和管理进程的数据结构。它是进程实体的一部分,操作系统通过PCB感知进程的存在,PCB是进程存在的唯一标志。
PCB包含的内容:
- 进程标识符:惟一标识进程的一个标识符或整数。
- 进程当前状态:说明进程当前所处状态。
- 进程队列指针:用于记录PCB队列中下一个PCB的地址。
- 程序和数据地址:进程的程序和数据在内存或外存中的存放地址。
- 进程优先级:反映进程获得CPU的优先级别。
- CPU现场保护区:CPU现场信息的存放区域,包括:通用寄存器、程序计数器、程序状态字等。
- 通信信息:进程与其他进程所发生的信息交换。
- 家族关系:指明本进程与家族的关系,如父子进程标识。
- 资源清单:列出进程所需资源及当前已分配资源。
1.7. 进程的挂起状态
人为将进程挂起使之处于静止状态。
2. 进程调度
2.1. 调度队列
- 作业队列:系统中所有进程的集合。
- 就绪队列:内存中就绪并等待执行的所有进程的集合。该队列通常用链表实现。
- 设备队列:等待某一I/O设备的进程队列。
2.2. 调度程序
- 长程调度(或作业调度):选择可以进入就绪队列的进程
- 短程调度(或CPU调度):选择可下一个执行并分配CPU的进程
两者的主要差别是执行频率。
2.3. 上下文切换
将CPU切换到另一个进程需要保存当前进程的状态并恢复另一个进程的状态,这一任务称为上下文切换。 上下文切换的时间开销较重;在切换时,系统没有做有用的工作。时间取决于硬件的支持。
3. 进程操作
常见的进程控制功能有进程创建、撤消、阻塞与唤醒等。 这些功能一般由操作系统内核原语来实现。
操作系统内核:与硬件紧密相关、运行频率较高、基本操作的模块,常驻内存。 原语是由若干条机器指令构成的,用以完成特定功能的一段程序,这段程序在执行期间不可分割。
3.1. 进程创建
创建进程称为父进程,被创建进程称为子进程。 每个新进程可以再创建新进程,从而形成了进程树。
进程树又称进程图或进程家族树。
3.1.1. 资源共享方式
- 父进程子进程共享所有的资源。
- 子进程共享父进程资源的子集。
- 父进程和子进程无资源共享。
3.1.2. 执行方式
- 父进程和子进程并发执行。
- 父进程等待,直到子进程终止。
3.1.3. 地址空间
- 子进程是父进程的复制品。
- 子进程装入一个新程序。
3.1.4. 导致进程创建的原因
- 用户登录:用户登录后,若合法则为用户创建一个进程。
- 作业调度:为调度到的作业分配资源并创建进程。
- OS服务:创建服务进程。
- 应用需要:应用程序根据需要创建子进程。
3.1.5. 创建原语
创建原语的功能:创建一个新进程 创建原语的主要操作过程:
- 像系统申请一个空闲PCB
- 为新进程分配资源。如分配内存空间。
- 初始化新进程的PCB。在其PCB中填入进程名、家族信息、程序和数据地址、进程优先级、资源清单及进程状态等。
- 将新进程的PCB插入就绪队列。
3.2. 进程中止
当进程执行完最后一条语句并使用系统调用exit()请求操作系统删除自身时,进程终止。 这时进程将状态值返回给父进程,所有进程资源由操作系统回收。
级联终止:若父进程终止,不允许子进程继续。
进程撤销的原因:
- 正常结束
- 异常结束:超时、内存不足、地址越界、算术错、I/O故障、非法指令等。
- 外界干预:包括操作员或系统干预,父进程请求。
3.2.1. 撤消原语
撤消原语采用的两种策略:
- 撤消指定标识符的进程
- 撤消指定进程及其所有子孙进程
3.3. 进程阻塞与唤醒
引起进程阻塞及唤醒的事件:
- 请求系统服务:如请求分配打印机,但无空闲打印机则进程阻塞;当打印机重又空闲时应唤醒进程。
- 启动某种操作并等待操作完成:如启动I/O操作,进程阻塞;I/O完成则唤醒进程。
- 等待合作进程的协同配合:如计算进程尚未将数据送到缓冲区,则打印进程阻塞;当缓冲区中有数据时应唤醒进程。
- 系统进程无新工作可做:如没有信息可供发送,则发送请求阻塞;当收到新的发送请求时,应将阻塞进程唤醒。
3.3.1. 阻塞原语
阻塞原语的主要功能:将进程由执行状态转为阻塞状态。 阻塞原语的主要操作过程:
- 停止当前进程的执行
- 保存该进程的CPU现场信息
- 将进程状态改为阻塞,并插入到相应事件的等待队列中
- 转进程调度程序,从就绪队列中选择一个新的进程投入运行。
3.3.2. 唤醒原语
唤醒原语的主要功能:将进程唤醒 唤醒原语的主要操作过程:
- 将被唤醒进程从相应的等待队列中移出
- 将进程状态改为就绪,并将该进程插入就绪队列
- 转进程调度或返回
3.3.3. 阻塞与唤醒的关系
- 一个进程由执行状态转变为阻塞状态,是这个进程自己调用阻塞原语去完成的。
- 进程由阻塞状态转变为就绪状态,是另一个发现者进程调用唤醒原语实现的。
- 一般发现者进程与被唤醒进程是合作的并发进程。
3.4. 进程的挂起与激活
3.4.1. 挂起原语
挂起原语的主要功能:将指定进程挂起 挂起原语的主要操作过程:
- 到PCB表中查找该进程的PCB
- 检查该进程的状态,若为执行则停止执行并保护CPU现场信息,将该进程状态改为挂起就绪
- 若为活动阻塞,则将该进程状态改为挂起阻塞
- 若为活动就绪,则将该进程状态改为挂起就绪
- 若进程挂起前为执行状态,则转进程调度,从就绪队列中选择一个进程投入运行
3.4.2. 激活原语
激活原语的主要功能:将指定进程激活 激活原语的主要操作过程:
- 到PCB表中查找该进程的PCB
- 检查该进程的状态。若状态为挂起阻塞,则将该进程状态改为活动阻塞
- 若状态为挂起就绪,则将该进程状态改为活动就绪
- 若进程激活后为活动就绪状态,可能需要转进程调度
4. 进程的组织
系统中有许多进程,为了能对它们进行有效的管理,应将PCB组织起来。 常用的组织方式有:
- 线性方式
- 链表方式
- 索引方式
4.1. 线性方式
线性存储PCB。
4.2. 链表方式
将同一状态的PCB组成一个链表。
4.3. 索引方式
将同一状态的进程归入一个索引表,再由索引表指向相应的PCB。
5. 进程间通信
习题集锦
课后作业
进程的定义是什么?它最少有哪几种状态?
进程是资源分配的基本单位,也是独立运行的基本单位。 就绪状态、执行状态、阻塞状态。(新建状态、终止状态。)
设单处理机系统中有n(n>2)个进程,问: 是否总有进程运行?为什么?
不一定总有进程运行,当某一运行中的进程被挂起且其他进程都因各种原因处于阻塞状态,即没有进程处于就绪状态时,不一定总有进程运行。
是否会出现等待队列为空的情况?为什么?
有可能会出现。当有一个进程在运行且其他进程已经处于就绪状态时,可能会出现等待队列为空的情况。
是否会出现等待队列为空且无进程运行的情况?为什么?
存疑
是否会出现就绪队列为空的情况?为什么?
有可能,当非运行状态的进程都因各种原因处于阻塞状态而不能变为就绪状态时,会出现就绪状态为空的情况。
本文首发于我的个人博客wangchucheng.com。
原文链接:https://wangchucheng.com/zh/posts/operating-system-concepts-3/
本博客文章除特别声明外均为原创,采用CC BY-NC-SA 4.0 许可协议进行许可。超出CC BY-NC-SA 4.0 许可协议的使用请联系作者获得授权。