2.1.1 进程的概念、组成、特征
进程的概念
进程的组成
进程的特征
总结
2.1.2 进程的状态与转换,进程的组织
创建态、就绪态
运行态
阻塞态
终止态
进程状态的转换
进程的组织
链式方式
索引方式
2.1.3 进程控制
如何实现进程控制?
在下面的例子,将PCB2的是state设为1和和把它放到就绪队列里面这两件事情必须要是一气呵成的,否则,如果先把state设为1,然后这件事情被终止了,但是此时state为的进程就被放到了阻塞队列里面。
如何实现原语的原子性?
进程控制的相关原语
创建原语
作业:在外存中,还未进入内存投入运行的程序
作业调度:从外存中挑选一个程序投入运行
撤销原语
阻塞原语和唤醒原语
切换原语
程序是如何运行的?---加深理解
总结
2.1.4 进程通信
什么是进程通信?
为什么进程通信需要操作系统支持?
共享存储
涉及到如在同一块区域写东西造成数据覆盖,所以各个进程对共享空间的访问应该是互斥的
消息传递
管道通信
管道通信与共享存储的区别:
共享存储可以在任何一块地方写,也可以从任何一个地方读
管道通信本质上是一个循环队列,只能从前面写,从后面读
总结
2.1.5 线程的概念
什么是线程,为什么要引入线程?
同一个进程中的两个线程可以执行同一份代码,也可以执行不同的代码
引入线程机制后,有什么变化?
线程的属性
2.1.6 线程的实现方式和多线程模型
线程的实现方式
用户级线程(操作系统感知不到它的存在)
内核级线程(操作系统可以感知到它的存在)
多线程模型
一对一模型
多对一模型
多对多模型
总结
2.1.7 线程的状态与转换
线程的状态与转换
线程的组织与控制
SP:堆栈寄存器
2.2.1 调度的概念、层次
调度的基本概念
调度的三个层次
高级调度
低级调度
中级调度
三层调度的联系、对比
补充------进程的挂起态与七状态模型
就绪挂起状态已经请求到了要使用的资源,虽然到了外存里面,但是不需要再回到创建态,可以直接回到就绪态,阻塞态也同理。
总结
2.2.2 进程调度的时机、切换与过程、方式
进程调度的时机
进程在访问临界区资源的时候会进行上锁,阻止其他进程访问
普通临界区访问的临界资源不会直接影响到操作系统内核的管理工作,因此在访问普通临界区时可以进行调度与切换
进程调度的方式
进程的切换与过程
总结
2.2.3 调度器和闲逛进程
调度器/调度程序
闲逛进程
o地址指令:永远不需要访问寄存器等,减少能耗
2.2.4 调度算法的评价指标
CPU利用率
系统吞吐量
周转时间
带权周转时间
等待时间
响应时间
总结
2.2.3 调度算法
1<>先来先服务(FCFS)
① FCFS适合长进程,不利于短进程,短进程等待时间和周转时间过长。
② FCFS有利于CPU繁忙型 (如科学计算)进程调度,而不利于I/O繁忙型(如事务处理)进程调度。
2<>短作业优先(SJF)
➢算法优点
与FCFS算法相比 ,短进程算法能有效降低进程的平均等待时间、平均周转时间和 带权平均周转时间、 提高系统的吞吐量。
➢算法缺陷
① 对长进程不利,长进程可能长时间得不到调度
② 不能保证紧迫进程的及时处理,因为该算法不考虑进程的紧迫程度
③ 进程执行长短根据用户的估计而定,故不一定能真正做到短进程优先
最短剩余时间优先算法(短作业优先的抢占式版本)
3<>优先权调度算法
类型
(1)非抢占式
➢进程一旦获得处理机后,一直运行,除非正在执行的进程因发生某事件而不能再继续执行
➢在执行期间,即使有高优先权的进程到来时,系统也不剥夺正在执行进程CPU的使用权。高优先权进程只能先进入就绪队列。
(2)抢占式
高优先权的进程可以抢占处理机,使正在执行的低优先权进程中断执行。
在 UNIX中广 泛采用抢占式。抢占时机包括:
① 基于时钟中断的抢占式优先权调度算法;
② 立即抢占的优先权调度算法
时钟中断
立即抢占
优先权类型
(1)静态优先权
优先权在创建时确定,在进程的整个运行期间保持不变。
决定静态优先权的依据: 进程类型、进程对资源的需求、用户要求 。
静态优先权调度算法可能导致无穷阻塞或饥饿问题(优先权小的一直得不到调度)
(2)动态优先权
进程创建时获得的优先权,随进程的推进而改变。
1->设定动态优先权的方法
① 优先级随着进程运行的剩余时间的减少而增加,使将要执行完的进程尽快完成;
② 优先级随着进程运行的剩余时间的减少而减少,避免该进程长期占用处理机;
③ 随着进程排队等待时间的增长而增加,避免长期饥饿。
2->实现方法
在时钟中断到来时,通过进程切换,根据优先权计算方法,重新计算就绪队列中各 进程的优先级。
缺点
饥饿问题:
无穷阻塞问题:指就绪态进程因得不到CPU而等待的状态。 优先权调度算法会使某个低优先权进程无穷等待CPU,高优先权进程流可以阻止低优先权进程获得CPU。
解决方案:老化(aging)技术。老化技术以逐渐增加在系统中等待时间很长的进程的优先权,使低优先权进程在等待时间很长的情况下优先权变高而获得CPU执行。
高响应比优先算法---HRRN(动态优先权调度算法的一种)
响应比:
Rp=(等待时间+要求服务时间)/ 要求服务时间 = 1 + 等待时间 / 要求服务时间
总结
➢等待时间相同,短进程优先(短进程要求服务的时间短)。
➢要求服务时间相同,先来的进程等待时间长,优先进行调度,算法变为先来先服务。
➢当长进程等待足够长时间后,优先级提高也可获得执行。
➢缺点:很难估计进程预期执行时间;每次计算优先权增加了系统开销。
总结
4<>时间片轮转
1->例子
(1)时间片大小为2
(2)时间片大小为5
2->时间片太大或者太小的缺点
响应时间T=Nq
N:系统中的进程数;q: 时间片的大小。
① (进程数一定)当系统要求的响应时间越短,时间片就越短;
② (响应时间一定)系统允许的最大进程数越多,时间片也越短;
③ 基本命令应该在一个时间片内执行完。
一般来说,设计时间片时要让切换进程的开销占比不超过1%
性能评价
时间片轮转调度算法的性能在很大程度上依赖于时间片的大小。
① 如果时间片很大,进程的响应时间无法保证;
② 如果时间片很小,则进程需要经过多次上下 文切换和进程调度,增加了CPU在进程切换 和进程调度上的开销,影响系统的吞吐量和CPU利用率等方面的性能。
3->总结
5<>优先级调度(优先权调度)
(1)非抢占式
(2)抢占式
6<>多级队列调度算法
1->背景
短进程优先、优先权高者优先都需要估计进程的预期执行时间,如果估计不准确, 将会影响进程调度结果和系统性能。
算法:将就绪队列分成多个独立队列,根据进程的某些属性(如内存大小、进程优先权或进程类型),进程会被永久地分配到一个队列。每个队列都有自己的调度算法。不同的队列优先权不同,调度算法也可能不同。
2->Minix操作系统的进程调度
Minix把进程按类型不同分为三类,分别对应三个优先权不同的就绪队列:
>优先权最高的任务进程队列
>优先权次之的服务进程队列
>优先权最低的用户进程队列。
<对任务进程和服务进程采用基于优先权的非抢占式调度, 优先权高的进程一旦获得处理机将一直运行下去,直到阻塞。
<对优先权最低的用户进程采用时间片轮转的抢占式调度。 采用多级队列调度,一旦进程进入系统,就被固定地分配到一个就绪队列中,进程在被撤销前不会在不同队列之间移动。
<>优点是降低了进程调度的开销,但是不够灵活,对低优先权进程会存在无穷阻塞(饥饿)问题。 多级反馈队列调度算法(Multilevel Feedback Queue Scheduling)可以弥补这些不足
7<>多级反馈队列算法
1->背景
解决多级调度算法对低优先权进程会存在无穷阻塞(饥饿)问题。
2->设计
① 系统中建立多个优先权不同的就绪队列。为每个队列赋予大小不同的时间片。
② 反馈策略可以规定:队列优先权越高,时间片越短,时间片通常成倍增长。
③ 新进程被创建后,先插入优先权最高的队列。仅当高优先权队列空时,才调度优先权次之的队列。同一队列中,采用时间片轮转调度算法。
④ 使用CPU时间过多的进程会被移到优先权较低的队列中
⑤ 在较低优先权队列中等待时间过长的进程会被转移到较高的优先权队列中。这样就通过使用老化技术阻止了饥饿的发生。
➢优先级: R1>R2>...>Ri>...>Rn ➢时间片长度: S1<S2<...<Si<...<Sn第i队列的时间片长度是第i+1队列时间片长度的1/2
➢新进程进入内存后,首先放入到第一个就绪队列末尾,按照FCFS顺序进行安排调度。如果该进程在一个时间片内能够完成,则撤离系统;否则转到第二个就绪队列。以后按照这种方式进行调度。
➢如果直到最后一个队列,通过老化技术,在后面队列中等待时间过长的进程,会逐渐提高其优先级,从而转移到优先权较高的队列中,不会引起饥饿现象。
➢只有当第i-1个就绪队列为空时,系统才会调用第i个就绪队列。
3->考虑的问题
① 就绪队列的数量
② 根据进程优先权确定进程应该进入哪个就绪队列的算法
③ 用于确定进程何时转移到较高优先权队列的算法
④ 用于确定进程何时转移到较低优先权队列的算法
⑤ 用以确定进程在需要服务时应该进入哪个队列的算法。
4->性能分析
① 适合终端型用户需求:终端用户提交的属于交互性进程和短进程,通常能够在第1个队列对应 的一个时间片内完成。响应时间短。
② 短进程:可在第1-3个就绪队列时间内完成。
③ 长进程:在兼顾短进程情况下,能保证长批处理进程得到及时处理。
总结
2.3.1 进程同步、进程互斥
什么是进程同步?(狭义的)
什么是进程互斥?
进程同步与进程互斥的关系
临界资源 (Critical Resource)是指在多进程或多线程环境中,必须互斥访问的共享资源。
临界资源是指在并发环境中,需要被多个进程或线程共享使用的资源,这些资源在同一时刻只能被一个进程或线程访问。临界资源的共享访问如果不进行互斥控制,会导致数据竞争、数据不一致或系统错误。
广义的进程同步包含了进程互斥。进程同步是一个更广泛的概念,而进程互斥是进程同步中的一种特殊情况。为了更好地理解两者的关系,我们可以分别定义它们,并分析互斥在同步中的位置。
- 进程同步 (Process Synchronization)
进程同步的目标是协调多个进程之间的操作,使它们能够按照特定的顺序或规则进行,以确保程序的正确性和资源的合理利用。进程同步可以包括以下两种情况:
-
协作式同步:用于保证进程之间按特定的逻辑顺序执行,确保数据的一致性。例如,生产者-消费者模型中,生产者需要在缓冲区中有空位时生产,消费者需要在缓冲区有产品时消费。
-
互斥式同步:用于保证在某一时刻,只有一个进程能进入临界区,防止共享资源的并发访问导致数据不一致或破坏。
- 进程互斥 (Process Mutual Exclusion)
进程互斥是进程同步的一种特殊形式。它专注于保护临界区,确保在某一时刻只有一个进程能够访问共享资源。进程互斥的目的是防止多个进程同时操作同一资源,避免数据不一致和竞态条件。
互斥是进程同步的一个子集,用于解决资源并发访问的冲突问题。
- 进程同步包含进程互斥的原因
进程同步的概念涵盖了**进程之间的一切协调机制**,不仅包括互斥,还包括其他形式的同步操作,如确保进程按特定顺序执行、解决进程之间的依赖关系等。互斥是进程同步的一种特殊情况,专门解决的是对共享资源的**并发访问问题**。因此,广义的进程同步包含进程互斥。
- 进程同步与进程互斥的关系
-
进程同步的范围更广,目标是协调进程间的合作、顺序和依赖。
-
进程互斥是进程同步中的一个特例,专门用于管理对共享资源的排他性访问。
例如,信号量可以同时用于进程同步(协调进程间的执行顺序)和进程互斥(确保同一时刻只有一个进程进入临界区)。同样的机制可以起到不同的作用,这也体现了互斥是同步的一部分。
总结
广义的进程同步包含进程互斥。进程同步的目的是协调进程间的操作,确保正确的执行顺序和资源使用,而进程互斥是同步中的一种机制,专门用于解决并发访问共享资源的问题。
总结
2.3.2 进程互斥的软件实现方法
单标志法(违反"空闲让进"的原则)
双标志先检查法(违反"忙则等待"原则)
双标志后检查法
Peterson算法
P0把turn设为1,P1把turn设为0,表示自己优先想让对方使用临界资源
总结
2.3.3 进程互斥的硬件实现方法
中断屏蔽方法
TestAndSet指令
Swap指令
总结
2.3.4 互斥锁
2.3.5 信号量机制
整型信号量
记录型信号量
例子
被阻塞的P2和P3已经执行过wait,下次被唤醒的时候,并且获得了CPU,直接从开始使用打印机执行,信号量的value值不会再被减一。
总结
2.3.6 用信号量实现进程的互斥,同步,前驱关系
实现进程互斥
mutex:互斥;互斥锁;互斥体;互斥对象;互斥量
mutex:代表进入临界区的名额,名额还有剩余的话就可以顺利进入临界区。
P,V操作:简单理解为加一减一
实现进程同步
解决进程之间的异步性
注意第二中情况,P2被阻塞后,和前面记录型信号量一样,被P1唤醒以后会从P(S)后面接着执行,而不是再次去执行P(S)操作。
验证一下可以知道,唤醒回来以后又去执行P(S)就又让阻塞了,没办法继续执行下去。
信号量实现前驱关系
总结
2.3.7 生产者-消费者问题
问题描述
如何实现
实现互斥在同一个进程中进行一对PV操作
实现同步是在其中一个进程中执行P,另一个进程中执行V
能否改变相邻P,V操作的顺序
P操作的顺序不能改变,实现同步的P操作要放在实现互斥的P操作的前面
V操作的顺序可以随意调换
逻辑上,生产者可以进到临界区以后再生产产品,然后把产品放入临界区
消费者也可以进入到临界区拿到产品,把产品消费完再出来
但是这样,单个进程对临界区上锁的时间会增加,不利于进程之间互斥的访问临界区
总结
2.3.8 多生产者多消费者问题
问题描述
问题分析
如何实现
可不可以不用互斥信号量
缓冲区容量为1
缓冲区容量为2
总结
2.3.9 吸烟者问题
问题描述
问题分析
如何实现
总结
2.3.10 读写者问题
问题描述
写着和读者同时进入,读者目标读的文件被覆盖,读出的数据和目标不一致
如何实现
第一个读者上锁,最后一个解锁
为了防止进程切换的影响,考虑使用PV操作
ps:虽然是使用了PV操作,但是并不是说不会有进程切换,而是进程切换的时候,由于信号量改变了,不能往下执行,第二个读进程不能往下执行,也不会产生阻塞
存在写进程饿死的问题,源源不断的读者到来,写者一直阻塞
在一个读者读文件的时候,如果有一个写者先到来,读者读完以后,让写者先上处理机运行
谁先来,谁先运行
总结
2.3.11 哲学家问题
问题描述
问题分析
如何实现
第一中可以设置一个初始值为4的信号量
1号左边的拿不到被阻塞,但是P(mutex)被占用,2号也拿不了左边
这种方法不能保证只有两边的筷子都可用时,才允许哲学家拿起筷子,而是有一个哲学家就餐后,
会有三种情况,
一种是它左边的哲学家,可以拿到左边(第一支)筷子,然后在拿右边(第二支)时让阻塞了,信号量上锁,其他的哲学家也再拿不了了
一种是他右边的哲学家,左边的筷子拿不了,直接阻塞了,其他的哲学家再也拿不了了
还有一种是另外两个科学家,可以同时拿到两只就餐,然后接下来就是第一种,或者第二种情况
总结
2.3.12 管程
为什么要引入管程
管程的定义和基本特征
拓展1--管程解决生产者消费者问题
拓展2--Java中类似于管程的机制
总结
2.4.1 死锁的概念
什么是死锁
死锁、饥饿、死循环的区别
死锁产生的必要条件
什么时候会发生死锁
死锁的处理策略
总结
2.4.2 死锁的处理策略---预防死锁
破坏互斥条件(很多时候无法破坏互斥条件)
破坏不剥夺条件
破坏请求和保持条件
破坏循环等待条件
缺点2:假设用户需要先使用打印机再使用扫描仪,但是扫描仪的编号要小,用户就要先申请到扫描仪才能申请使用打印机,这样扫描仪就要空闲等待很久
总结
2.4.3 死锁的处理策略---避免死锁
什么是安全序列
安全序列、不安全状态、死锁的联系
银行家算法
可以找到安全序列
找不到安全序列
总结
2.4.4 死锁的处理策略---检测和解除
死锁的检测
不能消除所有边
可以消除所有边