选择题
1:下面哪种死锁处理策略代价最小?(C)
A.死锁避免
B.死锁检测+恢复
C.死锁忽略
D.死锁预防
2:下面哪种死锁处理策略引入的不合理因素最严重?(B)
A.死锁避免
B.死锁预防
C.死锁忽略
D.死锁检测+恢复
3:为什么进程切换的代价要比线程切换要大?(C)
A.因为进程切换要切换PC指针
B.因为进程切换要切换栈
C.因为进程切换要切换段表
D.因为进程切换要切换控制块数据结构
4:初值为N的信号量,当前值为-1表示的含义是什么?(D)
A.有N-1个资源
B.有N-1个进程在等待
C.有1个资源
D.有1个进程在等待
5:为什么PC机通常死锁忽略策略?(D)
A.因为PC机上的发生死锁造成的破坏小
B.因为死锁检测算法在PC机器上不能执行
C.因为PC机上的发生死锁的可能性小
D.因为PC机上的死锁可以用重启来解决
6:下面哪种参数可以用来表征操作系统可以对用户输入快速处理?(A)
A.响应时间
B.吞吐量
C.等待时间
D.周转时间
7:下面哪种调度算法可以保证用户的输入在一定的时间以后可以得到响应?(A)
A.时间片轮转调度
B.先来先服务算法
C.剩余短作业优先
D.短作业优先
8:下面哪个系统调用不是用来操控进程的?(A)
A.open()
B.fork()
C.wait()
D.exec()
9:下面哪种状态下的进程不存放在内存中?(A)
A.挂起态
B.运行态
C.就绪态
D.阻塞态
10:关于进程和线程的主要区别,下面哪种论述是正确的?(C)
A.线程可以没有栈
B.线程之所以切换快是因为TCB比PCB尺寸小
C.线程切换时可能会引起进程切换
D.进程不能成为调度的单位
11:在实际系统中实现进程调度算法需要考虑诸多因素,相比而言下面哪个因素最不需要考虑?(A)
A.机器物理内存的大小
B.用户任务的特点
C.机器的使用环境
D.算法的复杂性
12:进程和程序的区别主要体现在哪里?(A)
A.进程有当前执行位置,程序没有。
B.进程在CPU上执行,程序没有执行。
C.进程有代码段,程序没有。
D.进程在内存中,程序在磁盘上。
13:下面哪个不是临界区的使用原则(B)
A.互斥进入
B.先来先服务
C.有空让进
D.有限等待
14:临界区的软件实现有什么缺点?(B)
A.需要特殊的硬件支持
B.运行时代价较大
C.在多CPU环境下不好使
D.会引入不合理因素
15:银行家算法属于下面哪种死锁处理策略?(C)
A.死锁恢复
B.死锁忽略
C.死锁避免
D.死锁预防
16:资源按照顺序申请属于下面哪种死锁处理策略?(D)
A.死锁避免
B.死锁检测、恢复
C.死锁忽略
D.死锁预防
17:下面哪个操作会引起某些进程的阻塞?(D)
A.执行CPU调度
B.进程退出
C.信号量的V操作
D.信号量的P操作
18:下面哪个操作一定不会引起进程的阻塞?(D)
A.信号量的P操作
B.打开浏览器
C.读写磁盘
D.信号量的V操作
19:下面哪个操作一定会引起CPU调度算法的执行?(C)
A.fork()
B.open()
C.exit()
D.printf()
20:下面哪种调度算法导致的切换代价最大?(A)
A.分时轮转调度
B.先来先服务
C.短作业优先
D.长作业优先
21:进程周转时间是指什么?(B)
A.进程在阻塞队列中的时间
B.进程从创建到执行完成的时间
C.进程等待某种资源的时间
D.进程在就绪队列中的时间
22:下面哪种调度算法属于可剥夺调度算法?(B)
A.短作业优先
B.时间片轮转调度
C.优先级调度
D.先来先服务调度
23:用户级线程和内核级线程的区别是?(A)
A.用户级线程可以在没有内核级线程的情况下独立存在
B.在执行用户程序时内核级线程可以在没有用户级线程的情况下独立存在
C.用户级线程没有TCB
D.内核级线程没有用户栈
24:为什么在多CPU环境中一个进程中的多个用户级线程不能在多个CPU上执行?(D)
A.用户级线程没有栈
B.用户级线程没有PC指针
C.用户级线程没有TCB
D.CPU调度是在内核中的,而内核不能感知到用户级线程
25:新打开一个安全性很高的网页应该新建一个什么?(A)
A.进程
B.都行
C.用户级线程
D.内核级线程
26:死锁不会导致的后果是?(B)
A.越来越多的进程会发生死锁
B.读写磁盘越来越慢
C.系统感觉越来越慢
D.用户按键不会得到相应
27:下面哪个操作不需要用临界区来保护?(A)
A.读取信号量的数值
B.信号量的V操作
C.信号量的P操作
D.往信号量等待队列中再增加一个进程
28:操作系统最终如何实现进程之间的同步?(A)
A.控制进程的睡眠和唤醒
B.加入一些循环故意拖延进程的执行
C.控制系统调度
D.控制进程执行时间
29:下面哪种调度算法能让刚等待完IO的进程优先执行?(D)
A.先来先服务
B.时间片轮转调度
C.短作业优先
D.多级反馈队列调度
30:系统安全状态是指什么?(B)
A.目前资源请求分配图中不存在环路的状态
B.存在一个调度序列可以让所有进程都能执行完成的状态
C.接下来可以随便接受资源请求的状态
D.接下来无论如何都不会发生死锁的状态
简答题:
1. 进程最基本的状态有哪些?哪些事件可能会引起不同状态间的转换?
就绪、运行、阻塞状态三种状态。
就绪→执行:处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。
执行→就绪:处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
执行→阻塞:正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。
阻塞→就绪:处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。
2. 什么是用户级线程和内核级线程?
用户级线程:由用户程序自己管理的线程对操作系统透明,操作系统完全不知道这些线程的存在
内核级线程:由内核管理的线程。用户应用程序通过API和系统调用(system call)来访问线程工具。
3. 试从并发、切换内容、切换代价和相互影响四个方面对传统进程和线程进行比较。
并发:一个程序至少有一个进程,一个进程至少有一个线程,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
切换内容:进程切换涉及虚拟地址空间的切换而线程不会。每个进程存在自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。
切换代价:1:切换页目录以使用新的地址空间,2:切换内核栈和硬件上下文。
线程切换不需要进行 1 中的操作 ,线程和传统进程都要执行 2 中 的操作
线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的
相互影响: 进程是指在系统中正在运行的一 个应用程序;程序一旦运行就是进程,或者进程是程序执行时的一个实例
4.什么是死锁?死锁发生的四个基本条件是什么?如何预防死锁?
死锁:指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象(两个或多个进程谁也执行不下去)
四个基本条件:1互斥 、2不可剥夺、 3请求和保持、 4循环等待
预防死锁:1打破互斥条件、 2打破不可剥夺条件、 3打破请求和保持条件、 4打破循环等待条件
5.什么是临界资源?什么是临界区?
临界资源:指每次仅允许一个进程访问的资源。
临界区:指进程中的一段代码,与其他相关的进程中的相关代码对应,一次至多只允许一个进程进入,即互斥进入
6.实现临界区应遵循的准则有哪些?
1互斥进入 2有空让进 3有限等待
————————————————
计算题
1
答:法一:
法二:
2
3:
(1)安全的情况下满足:allocation + available > max
4:桌上有一个能盛得下5个水果的空盘子。爸爸不停的向盘中放苹果和橘子,儿子不停地从盘中取出橘子享用, 女儿不停地从盘中取出苹果享用。规定3人不能同时向(从)盘子中放(取)水果。试用信号量机制来实现爸爸、儿子和女儿这三个“循环进程”之间的同步。
生产者—消费者问题的变形,相当于一个能生产两种产品的生产者(爸爸)向两个消费者(儿子和女儿)提供产品的同步问题,因此,需设置两个不同的full信号量apple和orange,初值均为0。
semaphore empty=5,mutex=1,apple=0,orange=0; //为四个信号量赋初值 void father(){ do{ wait(empty); //等待盘子为空 wait(mutex); //等待获取对盘子的操作 爸爸向盘中放一个苹果或者橘子; signal(mutex); //释放对盘子的操作 if(apple){ signal(apple); //通知女儿可以来盘子中取苹果 }else{ signal(orange);// 通知儿子来取橘子 } }while(TRUE); } void son(){ do{ wait(orange); //判断盘子中是否有橘子 wait(mutex); //等待获取对盘子的操作 儿子取出盘中的桔子; signal(mutex); //释放对盘子的操作 signal(empty); //盘子空了,可以继续放水果了 }while(TRUE); } void daugther(){ //与儿子进程雷同 do{ wait(apple); wait(mutex); 女儿取出盘中的苹果; signal(mutex); signal(empty); }while(TRUE); } void main() { cobegin father();son();daugther(); coend }
第二种:
semaphore empty=5,mutex=1,apple=0,orange=0; //为四个信号量赋初值 void father(){ while(TRUE){ P(empty); //等待盘子为空 P(mutex); //等待获取对盘子的操作 爸爸向盘中放一个水果; V(mutex); //释放对盘子的操作 if(放入是橘子){ V(orange); //儿子可以来盘子中取苹果 }else{ V(apple);// 通知女儿来取橘子 } } } void son(){ while(TRUE){ P(orange); //判断盘子中是否有橘子 P(mutex); //等待获取对盘子的操作 儿子取出盘中的橘子; V(mutex); //释放对盘子的操作 V(empty); //盘子空了,可以继续放水果了 享用橘子; } } void daguther(){ while(TRUE){ P(apple); //判断盘子中是否有橘子 P(mutex); //等待获取对盘子的操作 女儿取出盘中的苹果; V(mutex); //释放对盘子的操作 V(empty); //盘子空了,可以继续放水果了 享用苹果; } }
5:假设有一个路口,通行交通规则如下:只要没有机动车在通行,路口行人就可以通过,只有没有行人在通过路口且没有其他机动车在通过路口时该机动车才能通过。请用P、V操作描述行人和机动车通过路口的同步互斥过程。
行人有过路口的优先级大于机动车过路口的优先级;路口每次通过一辆机动车或人。没人时,机动车依次通行;有人时,车必须等全部人通过路口才能通行。
int count = 0; // 记录行人数量 Semaphore mutex = 1; // 保护count更新 Semaphore crossing = 1; // 互斥路口使用 //Semaphore pass = 1; // 保证过路人优先级 process_car() { while(true) { P(crossing); 机动车通过路口(); V(crossing); } } process_passenger() { while(true) { P(mutex); if(count == 0) { P(crossing); } count++; V(mutex); 行人通过路口(); P(mutex); count--; if(count == 0) { V(crossing); } V(mutex); } }