【特别注意】
答案来源于@wolf以及网络
是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。
【试卷评析】
这张卷子很老了,我不知道具体的年份,部分题目可能有用。如果仔细研究应该会有所收获。
【试卷与答案】
一、选择题(15%)
1.下列说法正确的是(多选):AE
A. CPU和设备能并行运行。
B. Cache里有的数据内存里不一定有。
C. 操作系统一直在CPU上执行,用于监视和管理各种进程。
D. 紧急情况下,CPU可以不通过设备控制器直接访问所有设备。
E. 下列存储介质的访问数据由快到慢的顺序依次是:寄存器、cache、内存、硬盘
2.系统调用与函数调用是一回事,只是说法不同。系统调用的说法突出了这些函数是操作系统提供的功能和服务这一特点。B
A.对
B.错
3.下列不属于不可抢占型调度器的调度位置的是:ADE
A.有进程从阻塞到就绪
B.有进程从运行到阻塞
C.有进程从运行到结束
D.有进程从新建到就绪
E.有中断发生
4.系统发生一次中断最多有一个进程的状态发生切换。B
A. 对
B. 错
5.下面说法不正确的是:ACD
A.LRU算法是虚拟内存中页面置换的最优算法
B.最优页面置换算法是置换那些未来最长时间不会使用的页
C.最优页面置换算法是置换那些过去最长时间未使用的页
D.LRU算法实现代价低,所以存在于当前支持虚拟内存的大部分计算机系统中。
二、简答题 (30%)
1. (6%)据报道华为的鸿蒙操作系统采用了微内核设计。请问 操作系统采用微内核设计的主要优点和缺点分别是什么?
优点:便于扩充操作系统,所有的新服务可以在用户空间增加,因为不需要修改内核。当内核确实需要改变时,所做的改变也会很小,因为微内核本身很小。这样的操作系统很容易移植到不同的硬件平台设计。由于绝大多数服务作为用户而不是作为内核进程来运行的,因此微内核也就提供了更好的安全性和可靠性,如果一个服务器出错,那么操作系统的其他部分不受影响。
缺点:微内核系统的核心只实现了最基本的系统操作,这样内核以外的外部程序之间由于独立运行使得系统难以进行良好的整体优化。另外,进程间相互通信的开销也较单一内核系统大得多。
2.(6%)请谈谈你对阿姆达尔定律的理解,并说明如何提高系统的加速比?
该定律的主要思想是,当我们对系统的某个部分加速时,起对系统整体性能的影响取决于该部分的重要性和加速程度。
要想显著加速整个系统,必须提升全系统中相当大的部分的速度。即相当于增加并行性。
3. (6%)试分析说明为何自旋锁(spinlocks)不适合单处理器系统但却常用于多处理器系统
自旋锁(进程在其等待锁时还在运行)的缺点是忙等待,当一个进程位于其临界区内时,任何其它试图进入其临界区的进程都必须在其进入代码中连续地循环。在单处理器系统中,忙等待浪费了CPU时钟(这些时钟本来可以有效地为其他进程所使用)。
自旋锁的优点就是,进程在等待锁时不会进行上下文切换,而上下文切换可能需要花费相当长的时间。因此,如果锁的占用时间短,自旋锁就可以变得非常有用。它常常用于多处理器系统中,这样一个线程在一个处理器自旋时,另一线程可在另一处理器上在其临界区内执行。
4.(6%)试说明内存管理系统中内部碎片和外部碎片产生的原因和可能的解决措施。
外部碎片是由于某些未分配的连续内存区域太小,以至于不能满足任意进程的内存分配请求,从而不能被进程利用的内存区域。解决外部碎片的方法是紧缩,将所有空闲空间合并到一块。
内部碎片是由于采用固定大小的内存分区,当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片,通常内部碎片难以完全避免。
5. (6%)试说明为何最短寻道时间优先算法(SSTF)在磁盘调度上不是最优算法。
SSTF算法选择与当前磁头位置最近的待处理请求。当新进程到来,磁头选择最近的,导致距离磁头位置较远的可能永远得不到服务,导致饥饿。
可以想象这样一个序列,磁头初始在最中间位置。
第一次寻道,离磁头最近磁道的在中点的左边,磁头移动到该位置。
第二次寻道,离磁头最近磁道的在中点的右边,磁头移动到该位置。
第三次寻道,离磁头最近磁道的在中点的左边,磁头移动到该位置。
…
如此,磁头一直在中点往复,显然不如寻完一侧的磁道再寻另一侧更优。
三、(10%)
文件系统中的连续分配和索引分配方案在内存管理中都有类似的分配方案,试分析论述为何链接分配方案不适合内存管理。
链接分配只能有效地用于文件地顺序访问,要找到中间位置,必须跟随指针一块一块的移动。指针也是需要空间。可靠性较低。如果硬盘损坏,若损坏的是指针,那么这可能导致链接到错误的位置。所以链接分配不适合内存管理。
四、 (15%)
如果有内存中存按地址顺序存在如下大小内存空洞100KB、500KB、200KB、300KB和600KB,请问首次适配算法、最佳适配算法、最差适配算法各自将怎样放置大小分别为212KB、417KB、112KB和426KB(按顺序)的进程?在这一具体案例中哪一种算法更佳,为什么?
首次适配:分配第一个足够大的孔。所以212KB放置到500空洞,剩下288KB空洞;417KB放置到600KB空洞,剩余183KB空洞;112KB放置到288KB空洞,剩余176KB空洞;426KB没有足够的空洞放置。
最佳适配:分配最小的足够大的孔。所以212KB放置到300KB空洞,剩余88KB空洞;417KB空洞放置到500KB空洞,剩余83KB空洞;112KB放置到200KB空洞,剩余88KB空洞;426KB放置到600KB空洞,剩余174KB空洞。
最差适配:分配最大的孔。所以212KB放置到600KB的空洞,剩余388KB空洞;417KB放置到500KB的空洞,剩余83KB的空洞;112KB放置到388KB的空洞,剩余276KB的空洞;426KB没有足够大的空洞放置。
在这一个案例中最佳适配算法最佳,因为最佳适配将所有的进程都放置进去,而首次适配和最差适配则没有。
五、 (15%)
某寺庙,有小和尚、老和尚若干。庙内有一水缸,由小和尚用水桶从井中提水入缸,老和尚用水桶从缸里取水饮用。水缸可容10桶水,水取自同一井中。水井径窄,每次只能容一个水桶取水。水桶总数为3个。每次入、取缸水仅为1桶,且不可以同时进行。试用P(wait)V(signal)操作实现老和尚和小和尚的活动,请给出同步设计的理由和相应的伪代码。
【注意】
这里我使用jar作为水缸访问的互斥锁,well作为水井访问的互斥锁,bottle作为3个水桶的同步锁,full和empty分别表示信号量。锁的性质不同,它们赋初值的时候的值也不同。其中互斥锁是二值信号量。
void* little_monk()
{
while(TruE)
{
P(empty);
p(bottle);
P(well);
从井里打水;
V(well);
P(jar);
往缸里面倒水;
V(jar);
V(bottle);
V(full);
}
}
void* elderly_monk()
{
while(TruE)
{
P(full);
P(bottle);
P(jar);
从缸里面取水使用;
V(jar);
V(bottle);
V(empty);
}
}
int main()
{
……
sem_init(&well,0,1);
sem_init(&jar,0,1);
sem_init(&bottle,0,3);
sem_init(&full,0,0);
sem_init(&empty,0,10);
……
}
六、
(15%) In demand paging(请求分页),the page table of a process is as following(某进程的页表如下).
Page number(页号) | Frame(物理帧号) | Valid/Invalid bit(有效位) |
0 | - | 0 |
1 | 9H | 1 |
2 | 254H | 1 |
假定页面大小为4K,为该进程分配的物理帧数固定为2,采用最近最少使用页面置换算法(LRU)和本地帧分配策略;一次内存访问时间是100ns,一次快表(TLB)的访问时间是10ns,处理一次缺页(page fault)处理的时间为8ms(包含更新TLB和页表的时间);TLB初始化为空,地址访问时,先访问TLB,若TLB未命中,再访问页表(忽略访问页表之后的TLB更新时间);有效位为0,表示页面不在内存中,产生缺页处理。设有虚拟地址访问序列20A2H、1512H、104H,请计算:
1. 依次访问该序列地址对应的各个物理内存所需要的时间;
2. 基于上述访问序列,虚拟地址405H对应的物理地址;
3. 若希望请求分页时内存的有效访问时间(EAT)为120ns, 缺页的概率应该控制在多少之内。