计算机操作系统课程学习指导
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机操作系统课程学习指导
2003-5
一、注意理解和掌握OS的重要术语和概念
理解和掌握OS的重要术语和概念是学好OS课程的基础。
例如应会论述以下OS的一些重要概念。
1、现代OS的四种特征
1) 并发(Concurrence)
并发性是指两个或多个事件在同一时间间隔内发生。
在多道程序环境下,并发性是指宏观上在一段时间内有多道程序在同时运行。
但在单处理机系统中,每一时刻仅能执行一道程序,故微观上,这些程序是在交替执行的。
操作系统必须具各控制和管理各种并发活动的能力。
2) 共享(Sharing)
系统中的资源可供内存中多个并发执行的进程共同使用。
有两种资源共享方式:1、当一个进程正在访问该资源时,其它欲访问该资源的进程必须等待,仅当该进程访问完并释放该资源后,才允许另一进程对该资源进行访问,称为互斥共享方式。
2.允许在一段时间内由多个进程同时对该资源进行访问。
称为同时共享方式。
3) 虚拟(Virtual)
在操作系统中的所谓“虚拟”,是指通过某种技术把一个物理实体变成若干个逻辑上的对应物。
物理实体(前者)是实的,即实际存在的,而后者是虚的,是用户感觉上的东西。
例如利用多道程序技术可以把一台物理上的CPU虚拟为多台逻辑上的CPU,也称为虚处理机。
4) 异步性(Asynchronism)
在多道程序环境下,允许多个进程并发执行,进程的执行并非“一气呵成”,而是以“走走停停”的方式运行。
内存中的每个进程以怎样的速度向前推进,每道程序总共需多少时间才能完成,都是不可预知的。
很可能是先进入内存的作业由于资源等因素的限制后完成,而后进入内存的作业先完成。
2、进程的五种基本特征
1) 动态性
进程是进程实体的执行过程,动态性是进程最基本的特性。
动态性表现为:“它由创建而产生,由调度而执行,因资源缺乏而阻塞,因资源满足而被唤醒,由撤消而消亡”。
因此,进程具有生命期。
2) 并发性
指多个进程实体,同存于内存中,让它们公平的竞争CPU资源,使CPU能在很短的时间内轮流的执行多个程序。
宏观上产生在单处理机上同时运行多个程序的效果。
3) 独立性
指进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资源和独立调度的基本单位。
凡未建立进程的程序,不能作为一个独立的单位参加运行。
4) 异步性
指进程按各自独立的、不可预知的速度向前推进;或者说,进程按异步方式运行。
正是这一特征,将导致程序执行的不可再现性。
因此,在OS中必须采取某种措施来保证各程序之间能协调运行。
5) 结构特征
进程实体是由程序段、数据段及进程控制块三部分组成,有人把这三部分统称为“进程映像”。
因此说进程具有结构性。
3、同步机制应遵循的四种准则
1) 空闲让进
当无进程处于临界区时,相应的临界资源处于空闲状态。
因而可允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
2) 忙则等待
当已有进程进入自己的临界区时,意味着相应的临界资源正被访问,因而所有其它试图进入临界区的进程必须等待,以保证诸进程互斥地访问临界资源。
3) 有限等待
对要求访问临界资源的进程,应保证该进程能在有效时间内进入自己的临界区,以免陷入“死等”状态。
4) 让权等待
当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”。
4、处理死锁的四种基本方法
1) 预防死锁
通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来防止发生死锁。
预防死锁是一种较易实现的方法,已被广泛使用。
但由于所施加的限制条件往往太严格,可能导致系统资源利用率和系统吞吐量降低。
2) 避免死锁
不需事先采取各种限制措施去破坏产生死锁的必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
这种方法只需在事先加以较弱的限制条件,便可获得较高的资源利用率及系统吞吐量,在目前较完善的系统中,常用此方法来避免发生死锁。
3) 检测死锁
这种方法预先并不采取任何限制性措施,也不检查系统是否已进入不安全区,此法允许系统在运行过程中发生死锁。
但可通过系统设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源;然后,采取适当措施,从系统中将已发生的死锁清除掉。
4) 解除死锁
这是与检测死锁相配套的一种措施,用于将进程从死锁状态下解脱出来。
常用的实施方法是撤消或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之转为就绪状态以继续运行。
5、可变分区内存管理的分区分配算法
1) 首次适应算法(First Fit)
FF算法要求空闲分区地址递增的次排列或链接。
在进行内存分配时,从首项开始顺序查找,直至找到一个能满足其大小要求的空闲分区为止。
然后,再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。
该算法倾向于优先利用内存中低址部分的空闲分区,在高址部分的空闲分区很少被利用,从而保留了高址部分的大空闲区。
其缺点是低址部分不断被划分,致使留下许多难以利用的、很小的空闲分区。
2)循环首次适应算法(Loop First Fit)
LFF是由首次适应算法演变而形成的。
在为进程分配内存空间时,不再每次从首项开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,并从中划出一块与请求的大小相等的内存空间分配给作业。
该算法能使内存中的空闲分区分布得更均匀,减少查找空闲分区的开销,但这会缺乏大的空闲分区。
3) 最佳适应算法(Best Fit)
“最佳”的含义是指每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业,避免了“大材小用”。
为了加速寻找,该算法要求将所有的空闲区,按其大小以递增的顺序形成一空闲区链。
这样,第一次找到的满足要求的空闲区,必然是最佳的。
孤立地看,最佳适应算法似乎是最佳的,然而在宏观上却不一定。
因为每次分配后所切割下的剩余部分,总是最小的,这样,在存储器中会留下许多这样难以利用的小空闲区。
二、会分析和解决进程控制中的有关问题
例如对于教材P60习题1,2类似的问题,我们能画出它的前趋图:
S1: a=5-x;
S2: b=a*x;
S3: c=4*x;
S4: d=b+c;
S5: e=d+3;
前趋图:
会利用Berhstein条件证明哪些语句可并发执行,而哪些语句不能并发执行;
S1的读写集合: R(S1)={x} W(S1)={a}
S2的读写集合: R(S2)={a,x} W(S2)={b}
S3的读写集合: R(S3)={x} W(S3)={c}
S4的读写集合: R(S4)={b,c} W(S4)={d}
S5的读写集合: R(S5)={d} W(S5)={e}
S1和S3的Berhstein条件为:
R(S1)∩W(S3)∪R(S3)∩W(S1)∪W(S1)∩W(S3)= {x}∩{c}∪{x}∩{a}∪{a}∩{c}={} 结果为一空集合,说明S1和S3无前后趋关系,所以S1和S3可以并发执行。
而S3和S4的Berhstein条件为:
R(S3)∩W(S4)∪R(S4)∩W(S3)∪W(S3)∩W(S4)= {x}∩{d}∪{b,c}∩{c}∪{c}∩{d}={c}
结果不为空集合,即S3是S4的前趋,S3和S4不可以并发执行。
对于此类问题我们还应会利用信号灯进行同步,保证各并进程在具有异步特性的OS中能按此前趋图的关系执行。
例如:可设信号灯Sema2,Sema4,Sema5,它们的初值都为0:
var Sema2,Sema4,Sema5:Semaphore = 0,0,0;
对于S1,S3进程的执行无需等待:
Ps1
Bebin
……
signal(Sema2);
//唤醒它的后续Ps2 end; Ps3
Bebin
……
signal(Sema4);
//唤醒它的后续Ps4 end;
对于S2,S4,S5进程的执行需要等待它们的前趋进程完成后才能执行:
Ps2
Bebin
Wait(Sema2);
//等待Ps1唤醒
……
signal(Sema4);
//唤醒它的后续Ps4 end; Ps4
Bebin
Wait(Sema4);
//等待Ps2唤醒
Wait(Sema4);
//等待Ps3唤醒
……
signal(Sema5);
//唤醒它的后续Ps5
end;
Ps5
Bebin
Wait(Sema5);
//等待Ps4唤醒
……
end;
关于进程控制还应会用进程状态转换图说明进程的各种状态以及转换原因,产生转换的原
三、关于进程同步
理解和掌握教材中讲到的几种信号灯机制的原理与用法,会用信号灯解决并发进程中的同步问题,会利用信号灯的两种基本操作正确的组织互斥进入临界区的进入区(entry section)和退出区(exit section)。
会解释信号灯的值代表的物理意义以及初值的设置理由。
深刻理解一下两个经典的进程同步问题:生产者/消费者问题和读者/写者问题中的解法。
例如,在生产者/消费者问题中利用资源信号量empty=n和full=0分别表示缓冲池开始时可操作的项目数量。
用记录型信号量机制的wait(empty)限制向缓冲期中放产品的速度;用wait(full)限制消费者从缓冲期中取产品的速度;用signal(full)唤醒阻塞在full上的消费者;用signal(empty)唤醒阻塞在empty上的生产者。
设置信号灯metux初值等于1,令生产者/消费者在其进入区都调用wait(mutex)使诸进程实现对缓冲池读写指针的互斥使用;令生产者/消费者在其退出区都调用signal(mutex)释放对缓冲池读写指针的使用,并唤醒等待进入临界区的其他进程。
注意为什么引入And型信号量机制,它改进了记录型信号量机制的什么缺陷,它是怎样运用到生产者/消费者问题中的。
教材中第二个生产者/消费者问题中应用了And型信号量机制,生产者/消费者在它们的进入和退出区都必须同时申请和释放其所需的所有信号量,只要有一个申请不到都会从新申请,从而避免了由于OS的异步性使得同步次序不合理而引起的死锁问题。
信号量集机制又是怎样概括了同时同步多种资源请求问题的。
教材中第二个读者/写者问题中应用了信号量集机制。
在该算法中,首先读者进入区中的Swait(L,1,1)表示了限制允许进入临界区的读者的数量不能多于上限RN(因为L的初值=RN)。
而其后的Swait(mx,1,0)起到了是否让读者进入临界区读文件的开关作用。
这是因为,mx在这里代表了读进程要测试的资源(操作文件的临界区)的剩余量,1代表了被测资源的下限(等于0,有写者则所有读者都被阻塞;大于等于1,无写者则所有读者都可进入),0代表了此时的进程仅对mx代表的资源(是否有写者)进行测试,而不是要求占用1个资源,或者理解为不互斥写者。
这一算法反映了写者优先,因为读者进入后都没有使mx<=0,写者任何时候到来只要等已进入的读者读完,它就可以立即进入临界区写。
而写者的进入区使用的是Swait(mx,1,1;L,RN,0)语句。
其中的mx,1,1说明写者到来后使mx=0从而互斥了新的读者和其他写者;而L,RN,0说明写者同时在测试是否有正在读的读者(L=RN无读者,L<RN有RN-L 个读者正在读),等正在读的读者读完后再写。
四、调度与死锁
首先应了解衡量一个调度算法的若干准则。
其中比较重要的一个准则就是面向用户准则中的平均周转时间T和平均带权周转时间W。
因为一些调度算法是围绕着减小这两个参数考虑的。
应能对给定的若干作业的提交时间和完成时间计算和比较不同调度算法下的平均周转时间T和平均带权周转时间W。
会应用银行家算法分析资源分配是否安全。
例如有以下问题:
系统有8台磁带机;有三道同时驻留内存的作业Ja、Jb、Jc,它们各需最多磁带机数为4,5,3台。
其各作业的计算时间、I/O时间和每次申请的磁带机数如下表(设三道作业同时提交,调度时间忽略不记):
1、如按Ja,Jb,Jc优先次序调度。
计算系统平均周转时间T和W等于多少?
2、如按短作业优先调度算法。
计算系统平均周转时间T和W等于多少?
3、在第二次I/O时系统应首先满足哪一个作业的磁带机申请,为什么?
我们可以通过画出它们的运行时间图来分析计算以上问题。
注意作业周转时间指从作业提交后到计算完成的时间,不考虑其中的I/O时间,因为I/O 是由通道与中央处理器并行执行的,而调度考虑的是怎样提高中央处理器的利用率。
对于第一问实际上是采用的优先级调度算法,我们可以画出下图:
从图中可以看出:
Ja 的周转时间为:Ta=90
Jb 的周转时间为:Tb=180
Jc 的周转时间为:Tc=195
T = (Ta+Tb+Tc)/3 = (90+180+195)/3 = 155
W = (90/50+180/100+195/35)/3 = 3.1
对于第二问采用短作业优先调度算法,此时Jc最短=45,Ja次之=50,我们可以画出下图:
从图中可以看出:
Ja 的周转时间为:Ta=125
Jb 的周转时间为:Tb=215
Jc 的周转时间为:Tc=45
T = (Ta+Tb+Tc)/3 = (125+215+45)/3 = 128
W = (125/50+215/100+45/35)/3 = 1.98
对于第三问,我们可以应用避免死锁的算法中的银行家算法选择一个满足条件的申请。
此时系统还剩余1台磁带机。
Ja最大需求4台,已有2台,申请1台不能达到其最大需求,因此不与分配。
Jb最大需求5台,已有3台,申请1台不能达到其最大需求,因此不与分配。
Jc最大需求3台,已有2台,再申请1台能达到其最大需求,因此给与分配。
五、内存管理
首先应当掌握内存管理中的一些基本概念,例如,
●逻辑地址空间–用户程序的虚拟地址空间
●物理地址空间–进程运行时真实的绝对地址空间
●地址重定位–从逻辑空间变换到物理空间的过程,有装入时重定位和执行时重定位两
种情况
●地址变换机构– CPU中管理内存的硬件部件MMU
●程序装入方式–将程序从外存空间写入内存空间时地址定位的方法,有绝对、可重定
位、运行时定位3种方式。
●程序链接方式–将多个程序模块组装成一个统一的可执行程序的方法,有静态、装入
时动态、运行时动态3种方式。
●内存分配方式–多道程序同时驻留内存时内存的划分方法。
与CPU提供的MMU有关。
主要有:
1.连续分配方式
i.单一连续
ii.固定分区
iii.可变分区
2.页式分配方式
3.段式分配方式
4.段页式分配方式
●虚拟存储器–程序可局部装入就运行的存储管理方式,经常采用请求分页方式实现。
先为进程分配适当数量的实际内存块,称为实存,装入部分将要运行的逻辑页,已在内存中的这些逻辑页称为实页,不在内存中的逻辑页称为虚页。
要求系统有缺页中断硬件装置,当要执行的页面不在内存时进行缺页中断处理从外存快速调入请求页,如果无空闲实页,应采用某种页面置换算法淘汰实存中的某页将新页装入其中。
以上分配方式中可重点掌握一下可变分区内存管理和页式内存管理两种方式。
以下例题说明了这两种管理方式的一些要点。
1、
a)该表适用于何种分配算法?为什么?
b)如果有五个作业J1,J2,J3,J4,J5依次需要6KB,10KB,96KB,24KB,160KB,
按适合该表的分配算法分配空间,这五个作业能全部装入内存吗?
c)为将这五个作业全部装入内存,您应采用何种分配算法?为适应新算法的要求
该表应做何种调整,给出调整后的表目?
d)在五个作业全部装入内存后,如果J1,J4,J5和J1,J4之间以及J1,J5之间的空
间都依次释放,该表的内容变为怎样?
本题给出了一种管理内存可变分区的数据结构-空闲分区表,和一组实例数据。
对于第一问,可从表中的分区地址列的数据中看出其地址的排列是自小到大递增排列的,对于分区分配算法中的首次适应法FF,它要求空闲分区地址递增的次排列或链接。
以便可以从首项开始顺序查找,快速找到一个能满足其大小要求的空闲分区。
这说明该表适合于首次适应法FF。
对于第二问,如果使用该表应用FF则,J1分得1号的一块(剩6KB),J2分得2号的一块(剩16KB),J3分得4号一块(剩84KB),J4再从4号分得一块(剩60KB),而所剩的每一个空闲块都无法满足J5的160KB的要求,即无法将5个作业全部装入内存。
即装入前四个作业后空闲表变为:
但如果我们按最佳适应分配算法BF的思想,将J1的6KB放入3号的8KB中,将J2的10KB放入1号的12KB中,将J3的96KB放入5号的100KB中,将J4的24KB放入2号的26KB中,J5的160KB放入4号的180KB中,则这5个作业可全部装入内存。
这就要求空闲表的排列按分区大小的升序排列以便BF算法快速完成:
装入五个作业后的空闲表变为:
当J4,J5,J1和J4,J5之间的空间以及J1,J5之间的空间都依次释放后,从62KB 到306KB 之间的空间都变为空闲,需要合并空闲上下邻分区为单一的一项空闲表目,空闲表应变为:
2、设某系统采用页式内存管理方式,用户逻辑空间为216=64KB ,地址总线宽度为32位。
具有请求分页虚拟存储功能。
a) 若其逻辑空间的划分为:
请说明该逻辑空间的页长为多少?共有多少页? b) 若已知某进程实页表如下:
请给出第3页逻辑0地址变换后的16进制物理地址表示。
画出地址变换图。
b) 如果出现以下的页访问序列:
0,1,
2,3,4,7,0,4,2,7,3,6
请给出用LRU 页面置换算法被依次淘汰的页号。
本题的第一问考察我们是否知道逻辑空间地址字与页、页内地址的对应关系。
对应关系非常简单,即看划分的页、页内地址各占逻辑地址字的多少位,则其数量即为2的多少次方。
对于本题:页内地址占11位,页号占5位。
则:页长=211=2KB ,页数=25=32
本题的第二问考察我们是否知道段页式内存管理方式的地址转换过程,由于地址字是按二进制位数划分的,因此表示一个内存物理地址使用十六进制是最方便的。
物理地址=块号*块长(本题为块号左移11位)+页内地址
3页逻辑0地址变换后的16进制物理地址= 00009800
本题的第三问考察我们是否会应用请求分页虚拟存储的最近最久未使用页面置换算法LRU分析页面淘汰的情况。
关于该算法请参考教材P176页6.3.2节。
这里我们可以使用P172讲解的栈的分析方法将给定的页表看成一个栈,当有某页被访到时就将其放入栈顶,若该页是新页就将栈低页淘汰。
上题分析过程如下图所示:
栈顶。