共同目标
资源利用率、公平性、平衡性、策略强制执行
批处理系统的目标
平均周转时间短
周转时间 = 作业在外存后备队列上等待调度的时间+进程在就绪队列上等待进程调度的时间+进程在CPU上执行的时间+进程等待I/O操作完成的时间
平均周转时间
T = 1 n [ ∑ i = 1 n T i ] T = \cfrac{1}{n}[\displaystyle\sum_{i=1}^nT_i] T=n1[i=1∑nTi]
平均带权周转时间
T = 1 n [ ∑ i = 1 n T i T s ] > 1 T = \cfrac{1}{n}[\displaystyle\sum_{i=1}^n\cfrac{T_i}{T_s}] > 1 T=n1[i=1∑nTsTi]>1
Ti:作业的周转时间
Ts:系统为它提供服务的时间
系统吞吐量高:单位时间内系统所完成的作业数
处理机利用率高
分时系统的目标
实时系统的目标
作业和作业步
作业:程序+数据+作业说明书
在批处理系统中,是以作业为基本单位从外存调入内存
作业步
往往是上一个作业步的输出作为下一个作业步的输入
作业流:
若干作业进入系统被依次放在外存,便形成了作业流
作业控制块(JCB):作业在系统中存在的标志
作业运行的三个阶段和三种状态
主要任务
接纳多少个作业
取决于多道程序度,即允许多少作业同时在内存中运行
接纳哪些作业
取决于采用的调度算法
先来先服务(FCFS)
优点:简单
缺点:FCFS 算法比较有利于长作业(进程),而不利于短作业(进程),只考虑了等待时间,忽视了作业运行时间。
短作业优先(SJF)
只考虑了运行时间,忽视了等待时间
优先级调度算法(PSA)
基于作业的紧迫程度,保证紧迫性作业(优先运行)
静态优先权:创建进程时确定,在进程整个运行期间保持不变
确定进程优先级大小的依据
动态优先权:创建进程之初,先赋予一个优先级,然后随进程的推进或等待时间的增加而改变,以便获取更好的调度性能
高响应比优先调度算法
优先权 = R p = 等待时间 + 要求服务时间 要求服务时间 = 响应时间 要求服务时间 优先权 = R_p = \cfrac{等待时间+要求服务时间}{要求服务时间} = \cfrac{响应时间}{要求服务时间} 优先权=Rp=要求服务时间等待时间+要求服务时间=要求服务时间响应时间
R P R_P RP为响应比
进程调度的任务
保存处理机现场信息、按某种算法选取进程、把处理机分配给进程
非抢占式
一旦处理机分配给进程后,就一直让它运行下去,直到进程完成或被阻塞:引起进程调度的两个因素
抢占式:现代OS的主要方式
轮转调度算法
基于时间片的轮转,时间片大小略大于一次典型交互所需要的时间
选择时间片大小因素
优先级调度算法
同作业调度中的算法
多级反馈队列调度算法
前面的算法如果未指明进程长度,则无法使用,而此算法无需知道各种进程所需执行时间

可以较好的满足各类用户的需要
提供必要的基本信息
就绪时间
开始截止时间和完成截止时间
处理时间
开始截止时间 + 处理时间 = 完成截止时间
资源要求
优先级
系统处理能力强:如果不强,可能会导致某些任务得不到及时处理
C i :处理时间, P i 是周期时间 C_i:处理时间,P_i是周期时间 Ci:处理时间,Pi是周期时间
单处理机情况下:
∑ i = 1 m C i P i < = 1 \displaystyle\sum_{i=1}^m\cfrac{C_i}{P_i} <= 1 i=1∑mPiCi<=1
在N核处理机的情况下:
∑ i = 1 m C i P i < = N \displaystyle\sum_{i=1}^m\cfrac{C_i}{P_i} <= N i=1∑mPiCi<=N
采用抢占式
最早截止时间优先EDF
根据截止时间确定任务的优先级
最低松弛度优先算法LLF
根据任务的松弛程度
松弛度 = 必须完成时间 − 其本身的运行时间 − 当前时间 = 最早开始时间 − 当前时间 松弛度 = 必须完成时间-其本身的运行时间-当前时间 = 最早开始时间 - 当前时间 松弛度=必须完成时间−其本身的运行时间−当前时间=最早开始时间−当前时间
产生死锁原因
死锁定义
如果一组进程中的每一个进程都在等待仅由该组进程中其他进程才能引发的事件,那么该组进程是死锁的
产生死锁的必要条件
处理死锁的方法
破坏“请求和保持”条件
第一种协议:一次性申请其在整个运行过程中需要的全部资源
第二种协议:在第一种协议的基础上,在运行过程中逐步释放已分配给自己的、且已用毕的全部资源
提高设备利用率,减少进程发生饥饿现象
破坏“不可抢占”条件
实现复杂,延长周转时间、增加系统开销、降低了吞吐量
破坏“循环等待”条件
对系统所有资源类型进行线性排序后、规定每个进程必须按照序号递增的顺序请求资源。
如果一个进程已经请求了较高的资源后又想请求一个序号低的资源,必须将所有相同或者更高的资源释放掉,才能申请序号低的资源
系统安全状态
当系统处于安全状态时,可避免发生死锁。反之,当系统处于不安全状态时,则可能进入到死锁状态
安全状态:系统能按照某种进程推进顺序 ( P 1 , P 2 , . . . , P n ) (P_1, P_2,...,P_n) (P1,P2,...,Pn)为每个进程 P i P_i Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成,此时称 ( P 1 , P 2 , . . . , P n ) (P_1, P_2,...,P_n) (P1,P2,...,Pn)为安全序列
系统在进行资源分配前,应先计算此次资源分配的安全性
利用银行家算法避免死锁
数据结构
Available[n],每个元素代表一类可利用资源数目Need[m][n],用以表示每个进程尚需各类资源数Allocation[m][n],用以表示每个进程已分配各类资源数Max[m][n],定义了系统中每个进程对各资源的最大需求量N e e d [ i ] [ j ] = M a x [ i ] [ j ] − A l l o c a t i o n [ i ] [ j ] Need[i][j] = Max[i][j] - Allocation[i][j] Need[i][j]=Max[i][j]−Allocation[i][j]
银行家算法
设 R e q u e s t i Request_i Requesti是进程$ P_i 的请求向量, 的请求向量, 的请求向量,Request_i[j] = K 表示进程 表示进程 表示进程P_i 需要 K 个 需要K个 需要K个R_j$类型的资源
合理性检查: R e q u e s t i [ j ] < = N e e d [ i ] [ j ] Request_i[j] <= Need[i][j] Requesti[j]<=Need[i][j],合理则下一步,否则出错
可用性检查: R e q u e s t i [ j ] < = A v a i l a b l e [ j ] Request_i[j] <= Available[j] Requesti[j]<=Available[j],有可用资源则下一步,否则等待
预分配:系统试探着把资源分配给进程 P i P_i Pi,并修改数据结构的值
A v a i l a b l e [ j ] − = R e q u e s t i [ j ] ; A l l o c a t i o n [ i ] [ j ] + = R e q u e s t i [ j ] N e e d [ i ] [ j ] − = R e q u e s t i [ j ] Available[j] -= Request_i[j];\\Allocation[i][j] += Request_i[j]\\Need[i][j] -= Request_i[j] Available[j]−=Requesti[j];Allocation[i][j]+=Requesti[j]Need[i][j]−=Requesti[j]
执行安全性算法
设置两个数据结构:1.Work = Available 2.Finish初始化为False,标记是否有足够资源满足进程
从进程集合中找到一个满足下述条件的进程
若找到执行下一步,否则执行步骤4
当进程 P i P_i Pi获得资源后可顺利执行,直至完成,并释放出分配给它的资源
W o r k [ j ] + = A l l o c a t i o n [ i ] [ j ] F i n i s h [ i ] = T r u e g o t o s t e p 2 Work[j] += Allocation[i][j]\\Finish[i] = True\\go\ to\ step\ 2 Work[j]+=Allocation[i][j]Finish[i]=Truego to step 2
如果所有进程的Finish[i] = True都满足则表示处于安全状态,否则处于不安全状态

资源分配图
死锁定理
当且仅当S状态的资源分配图是不可完全简化的是S为死锁状态的充要条件
死锁的解除