周转时间 = 作业完成时刻 - 作业到达时刻
带权周转时间 = 周转时间 / 服务时间;
平均周转时间 = 作业周转总时间 / 作业个数;
平均带权周转时间 = 带权周转总时间 / 作业个数;
该算法既可用于作业调度,也可以用于进程调度。系统按照作业到达的先后次序来进行调度
该算法既可以用于作业调度,又可以用于进程调度。 在作业调度中,该算法每次从后备作业队列中挑选估计服务时间最短的一个或几个作业,将他们调入内存,分配必要的资源,创建进程并放入就绪队列。
抢占式算法,最短剩余时间优先,总是选择剩余时间最短的进程。
由外部赋予作业相应的优先级,系统从后备队列中选择若干个优先级最高的作业装入内存。
高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点。
该算法中的响应比是指作业等待时间与运行比值,响应比公式定义如下:
响应比 =(等待时间+要求服务时间)/ 要求服务时间,即 RR =(w+s)/ s= 1 + w / s,因此响应比一定是大于 1 的。
系统把处理机分配给就绪队列中响应比最高的进程。
分别算出用 FCFS、SJF、HRRN 调度的周转时间、带权周转时间、平均周转时间、平均带权周转时间。
作业名 | 到达时间 | 处理时间 |
---|---|---|
A | 0 | 3 |
B | 2 | 6 |
C | 4 | 4 |
D | 6 | 5 |
E | 8 | 2 |
FCFS:
作业名 | 开始时间 | 结束时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|
A | 0 | 3 | 3 | 1 |
B | 3 | 9 | 7 | 1.5 |
C | 9 | 13 | 9 | 2.25 |
D | 13 | 18 | 12 | 2.4 |
E | 18 | 20 | 12 | 6 |
总周转时间:43
总带权周转时间:13.15
SJF:
作业名 | 开始时间 | 结束时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|
A | 0 | 3 | 3 | 1 |
B | 3 | 9 | 7 | 1.5 |
C | 11 | 15 | 11 | 2.75 |
D | 15 | 20 | 14 | 2.8 |
E | 9 | 11 | 3 | 1.5 |
总周转时间:38
总带权周转时间:9.95
HRRN:
作业名 | 开始时间 | 结束时间 | 周转时间 | 带权周转时间 |
---|---|---|---|---|
A | 0 | 3 | 3 | 1 |
B | 3 | 9 | 7 | 1.5 |
C | 9 | 13 | 9 | 2.25 |
D | 15 | 20 | 14 | 2.8 |
E | 13 | 15 | 7 | 3.5 |
总周转时间:40
总带权周转时间:11.05
所以
算法 | 平均周转时间 | 平均带权周转时间 |
---|---|---|
FCFS | 8.6 | 2.63 |
SJF | 7.6 | 1.99 |
HRRN | 8 | 2.21 |
根据 FCFS 策略,将所有就绪进程排列成队列,每个进程每次仅运行一个时间片。
优先级调度算法类型:
优先级类型:
根据截止时间确定优先级,截止时间越早, 优先级越高。该算法既可用于抢占式,也可以用于非抢占式。
根据松弛度来确定任务优先级。
松弛度 = 必须完成时间 - 本身运行时间 - 当前时间
一组进程中每个进程都无限等待被该组进程中另一进程所占有的资源而处于的一种僵持局面,若无外力作用,它们都无法向前推进,这种现象称为进程死锁(Deadlock),这组进程就称为死锁进程。
最具代表性的避免死锁算法就是 Dijkstra 的银行家算法:在每一个新进程在进入系统时,它必须申明在运行过程中,可能需要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当进程请求另一组资源时,系统必须首先确定是否有足够的资源分配给该进程。若有,再进一步计算在将这些资源分配给进程后,是否会使得系统处于不安全的状态。如果不会,才将资源分配给它,否则让进程等待。
数据结构
实现银行家算法,需要设置四个数据结构
银行家算法流程
为进行安全性检查,定义数据结构:
其中 m 代表资源种类数,n 代表进程的数量;Work表示系统可提供给进程继续运行的各类资源的数目;Finish表示系统是否有足够的资源分配给该进程。
设系统有五个进程和三类资源,每类资源分别共有10、5、7。此时可以找到一个安全序列
,系统是安全的。
有三类资源 A(17)、B(5)、C(20)。有5个进程 P1~P5。T0 时刻系统状态如下:
进程 | 最大需求 | 已分配 |
---|---|---|
P1 | 5 5 9 | 2 1 2 |
P2 | 5 3 6 | 4 0 2 |
P3 | 4 0 11 | 4 0 5 |
P4 | 4 2 5 | 2 0 4 |
P5 | 4 2 4 | 3 1 4 |
问:
解答:
进程 | Need |
---|---|
P1 | 3 4 7 |
P2 | 1 3 4 |
P3 | 0 0 6 |
P4 | 2 2 1 |
P5 | 1 1 0 |
Work 此时为:2 3 3
进程 | Work | Allocation | Need | W+A | Finish |
---|---|---|---|---|---|
P5 | 2 3 3 | 3 1 4 | 1 1 0 | 5 4 7 | T |
P4 | 5 4 7 | 2 0 4 | 2 2 1 | 7 4 11 | T |
P3 | 7 4 11 | 4 0 5 | 0 0 6 | 11 4 16 | T |
P2 | 11 4 16 | 4 0 2 | 1 3 4 | 15 4 18 | T |
P1 | 15 4 18 | 2 1 2 | 3 4 7 | 17 5 20 | T |
此时处于安全状态。
Work | Allocation | Need | W+A | Finish |
---|---|---|---|---|
P4 | 0 3 2 | 4 0 5 | 0 2 0 | 4 3 7 |
P5 | 4 3 7 | 3 1 4 | 1 1 0 | 7 4 11 |
P3 | 7 4 11 | 4 0 5 | 0 0 6 | 11 4 16 |
P2 | 11 4 16 | 4 0 2 | 1 3 4 | 15 4 18 |
P1 | 15 4 18 | 2 1 2 | 3 4 7 | 17 5 20 |
4. P1:Request(0,2,0),分配之后变为Available(0,1,2),此时执行安全性算法:
Allocation | Need | Available |
---|---|---|
P1 | 2 3 2 | 3 2 7 |
P2 | 4 0 2 | 1 3 4 |
P3 | 4 0 5 | 0 0 6 |
P4 | 4 0 5 | 0 2 0 |
P5 | 3 1 4 | 1 1 0 |
但 Available(0,1,2)已经无法满足任何进程的需要,不能分配。
如果资源分配图中没有环路,则系统中没有死锁。如果图中存在环路则系统中可能存在死锁。
如果每个资源类中只包含一个资源实例,则环路是死锁存在的充分必要条件。
用户源程序执行通常要经过的步骤:
把程序装入内存空间。采用三种方式:
绝对装入方式(Absolute Loading Mode):在可执行文件中记录内存地址,装入时直接定位在上述(即文件中记录的地址)内存地址。
优点:
缺点:
可重定位方式(Relocation Loading Mode):在可执行文件中,列出各个需要重定位的地址单元和相对地址值。当用户程序被装入内存时,一次性实现逻辑地址到物理地址的转换,以后不再转换。
优点:
缺点:
动态运行时装入方式(Dynamic Run-time Loading):在装入模块装入主存后,并不立即把装入模块中的相对地址转换为绝对地址, 而是把这种地址转换推迟到程序要真正执行时才进行。实现时需要重定位寄存器。
优点:
缺点:
链接程序的功能是将经过编译或汇编后所得到的一组目标模块以及它们所需要的库函数,装配成一个完整的装入模块。
实现链接的方法有三种:
连续分配方式是指为一个用户程序分配一个连续的内存空间。
内存分为两个区域:系统区、用户区。应用程序装入到用户区,可使用用户区全部空间。最简单,适用于单用户、单任务的OS。
优点:
缺点:
固定分区就是把内存划分为个数固定、大小相等或不等的多个区域。分区的划分由计算机的操作员或者由操作系统给出,并给出分区说明表。
早期IBM的OS/360 MFT(具有固定任务数的多道程序系统)采用了这种固定分区的方法。
在作业大小和出现频率均已知的情况下,固定分区是合适的。在这种情况下分区的大小选择与作业大小相当,这样内存的使用效率较高。但是若作业的大小和出现的频率不知道时,势必造成分区的大小和作业的大小相差甚远,这样就会造成存储空间的浪费,从而影响整个系统的效率。可以和覆盖、交换技术配合使用。
优点:
缺点:
动态分区分配是指在系统运行的过程中建立分区,并使分区的大小刚好与作业的大小相等。这种存储管理的方法解决了固定分区严重浪费内存的问题。是一种较为实用的存储管理方法。
在动态分区存储管理中,要有相应的数据结构来登记空闲分区的信息,它包括空闲分区的大小和位置。
不同系统根据设计要求采用不同的结构。常用的有空闲分区表和空闲分区队列结构。
系统还要设置等待分区队列,当系统中无空闲区或无满足要求的空闲区时,则把申请者送入等待队列中,等待别的进程释放内存之后再唤醒队列中的进程。
上述三种放置策略各有利弊,到底哪种最好不能一概而论,而应针对具体作业序列来分析。对于某一作业序列来说,某种算法能将该作业序列中所有作业安置完毕,那么该算法对这一作业序列是合适的。对于某一算法而言,如它不能立即满足某一要求,而其它算法却可以满足此要求,则这一算法对该作业序列是不合适的。
问,哪个算法是最适合这个作业序列:
最佳适应法对这个作业序列是合适的,而其它两种对该作业序列是不合适的。
2.有作业序列:作业A要求21K;作业B要求30K,作业C要求25K。系统空闲区:
最坏适应法对这个作业序列是合适的,而其它两种对该作业序列是不合适的。
在分区存储管理中,不论采用什么办法都会出现碎片问题,从而降低了内存的利用率。虽然采用压缩存储区的方法可以解决碎片问题,但系统开销太大,而无实用价值,必须寻求新的技术来解决这一问题,于是分页技术产生了。分页技术是由曼彻斯特大学提出,并于1960年前后在Atlas计算机上实现。这种技术对OS的发展产生了深远影响。
把用户程序按逻辑页划分成大小相等的部分,称为页(page),从 0 开始编页号,页内地址是相对于 0 编址。一般一页的大小为 2 的整数次幂。地址的高位部分为页号,低位部分为页内地址。分页技术可以减少碎片的产生,但进程的最后一页仍然会产生碎片。
按页的大小将内存空间划分为大小相等的区域,称为块或内存块(物理页面,页框)。
以页为单位进行分配,并按作业的页数多少来分配。逻辑上相邻的页,物理上不一定相邻。
若将应用程序的包含页号和页内地址的逻辑地址转换成内存地址,必须要有一个数据结构,用来登记页号和块号的对应关系和有关信息。这样的数据结构称为页表。系统为每个进程在内存建立一个页表。
页表内容:
页号:登记程序地址空间的页号
块号:登记相应的页所对应的内存块号
其它:登记与存储信息保护有关的信息
例如:
页号 | 块号 | 其它 |
---|---|---|
0 | 5 | … |
1 | 65 | … |
2 | 13 | … |
例图 2
作业 1 有 2 页分别装入内存的第 5、6 块;作业2有3页装入内存的第2、4、7块;作业3 有 1 页装入内存的第 8 块:
分页中的地址映射其实与通常的地址映射的概念是一样的,即把程序地址转换成内存地址,这个转换过程是在程序执行过程中完成的,是动态地址映射。在现代计算机系统中,由系统提供的地址映射硬件来完成地址映射工作。
例子
在执行指令 MOV r1,[2500]
时,地址转换步骤:
取出程序地址字 2500 送虚地址寄存器 VR;
由 MMU 硬件分离出页号 P 和页内地址 W;因为页长为 1K,所以页内地址占 10 位(0-9位),页号占 6 位(10-15位);硬件取出VR寄存器中的高 6 位即为页号,低 10 位即为页内地址。
计算方法
若给出的地址为 16 进制,则将其转换为二进制,然后,根据页长及程序地址字的长度,分别取出程序地址的高 几位和低 几 位就得到页号及页内地址。如页长为 2K,程序地址字为 16 位,则高 5 位为页号,低 11 位为页内地址。
若给出的地址为 10 进制,则通过,程序地址/页长
,商即为页号,而余数为页内地址。例如:程序地址为 8457, 页长为 4KB,则页号为:8457/4096=2页;而偏移量为:8457 % 4096 = 256。
分页存储管理中的信息保护从两个方面来实现:
在分离程序地址的页号和页内地址时判别访问是否合法,用于越界保护。若产生的页号满足下式为合法: 0 <=页号 < 程序地址空间的页数
,上述判断由硬件自动完成,若不合法,硬件产生越界中断,由操作系统的越界中断处理程序进行处理。
在页表中增加用于存取控制和存储保护的信息,当要访问某页时系统要根据该页的存取控制和存储保护信息检查访问是否合法。(主要用于越权保护)
分页管理中,页地址变换过程中有一个严重的问题,就是每一次对内存的访问都要访问页表,页表是放在内存中的,也就是说每一次访问内存的指令至少要访问两次内存,运行速度要下降一半。
解决这个问题的一种方法是把页表放在一组快速存储器中(Cache),从而加快访问内存的速度。这种快速存储器组成的页表称为快表,把存放在内存中的页表称为慢表。快表又叫联想存储器(Associative Memory)或 TLB(Translation Lookaside Buffers)。
当调度合理时,可以达到97%的效率。也就是说访问页表的速度大致相当于访问快表的速度,考虑到快表的速度是内存速度的数倍或数十倍,那么相对于内存速度,访问页表的时间可以忽略不计。也就是说具有快表的页地址变换不会造成进程运行速度的下降。
所有进程的页表占用大量的存储空间;而反置页表是为系统的每个页面设置一个表项,存放进程号,页号。整个系统只需要维护一张反置页表。使用反置页表可减少页表所占用的内存空间。
题1:在采用页式存储管理的 16 位系统中,某作业 J 的逻辑地址空间为 4 页(每页 2048 字节),且已知该作业的页面映像(即页表)如下:
页号 | 块号 |
---|---|
0 | 2 |
1 | 4 |
2 | 6 |
3 | 8 |
试借助地址变换图求出有效逻辑地址 4865 所对应的物理地址。
可以由 4865 = 2 * 2048 + 769,即 2 为页号,769 为偏移量;再通过页表,得到页号 2 对应为块号 7 ,所以物理地址为 7 * 2048 + 769 = 15105,对应二进制为:00111,01100000001。
题2:在分页存储管理系统中,有一作业大小为 4 页,页长为 2 K,页表如下:
页号 | 块号 |
---|---|
0 | 5 |
1 | 3 |
2 | 7 |
3 | 6 |
试借助地址变换图(即要求画出地址变换图)求出逻辑地址 4635 所对应的物理地址。
按程序自身的逻辑关系划分为若干个程序段,每个程序段都有一个段名,且有一个段号。段号从 0 开始,每一段段内也从0开始编址,段内地址是连续的。
内存空间被动态的划分为若干个长度不相同的区域,称为物理段;每个物理段由起始地址和长度确定。
以段为单位分配内存,每一个段在内存中占据连续空间;各段之间可以不连续存放。
按段式划分(对用户来讲,按段的逻辑关系进行划分;对系统讲,按页划分每一段)
按页式存储管理方案
以页为单位进行分配
段表:记录了每一段的页表始址和页表长度;
页表:记录了逻辑页号与内存块号的对应关系(每段一个页表,一个程序可能有多个页表);
内存分配管理:同页式管理。