衔接我的上一篇博文,这片从第三章开始
第三章:处理机调度与死锁
1、处理机调度的三个层次
高级调度(也称为作业调度、宏观调度、长程调度):用于决定外存上处于后备队列中的哪些作业调入内存,并为他们创建进程、分配必要的资源,再将新创建的进程排在就绪队列上,准备执行。
作业调度应解决的两个问题:
接纳多少作业? 取决于多道程序度
接纳哪些作业? 取决于所采用的调度算法,如先来先服务调度算法、短作业有限调度算法等
中级调度(又称中程调度):涉及进程在内、外存间的交换,从存储器资源管理的角度来看,把进程的部分或全部换出到外存上,可为当前运行进程的执行提供所需内存空间。
低级调度(也称进程调度、微观调度、短程调度):用来决定就绪队列中哪个进程应获得处理机,再有分派程序执行把处理机分配给改进程
进程调度的两种方式:
非抢占式:不允许某进程抢占已经分配出去的处理机
抢占方式:允许调度程序根据某种原则,暂停正在执行的进程,将处理机重新分配给另一进程
抢占原则:优先权原则、短作业(进程)优先原则、时间片原则
进程调度要解决的问题:
按什么原则分配CPU ——调度算法
何时分配CPU——调度的时机
如何分配CPU——CPU调度过程
进程调度的时机
a、一个进程运行完毕,或因某种错误而终止运行
b、当一个进程在运行时变为等待状态(等待I/O)
c、分时系统中时间片到
d、当有一个优先级更高的进程就绪(抢占式)
例:新创建一个进程;一个等待进程变成就绪
e、在进程通信中,执行中的进程执行了某种原语操作(P操作,阻塞原语)
2、调度算法——调度算法是指根据系统的资源分配策略所规定的资源分配算法。
提交时间Si(并不是开始执行时间);运行结束时间Ei;
周转时间:Ti=Ei-Si
则作业平均周转时间T:
平均带权周转时间W:(Ts:服务时间)
先来先服务调度算法(FCFS)——
应用范围与含义
作业调度:完成选择一个或多个最先进入后备队列的作业,将它们调入内存,为它们分配资源、创建进程,并放入就绪队列。
进程调度:按照进程就绪的先后次序来调度进程,为之分配处理机
优缺点
FCFS调度算法比较有利于长作业(进程),而不利于短作业(进程)。
FCFS调度算法有利于CPU繁忙型的作业,不利于I/O繁忙型的作业。
短作业优先调度算法(SJF)——
SJ(P)F调度算法的优缺点
优点:能有效地降低作业的平均等待时间,提高系统吞吐量。
缺点:
对长作业不利
未考虑作业的紧迫程度
作业的估计运行时间不准确
高响应比调度算法(HRRN)——响应比Rp = 1 +(作业等待时间 / 作业处理时间)
如作业等待时间相同,则处理时间越短,响应比越高,有利于短作业。
对于长作业,随等待时间增加,响应比增高,最后同样可获得处理机。
如处理时间相同,等待时间越长,响应比越高,实现的是先来先服务。
几种调度算法实例:
FCFS算法:JOB1-JOB2-JOB3-JOB4
SJF算法:JOB1-JOB3-JOB4-JOB2
HRRN算法:JOB1-JOB3-JOB2-JOB4
3、死锁
一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到该资源,这种现象称为进程死锁(Deadlock),这一组进程就称为死锁进程。
3.1、死锁产生的原因
竞争资源引起进程死锁(资源分配策略)(可剥夺和非剥夺资源)
进程推进顺序不当引起死锁
PS:关于死锁的一些结论:
参与死锁的进程最少是两个(两个以上进程才会出现死锁)
参与死锁的进程至少两个已经占有资源
参与死锁的所有进程都在等待资源
参与死锁的进程是当前系统中所有进程的子集
如果死锁发生,会浪费大量的系统资源,甚至导致系统崩溃
3.2、死锁的四个必要条件
互斥条件:设计的资源是非共享的
不可抢占条件:不能强行剥夺进程拥有的资源
请求和保持条件:进程在等待一新资源时继续占有已分配的资源
环路条件:存在一种进程的循环链,链中的每一个进程已获得的资源同时被下一个进程所请求
3.3、处理死锁的方法
预防死锁:通过设置某些限制条件,去破坏死锁四个必要条件中的一个或多个,来防止死锁。
避免死锁:不事先设置限制条件去破坏产生死锁的条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。
检测死锁:允许死锁发生,但可通过检测机构及时检测出死锁的发生,并精确确定与死锁有关的进程和资源,然后采取适当措施,将系统中已发生的死锁清除掉。
解除死锁:与检测死锁相配套,用于将进程从死锁状态解脱出来。常用的方法是撤消或挂起一些进程。以回收一些资源,再将它们分配给处于阻塞状态的进程,使之转为就绪状态
3.4、避免死锁——银行家算法
可利用资源向量Available。它是一个含有 m个元素的数组,其中每个元素代表一类 可利用资源的数目。
最大需求矩阵Max。n*m矩阵,表示n个进程的每一个对m类资源的最大需求。
分配矩阵Allocation 。n*m矩阵,表示每个进程已分配的每类资源的数目。
需求矩阵Need 。n*m矩阵,表示每个进程还需要各类资源数。
银行家算法步骤:
当进程Pi提出资源申请时,执行下列步骤:
(1)若Requesti[j]≤Need[i,j],转(2);
否则错误返回
(2)若Requesti[j] ≤Available[j],
转(3);否则进程等待
(3)假设系统分配了资源,则有:
Available [j] :=Available [j] -Requesti[j];
Allocation[i,j]:=Allocation[i,j]+Requesti[j];
Need[i,j]:=Need[i,j]-Requesti[j]
(4)执行安全性算法。
若系统新状态是安全的,则完成分配;
若系统新状态是不安全的,则恢复原状态,进程等待
安全性算法步骤:
(1) Work[j]:=Available[j];
Finish[i]:=false;
(2) 寻找满足下列条件的i:
a). Finish[i]=false;
b). Need[i,j]≤Work[j];
如果不存在,则转(4)
(3) Work[j] :=Work[j]+Allocation[i,j];
Finish[i]:=true;
转(2)
(4) 若对所有i,Finish[i]=true,则系统处于安全状态,否则处于不安全状态
可得: Need[i,j]= Max[i,j]- Allocation[i,j]
例:
设系统有五个进程和三类资源,每类资源分别有10、5、7。在T0时刻资源分配情况如下:
T0时刻可以找到一个安全序列
P1发出请求Request(1,0,2),执行银行家算法
可以找到一个安全序列{P1,P3,P4,P0,P2},系统是安全的,可以将P1请求资源分配给它。
若是:P4发出请求Request(3,3,0), 执行银行家算法
Available=(2 3 0)
不能通过算法第2步( Requesti[j]≤Available[j] ),所以P4等待。
例:如下:若P0发出请求Request(0,2,0),执行银行家算法
Available{2,1,0}已不能满足任何进程需要,所以系统进入不安全状态,P0的请求不能分配。
练习题:有三类资源A(17)、B(5)、C(20)。有5个进程P1~P5。T0时刻系统状态如下:
问:
(1)、T0时刻是否为安全状态,给出安全系列。
(2)、T0时刻,P2: Request(0,3,4),能否分配,为什么?
(3)、在(2)的基础上P4:Request(2,0,1),能否分配,为什么?
(4)、 在(3)的基础上P1:Request(0,2,0),能否分配,为什么?
解:(1) T0时刻的出安全系列
先求出Need和Work
(2) P2: Request(0,3,4)
因(Available =2 3 3)< Request(0,3,4) 所以不能分配。
(3) P4:Request(2,0,1) Available =2 3 3
有安全序列P4 P5 P3 P2 P1 可以分配
(4) P1:Request(0,2,0)
0 1 2 已不能满足任何进程的需要,不能分配
第四章:存储器管理
存储器的层次结构
1、连续分配存储管理方式
单一连续分配——最简单,适用于单用户、单任务的OS。
优点:
易于管理。
缺点:
对要求内存空间少的程序,造成内存浪费;程序全部装入,很少使用的程序部分也占用内存。
固定分区分配——把内存划分为个数固定、大小相等或不等的多个区域。分区的划分由计算机的操作员或者由操作系统给出,并给出分区说明表。
优点:易于实现,开销小。
缺点:
内存碎片(零头)造成浪费
分区总数固定,限制了并发执行的程序数目。
可以和覆盖、交换技术配合使用。
动态分区分配——指在系统运行的过程中建立分区,并使分区的大小刚好与作业的大小相等。这种存储管理的方法解决了固定分区严重浪费内存的问题。是一种较为实用的存储管理方法。
基于顺序搜索的动态分区分配方法
首次适应法(FF):要求空闲分区按首址递增的次序组织空闲分区表(队列)。
注意:每次分配和回收后空闲分区表或空闲 分区队列都要按首址递增的次序排序。
下次适应法(NF)(循环首次适应算法):按分区的先后次序,从上次分配的分区起查找(到最后分区时再回到开头),找到符合要求的第一个分区。
最佳适应法(BF) :要求按空闲区大小递增的次序组成空闲分区表(队列)。
注意:分配和回收后要对空闲区表(队列)重新排序
优点:
在系统中若存在一个与申请分区大小相等的空闲区,必定会被选中,而首次适应法则不一定。
若系统中不存在与申请分区大小相等的空闲区,则选中的空闲区是满足要求的最小空闲区,而不致于毁掉较大的空闲区。
缺点:
空闲区的大小一般与申请分区大小不相等,因此将其一分为二,留下来的空闲区一般情况下是很小的,以致无法使用。随着时间的推移,系统中的小空闲区会越来越多,从而造成存储区的大量浪费
最坏适应法(WF):要求空闲区按大小递减的顺序组织空闲区表(或队列)
例:有作业序列:作业A要求18K;作业B要求25K,作业C要求30K。系统中空闲区按三种算法组成的空闲区队列:
经分析:最佳适应法对这个作业序列是合适的,而其它两种对该作业序列是不合适的。
可重定位分区分配
2、基本分页存储管理方式——把用户程序按逻辑页划分成大小相等的部分,称为页(page) 。从0开始编页号,页内地址是相对于0编址
2.1、页表
页表包含以下几个表项:
页号:登记程序地址空间的页号。
块号:登记相应的页所对应的内存块号。
其它:登记与存储信息保护有关的信息
例:作业1有2页分别装入内存的第5、6块;作业2有3页装入内存的第2、4、7块;作业3有1页装入内存的第8块
页的大小是2K , k: 9~16。
第五章:虚拟存储器-具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。
1、交换技术
1.1、选择原则
即:将哪个进程换出内存?
1.2、选择时机
只要不用(或很少再用)就换出;
只在内存空间不够或有不够的危险时换出;
1.3、交换时需要做哪些工作?
换出和换入过程,需要一个磁盘交换区:
必须足够大以存放用户程序内存映像的拷贝;
必须对这些内存映像直接存取。
1.4、换回内存时位置的确定
2、虚拟存储的实现方法
2.1、请求分页系统
在分页系统的基础上增加请求调页功能和置换功能所形成的页式虚拟存储器系统。
硬件支持:请求分页的页表机制、缺页中断机构、地址变换机构。
软件支持
2.2、请求分段系统
请求分段的段表机制、缺段中断机构、地址变换机构
3、请求分业存储管理方式
在进程开始运行之前,不是装入全部页面,而是装入几个或零个页,之后根据进程运行的需要,动态装入其它页;
在进程开始运行之前,不是装入全部页面,而是装入几个或零个页,之后根据进程运行的需要,动态装入其它页;
3.1、页表机制
状态位:表示该页是否装入内存;
访问位:此页在一段时间被访问的次数,可用来决定淘汰哪页(由不同的算法决定);
修改位:查看此页是否在内存中被修改过;
外存地址:该页在外存上的位置。
3.2、缺页中断处理
在地址映射过程中,在页表中发现所要访问的页不在内存,则产生缺页中断。
操作系统接到此中断信号后,就调出缺页中断处理程序,根据页表中给出的外存地址,准备将该页调入内存。
此时应将缺页的进程挂起(调页完成唤醒)
如果内存中有空闲块,则分配一个块,将要调入的页装入该块,并修改页表中相应页表项的状态位及相应的内存块号;
若此时内存中没有空闲块,则要淘汰某页(若被淘汰页在内存期间被修改过,则要将其写回外存)。
4、页面置换算法
功能:需要调入页面时,选择内存中哪个物理页面被置换。称为replacement policy。
目标:把未来不再使用的或短期内较少使用的页面调出,通常只能在局部性原理指导下依据过去的统计数据进行预测;
页面锁定(frame locking):必须常驻内存的OS关键部分或时间关键(time-critical)的应用进程。实现方法为在页表中加上锁定标志位(lock bit)。
4.1几种算法
最佳页面算法(OPT)——选择“未来不再使用的”或“在离当前最远位置上出现的”页面被置换。
PS:是一种理想情况,实际执行中是无法预知的,因而不能实现。
可用作其他算法性能评价的依据
先进先出页面置换算法(FIFO)——选择建立最早的页面被置换。可以通过链表来表示各页的建立时间先后。
特点:性能较差。较早调入的页往往是经常被访问的页,这些页在FIFO算法下被反复调入和调出。并且有Belady现象。
Belady现象:采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多,缺页率反而提高的异常现象。
Belady现象的描述:一个进程P要访问M个页,OS分配N个内存页面给进程P;对一个访问序列S,发生缺页次数为PE(S,N)。当N增大时,PE(S, N)时而增大,时而减小。
Belady现象的原因:FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,即被置换的页面并不是进程不会访问的。
例:有一虚拟存储系统,采用先进先出的页面淘汰算法。在内存中为每个进程分配3块。进程执行时使用页号的顺序为 4 3 2 1 4 3 5 4 3 2 1 5
(1) 该进程运行时总共出现几次缺页。
(2) 若每个进程在内存有4块,又将产生几次缺页。
(3) 如何解释所出现的现象。
(1)m=3
(2)、m=4
m=3时,缺页中断9次
m=4时,缺页中断10次
(3)、FIFO页面淘汰算法会产生异常现象(Belady现象),即:当分配给进程的物理页面数增加时,缺页次数反而增加
最近最久未使用页面置换算法(LRU)——选择最后一次访问时间距离当前时间最长的一页并淘汰之。即淘汰没有使用的时间最长的页。
特点:局部性原理的合理近似,性能接近最佳置换(OPT)算法。 实现代价很高(软件方法或硬件方法)
轮转算法(clock)(也称最近未使用算法(NRU, Not Recently Used))
最不经常使用(LFU)——选择到当前时间为止被访问次数最少的页面被置换;
例:某程序在内存中分配三个块,访问页的走向为4,3,2,1,4,3,5,4,3,2,1,5,按FIFO、 LRU、OPT算法分别计算缺页次数。
假设开始时所有页均不在内存。
eg:某程序在内存中分配四个块,访问页的走向为4,3,2,1,4,3,5,4,3,2,1,5,按LRU、OPT算法分别计算缺页次数
假设开始时所有页均不在内存
章节练习:
1、有一页式系统,其页表存放在主存中。
(1) 如果对主存的一次存取要3us,问实现一次页面访问要多长时间。
(2) 如系统有快表,平均命中率为97%,假设访问快表的时间忽略为0,问此时一次页面访问要多长时间。
(1)、2*3=6us
(2)、0.97*3+0.03*6=3.09us
2、在分页存储管理系统中,有一作业大小为4页,页长为2K,页表如下:
试借助地址变换图(即要求画出地址变换图)求出逻辑地址4635所对应的物理地址。
3、如果内存划分为100KB、500KB、200KB、300KB、600KB首次适应、最佳适应和最差适应算法各自将如何放置大小分别为212KB、417KB、112KB、426KB的进程?哪种算法的内存利用率最高?
答:
(1)首次适应:212KB放在500KB分区(剩余288KB);417KB放在600KB分区;112KB放在剩余的288KB分区;而426KB进程必须等待。
(2)最佳适应:212KB放在300KB分区;417KB放在500KB分区;112KB放在200KB分区;426KB放在600KB分区。
(3)最差适应:212KB放在600KB分区(剩余388KB);417KB放在500KB分区;112KB放在剩余388KB分区;而426KB进程必须等待。
综上可以看出,最佳适应算法的内存利用率最高。
5、一个32位地址的计算机使用两级页表,虚地址被分为9位的顶级页表域,11位的二级页表域和偏移,请问,页面长度是多少?在地址空间中,共存在多少页?
答:9位作顶级页表域,11位作二级页表域,所以剩余32-(9+11)=12位作偏移,所以页面长度是212=4K,在地址空间中共存在220个页面。
第三四五章重点:
第三章 处理机调度与死锁
1.处理机调度的层次
2.作业调度及算法
(FCFS SJF HRRN)
3.死锁的概念、产生原因、必要条件、预防死锁
4.避免死锁-银行家算法,安全性算法
第四章 存储器管理
1.连续分配的存储管理方式
2.动态分区分配算法
(首次适应法、最佳适应法、最坏适应法)
3.分页存储管理方式
第五章 虚拟存储器
1.交换技术
2.请求分页系统
3.页面置换算法(先进先出、最优、最近未使用)