第二章
- 2.1 常用术语
- 2.2 在操作系统中为什么要引入进程概念?它与程序的差别和关系是怎样的?其基本特征是什么?
- 2.3 PCB的作用,以及如何描述进程的动态性质;
- 2.4 进程进入临界区的调度原则是什么:
- 2.5进程(PCB表)的组织方式
- 2.6.简述信号量的定义和作用。P、V操作原语是如何定义的?
- 2.7 信号量的取值(与相应资源的使用情况有关)
- 2.8 线程和进程的关系
- 2.9 实现线程的主要两张方式,以及其优缺点
- 2.10 管程的组成部分,以及基本特性
- 2.11死锁
- 2.12 死锁、“饥饿”和活锁之间的主要差别
- 2.13 高级进程通信有哪几类,如何各自实现之间的进程通信;
- 2.14 是否所有的共享资源都是临界资源?为什么?
- 2.15 三个信号量
- 2.16 输入、输出两组进程读/写缓冲区需要什么条件
- 2.17 在生产者-消费者问题中,如果对调生产者(或消费者)进程中的两个P操作和两个V操作的次序,会发生什么情况?
- 2.18 银行家算法:避免死锁
2.1 常用术语
-
进程:具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位;
-
进程控制块:是对进程在系统中存在和活动的实体的描述,通常由程序、数据集合、栈和PCB等4部分组成;其中
- 程序和数据是组成进程的实体;
- PCB是进程动态特性的集中反映;
- 栈用来保存过程调用和相互传送参数的踪迹;
-
线程:进程中执行运算的最小单位,亦即执行处理机调度的基本单位;
-
进程互斥:逻辑本来完全独立的若干进程,由于竞争同一个资源而产生的相互制约关系;
-
进程同步:逻辑上相关的两个或者多个进程为了完成一项任务,通过协调活动来使用同一资源,而产生的执行时序的约束关系;
-
临界资源:一次仅允许一个进程使用的资源;
-
临界区:在每个进程访问临界资源的那段程序;
-
竞争条件:两个或者多个进程同时访问和操纵相同的数据时,最后的执行结果取于进程运行的精确时序;
-
原语:机器指令的延伸,往往是为完成某些特定的功能而编制的一段系统程序,其操作具有不可分割性;
-
信号量:在多道程序并发执行环境下使用的一种设施,用来保证两个或多个进程的关键代码段不被并发调用,从而有效解决进程间的互斥和同步问题;
-
管程:一个管程定义一个数据结构和能为并发进程在其上执行的一组操作,这组操作能使进程同步和改变管程中的数据;
-
死锁:指在一个进程集合中的每个进程都在等待仅由该集合中的其他进程才能引发的事件而无限期地僵持下去地局面。
-
活锁:指一个或多个进程在轮询地等待某个不可能为真的条件为真,导致一直重复尝试,失败,尝试,失败这样地过程,但始终无法完成。
-
饥饿:在可以预计地时间内,某个或某些进程因为所需的资源一直被其他进程占有或者抢占,导致永远无法完成工作。
2.2 在操作系统中为什么要引入进程概念?它与程序的差别和关系是怎样的?其基本特征是什么?
- 由于多道程序并发执行时共享系统资源,共同决定这些资源的状态,因此各程序在执行过程中就出现了相互制约的新关系,程序出现“走走停停”的状态,用程序这个静态概念已经不能如实反映程序并发执行时的这些特征了,所以引入了进程;
- 进程和程序是两个完全不同的概念
进程 | 程序 |
---|---|
动态 | 静态 |
具有并发性,宏观上同时运行 | 具有顺序性,程序的并发性时通过进程实现的 |
具有独立性,是一个能够独立运行的单位,是系统资源分配的基本单位,是运行调度的基本单位 | 无独立性 |
一个进程可顺序执行多个程序 | 一个程序可有多个进程公用 |
异步前进,相互制约 | 不具备异步性 |
- 进程的功能通过程序实现的,进程的活动主体为程序,不能脱离具体程序而独自存在。
- 进程的特征:
- 动态性;
- 并发性;
- 调度性;
- 异步性;
- 结构性;
2.3 PCB的作用,以及如何描述进程的动态性质;
- 作用:
- PCB是进程组成中的最关键部分;
- 每个进程都有唯一的进程控制块;
- 操作系统根据PCB对进程实施控制和管理,进程的动态、并发等特征是利用PCB表现出来的;
- PCB是进程存在的唯一标志;
- 描述进程性质的方法:
- PCB 中有表明进程状态的信息,他利用状态信息来描述进程的动态性质;
- 进程的三种状态以及三种关系的转换:
- 运行态;
- 就绪态;
- 阻塞态;
- 运行态----阻塞态:运行进程因某种条件不足而放弃对CPU的占用;
- 就绪态----运行态:CPU空闲,就绪状态进程被调度程序选中;
- 阻塞态----就绪态:阻塞态进程所等待的事件发生了;
- 运行态----就绪态:正在运行的进程用完了本次分配给他的CPU时间片;
- 进程的三种状态以及三种关系的转换:
- PCB 中有表明进程状态的信息,他利用状态信息来描述进程的动态性质;
2.4 进程进入临界区的调度原则是什么:
- 如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入;
- 任何时候,处于临界区内的进程不可以多于一个;如果已有进程进入自己的临界区,则其他试图进入临界区的进程必须等待;
- 进入临界区的进程要在有限时间内退出,以便于其他进程能及时进入自己的临界区;
- 如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象;
2.5进程(PCB表)的组织方式
- 线性方式:操作系统先确定整个系统中同时存在的进程的最大数目,然后静态分配空间,把所有进程的PCB都放入这个表中;
- 链接方式:指针指向PCB;
- 索引方式:利用索引表记载的相应状态进程的PCB地址;
2.6.简述信号量的定义和作用。P、V操作原语是如何定义的?
- 信号量是协调相关进程活动的一种设施。一个成员是整型变量,表示该信号量的值;另一个是指向PCB的指针;当多个进程都等待同一信号量时,他们就排成一个队列,由信号量的指针项指出该队列的头;
- 作用:利用信号量和相应操作可以解决多个进程的互斥和同步问题;
- P,V操作:假设信号量S,P(s),V(S)
- P(S):
- 信号量的值减1;
- 如果S大于等于零,则该进程继续执行;
- 如果S小于零,则把该进程的状态置为阻塞态,把相应的PCB放入信号量队列的尾部,并放弃处理机,进行等待;
- V(S):
- 信号量的值加1;
- 如果S大于零,则该进程继续运行;
- 如果S小于等于零,则把该进程从阻塞状态改为就绪状态,执行V操作的进程继续运行;
- P(S):
- 使用P、V操作时需要注意两点:
- P、V必须成对出现,先做P,进入临界区,在做V,退出临界区;
- 互斥信号量的初值一般为1;
- P,V操作:假设信号量S,P(s),V(S)
2.7 信号量的取值(与相应资源的使用情况有关)
- 当它的值大于零时,表示当前可用资源的数量;
- 当它的值小于0时,则其绝对值表示等待使用该资源的进程个数,即该信号量队列上排队的PCB个数;
2.8 线程和进程的关系
- 一个进程可以有多个线程,但最少要有一个线程;而一个线程只能在一个进程的地址空间内活动;
- 资源分配给进程,同一进程内的所有线程共享该进程的所有分配资源;
- 处理机分配给线程,即真正在处理机上运行的是线程;
- 线程在执行过程中需要协作同步,不同进程之间的线程需要利用消息通信的方法实现同步;
2.9 实现线程的主要两张方式,以及其优缺点
- 用户级线程
- 优点:
-
- 线程切换速度快,无需进行系统调度;
-
- 调度算法可以是应用程序专用的;
-
- 可以运行在任何操作系统上,包括不支持线程的机制的操作系统上;
-
- 缺点:
-
- 系统调用阻塞问题;
-
- 在单纯的用户级线程方式中,多线程应用程序不具有多处理器的优点;
-
- 优点:
- 核心级线程
- 优点:
-
- 在多处理器的系统中,核心可以同时调度同一进程的多个线程,真正实现并行操作;
-
- 如果一个进程中某个线程阻塞,在核心可以调度进程中的另一个线程;
-
- 核心线程本身就是多线程;
-
- 缺点:
-
- 控制转移开销大;
-
- 调度算法由核心确定,应用进程无法影响线程切换;
-
- 优点:
2.10 管程的组成部分,以及基本特性
- 引进管程的原因:
- 信号量机制的缺点:进程自备同步操作,P(S),V(S)操作大量分散在各个进程中,不易管理,容易产生死锁----为了解决这个问题,提出了管程;
- 管程的组成部分:
-
- 管程名称;
-
- 局部于管程的共享数据的说明;
-
- 对数据进行操作的一组过程;
-
- 对该共享数据赋值的语句;
-
- 基本特性:
-
- 管程内部的局部数据变量只能被管程内定义的过程访问,不能被管程外面的声明的过程直接访问;
-
- 进程要进入管程,必须调用管程内的某个过程;
-
- 一次只能有一个进程在管程内进行,其他需要调用该管程的线程全部挂起,等待该管程可用为止;
-
2.11死锁
-
- 产生死锁的根本原因
- 资源有限且操作不当;
-
- 产生死锁的必要条件以及对待死锁的三个方法;
- 必要条件:
-
- 互斥条件;
-
- 不可抢占条件;
-
- 占有且申请条件;
-
- 环路等待条件;
-
- 对待死锁的三个方法以及其方法:
-
- 死锁的预防;
- 基本思想 :要求进程申请资源时遵循某种协议,从而打破产生死锁的4个必要条件中的一个或者几个条件(互斥条件不可以打破),保证系统不会进入死锁状态;
-
- 死锁的避免;
- 基本思想 :对进程所发出的每一个申请资源命令加以动态地检查,并根据检查结果决定是否进行资源分配.也就是说,在资源分配过程中若预测有发生死锁的可能性,则加以避免.--------这种方法确定资源分配的安全性;
-
- 死锁的检测与恢复;
-
-
- 死锁预防的有效方法,以及最著名的死锁避免算法:
- 有效方法: 资源有序分配策略----分类编号,按需分配.
- 著名的死锁避免算法:银行家算法;
-
- 安全序列:
- 如果当前资源分配状态下没有发生死锁,并且即使所有进程突然都提出对资源的最大需求,也仍然存在满足某种调度序列能够使它们一次成功地运行完毕,则该状态称为安全的,相应的进程调度序列{p1,p2,…pn}为安全序列;
2.12 死锁、“饥饿”和活锁之间的主要差别
- 死锁是一种僵局,在无外力干预下,处于死锁状态的进程全部处于阻塞态,可能导致整个系统瘫痪;
- 出现饥饿时系统照样运行,只是某个或者某几个进程永远得不到所需的服务;
- 处于活锁状态的进程不断地改变状态,并未被封锁,还可以活动;活锁可以自行解开,而死锁不可以;
- 造成死锁地原因是资源有限且使用不当;
- 造成饥饿的原因是资源分配策略活鹅调度策略不适合,如果采用先来先服务的资源分配策略就可以避免饥饿;
- 造成活锁的原因是进程轮询的等待一个不可能为真的条件成真;
- 发生死锁时,一定至少有一个资源被无限地占有而得不到释放;
- 当出现饥饿时,系统中每个资源占有者都在有限时间内释放自己所占有的资源;
- 活锁是忙式等待,占有CPU而不会让出CPU;
2.13 高级进程通信有哪几类,如何各自实现之间的进程通信;
-
- 共享存储器方式:在内存中分配一片空间作为共享存储区;
- 需要进行通信的各个进程把共享存储区附加到自己的地址空间中 ,然后就像进行正常的操作一样对共享区中的数据进行读或写操作;
-
- 管道文件方式:连接两个命令的一个打开文件;
- 一个命令向文件写入数据,称为写者;一个命令向文件读出数据,称为读者;
-
- 消息传递方式:以消息为单位在进程间进行数据交换;
-
- 直接通信方式:发送进程直接将信息挂在接收进程消息的缓存队列中,接收进程从缓存队列中得到消息;
-
- 间接通信方式(信箱通信方式):发送进程将消息到信箱的中间设施上,接收进程从信箱中得到消息;
2.14 是否所有的共享资源都是临界资源?为什么?
- 不是所有临界资源都是共享资源,因为临界资源是一次仅允许一个进程使用的资源,而系统中很多资源可以让多个进程同时使用;
2.15 三个信号量
-
- empty:可供使用的缓存区数,初值为n;
-
- full:放有信息的缓冲区数,初值为0;
-
- mutex:互斥信号量,初值为1,表示各进程互斥进入临界区,保证给每次都只有一个进程进入缓冲区;
2.16 输入、输出两组进程读/写缓冲区需要什么条件
- 所有进程都要互斥使用缓冲区;
- 所有输入进程连续写入缓冲区的个数不能超过缓冲区的总容量;
- 输出进程不能超前输入进程;
2.17 在生产者-消费者问题中,如果对调生产者(或消费者)进程中的两个P操作和两个V操作的次序,会发生什么情况?
- 当缓冲区全满时,只要有一个生产者试图进入临界区,并在empty信号量上阻塞,所有消费者进程都无法进入自己的临界区,从而无法使生产者进程醒来,所有生产者进程和消费者进程进程都将处于阻塞状态,出现死锁;
2.18 银行家算法:避免死锁
- 求安全序列的快速方法:先将系统剩余资源数量available和各个进程所需的资源数Need进行比较,
- 找出比need比availale小的两个进程,
- 然后将他们两个allocation(已分配资源数量)和系统剩余资源数量available相加,
- 然后再继续往后面判断,从而得出安全序列;
- 注意:若都是处于安全状态,则序列的顺序没关系;