【特别注意】
答案来源于@wolf以及网络
是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。
【试卷评析】
这张卷子有点老了,部分题目可能有用。如果仔细研究应该会有所收获。
【试卷与答案】
1、下面哪些行为会导致CPU进入内核模式 C
(1)执行陷阱指令 (2)执行IO操作 (3)出现异常 (4)执行计算操作
A. (1)
B. (1)(2)
C. (1)(2)(3)
D. (1)(2)(3)(4)
2.系统发生一次中断最多有一个进程的状态发生切换B
A.对
B.错
3.依据Amdahl’s Law:C
A.随着并行节点数的增多,性能收益呈线性增长
B.随着并行节点数的增多,性能可以不断增长
C.即使并行节点数不断增多,性能也有上限
D.性能加速比由系统中的并行节点数量决定
4.Peterson算法C
A.可以用于乱序执行的处理器
B.是软硬结合的临界区问题解法
C.不能用于三个及以上的进程间的同步
D.flag[i]=true和turn=j两条语句的顺序可以交换
5.下面关于虚拟内存说法正确的是:B
A.启用虚拟内存管理后不需要使用内存
B.虚拟内存利用磁盘作为后备存储
C.启用虚拟内存后不能使用分段内存管理
D.无论何种结构的计算机,启用虚拟内存后只要给进程分配1页物理帧即可让进程正常运行。
1. (6%) 什么是多道程序的度(degree of multiprogramming),它的上限由哪些因素确定?
多道即计算机内存中同时存放几道相互独立的程序。多道程序的度就是操作系统将多少个进程放入了内存。上限的限制因素有CPU的核数、所采用的的调度算法、内存的大小等。
2.(6%)请说明为什么对调度程序而言,区分CPU约束程序和I/O约束程序很重要?
CPU约束型进程可以利用整个时间片,且不会做任何阻碍I/O操作的工作;另一方面,I/O约束型进程有在运行I/O操作前只运行很少数量的计算机操作的性质。这种进程一般不会使用很多的CPU。所以,通过给I/O约束型进程优先权和允许在CPU约束型进程之前运行,可以很好地利用计算机资源。
3. (6%)试描述最优页面置换算法,并解释其为什么是最优的。
最优置换算法会置换最长时间不会使用的页。当发生缺页时,我们需要置换一个页。因为置换的是最长时间不会使用的页,使用最优置换算法确保对于给定数量的帧会产生最低可能的页错误率。
4.(6%)某请求分页系统,每进程拥有逻辑空间128页,每页4KB。主机拥有物理空间4MB。
(1)写出逻辑地址的组成格式。
(2)若不考虑访问权限位,进程的页表有多少项?每页表项至少要包含多少位?
(1)4KB=2^12B,所以页偏移d为12位。因为有128页,128=2^7,所以7位表示页号。
(2)页表项是指:在分页系统中,为每个进程配置了一张页表,进程逻辑地址空间中的每一页,在页表中都对应有一个页表项。逻辑空间128页,所以对应最多为128个页表项;逻辑空间每页的大小和物理空间每页大小是相同的,所以物理块数=物理空间大小/页大小=4M/4K=2^10,故每个页表项至少有10位;
5. (6%)试说明安全状态与死锁之间的关系。
安全状态代表着存在一个进程的安全序列,可以保证不会发生死锁。并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可以避免进入死锁状态;死锁状态必定是不安全状态。
总之,死锁一定在不安全状态,但不安全状态不一定是死锁。
在UFS文件系统中,inode节点中包含15个文件指针,其中12个指针指向直接块,其余3个指针分别指向一级间接块,二级间接块和三级间接块,如果块大小为4KB,文件指针均占4B,试计算该系统支持的最大文件大小是多少(精确到KB)。并说明这样设计在支持不同大小文件时的主要优势。
直接索引的文件指针可以表示12x4KB=48KB的大小
一级间接块,一个指针的大小就是4个字节,那么该4K大小的块,就能够存储1K个指针,然后每个指针又指向块区域中某个4K大小的块,用于存储文件数据。所以 一级间接块指针中的全部空间就是4M的大小。
二级间接块,二级间接块指针块中的1K个指针中的每个指针分别指向一个 一级间接块指针的 4K 地址块,即二级间接块指针可以保存4M * 4M =16G 的大小
三级间接块,三级指针块中的每个指针 指向一个二级间接块指针块,即三级间接块指针 可以保存4M * 4M * 4M=64T大小的文件。
所以该系统支持的最大文件大小为48KB+4M+16G+64T
由此可见,UFS文件系统的优势是可以容纳大文件
一个系统中,设页的大小为512字节,int型数据大小为4字节,假定数组A位于某一页的起始位置,且数组A占用的所有页均未分配物理帧,系统给该进程分配的物理帧总数为64帧,采用LRU页置换算法。对于如下的程序:
int A[][] = new int[128][128]
for( int j=0; j<128; j++)
for(int i=0; i<128; i++)
A[i][j] = 0
(1)试计算会发生多少页错误,并给出相应的理由。
(2)改写上述程序,使页错误发生的次数最少。
(1)LRU页置换是置换最近最少使用的页。
数组在分配时是按行分配的,即A[1][n]将会被分配在一起。int类型大小为4个字节,一个页大小为512个字节,一个页可以容纳128个数组元素,刚好为1行。
①开始会将64个物理帧全部装满,此时也会发生页面置换64次;
②从第65页开始,发生页面置换,直到所有的64个帧重新置换一遍,发生了64次页面置换。
③然后回到第一页,这个时候还要发生页面置换,64次置换。
④然后回到②循环,直到128次结束。
由此可知,发生了128*128次页面置换,即页错误=2^14
(2)因为是频繁的行变换引起的页错误过高,所以只需要改变i和j的顺序就可以了
int A[][] = new int[128][128]
for( int i=0; j<128; j++)
for(int j=0; i<128; i++)
A[i][j] = 0
(15%)一座小桥(最多只能承重两个人)横跨南北两岸,任意时刻同一方向只允许一个人过桥,南侧桥段和北侧桥段较窄只能通过一个人,桥中央一处宽敞,允许两个人通过或歇息。试用P(wait)V(signal)操作实现行人(进程)的过桥同步,请给出同步设计的理由和相应的伪代码。
sem_t num = 2 ;
sem_t south = 1;
sem_t north = 1;
//南侧的人过桥
void toNorth(){
p(num)//发信号过桥,查看当前桥上是否还可上人,桥上人容量减1(因为桥上人数加1了)
p(south)//锁南桥
过南侧桥
到中间
v(south)//解锁南桥,后面的人可以接着过
p(north)//锁北桥
过北侧桥
v(north)//解锁北桥,后面的人可以接着过
v(num)//人过了桥,桥容量加1
}
//北侧的人过桥
void toSouth(){
p(num)//发信号过桥,查看当前桥上是否还可上人,桥上人容量减1(因为桥上人数加1了)
p(north)//锁北桥
过北侧桥
到中间
v(north)//解锁北桥,后面的人可以接着过
p(south)//锁南桥
过南侧桥
v(south)//解锁南桥
v(num)//人过了桥,桥容量加1
}
【特别注意】
实现互斥的操作要在实现同步的操作之后
如果把num的操作放在内层,将会导致死锁。
如果此时桥人数已达上限,中间有两个人,而两岸边的人还可以先把桥锁上,再说要过桥(即使发现锁完之后桥的容量已达上限被阻塞了),就出现中间的人想往两边过,结果过不去,等待岸上的人解锁,两岸的人将桥上锁也上不去桥,因为桥的容量达到上限
答案参考:https://blog.csdn.net/qq_40396568/article/details/118274798
(15%) In demand paging(请求分页),the page table of a process is as following(某进程的页表如下).
Page number(页号) |
Frame(物理页框) |
Valid/Invalid bit(有效位) |
0 |
101H |
1 |
1 |
- |
0 |
2 |
254H |
1 |
假定页面大小为4K,为该进程分配的物理帧数固定为2,采用最近最少使用页面置换算法(LRU)和局部淘汰策略;一次内存访问时间是100ns,一次快表(TLB)的访问时间是10ns,处理一次缺页(page fault)处理的时间为8ms(包含更新TLB和页表的时间);TLB初始化为空,地址访问时,先访问TLB,若TLB未命中,再访问页表(忽略访问页表之后的TLB更新时间);有效位为0,表示页面不在内存中,产生缺页处理。设有虚拟地址访问序列2082H、1324H、204H,请计算:
1. 依次访问该序列地址对应的各个物理内存所需要的时间;
2. 基于上述访问序列,虚拟地址465H对应的物理地址;
3. 若希望请求分页时内存的有效访问时间(EAT)为120ns, 缺页的概率应该控制在多少之内。
(1)
访问2082H,PTE命中,因此是TLB+访内+TLB+访内,220ns
访问1324H,PTE不命中,因此是TLB+访内+缺页处理+TLB+访内,8000220ns
(注意此时0的页被换给1了,下次0也会缺页)
访问0204H,PTE不命中,因此是TLB+访内+缺页处理+TLB+访内,8000220ns
(注意此时2的页被换给0了,下次2也会缺页)
(2)254465H
(3)EAT=(1-p)*100+p*8*10^6<=120
计算得p=0.0000025