操作系统(谌卫军-王浩娟)课后习题参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1章概述
一、单项选择题
D、A、B、A、C、D、C、A、C、B
二、填空题
Windows、linux
用户态、内核态
PSW
中断
同步中断
系统调用
I/O设备管理、文件系统
实时性、可靠性
第2章进程管理
一、单项选择题
D、D、C、D、B、A、B、D、C、C
B、B、B、D、B、A、B、A
二、填空题
PCB
运行、就像、阻塞
4、5
时间片用完
进程管理、存储管理
PCB
进程
CPU寄存器的值、栈
竞争状态
运行、就绪
I/O繁忙
SJF
FCFS
短进程、I/O繁忙进程
三、简答题
1、运行状态、阻塞状态、就绪状态
运行->阻塞:如进行I/O操作、进程间同步关系;
运行->就绪:时间片用完、被高优先级进程所打断;
阻塞->就绪:等待的I/O操作、信号量等事件发生;
就绪->运行:调度程序选中该进程运行;
2、
(1)进程是资源分配单位,拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈;
(2)线程能减少并发执行的时间和空间开销,包括创建时间、终止时间、切换时间;
(3)线程之间可以共享同一个地址空间,可以进行不通过内核的通信,而进程不行;
(4)线程=轻量级进程;
(5)线程是CPU调度单位;
3、
(1)当一个新的进程被创建时;
(2)当一个进程运行完毕时;
(3)当一个进程由于I/O、信号量或其他的某个原因被阻塞时;
(4)当一个I/O中断发生时,表明某个I/O操作已经完成,而等待该I/O操作的进程转入就绪状态;
(5)在分时系统中,当一个进程的时间片用完时;
4、
RR算法的基本思路:
(1)将所有的就绪进程按照FCFS原则,排成一个队列;
(2)每次调度时将处理器分派给队首进程,让其执行一小段CPU时间;
(3)在一个时间片结束时,如果进程还没有执行完的话,将发生时钟中断,在时钟中断中,进程调度程序将暂停当前进程的执行,并将其送到就绪队列的末尾,然后执行当前的队首进程;
(4)如果进程在它的时间片用完之前就已结束或被阻塞,那么立即让出CPU。
RR算法的主要缺点:时间片q的大小难以确定。
5、
(1)时间片用完,高优先级进程就绪
(2)不会发生切换
(3)PCB
(4)不需要
(5)不能
四、应用题
1、
(1)CPU空闲:100ms~150ms
(2)A无等待,B有等待,180ms~200ms
2、
(1)Job1从投入到运行完成需要110ms,Job2从投入到运行完成需要90ms,Job3从投入到运行完成需要110ms:
(2)CPU的利用率:(110-30)/110 = 72.7%;
(3)设备I1的利用率:(110-30)/110 = 72.7%,设备I2的利用率:(110-20)/110 = 81.8%。
3、
(1)这种机制不能实现资源的互斥访问
考虑如下的情形:
(a)初始化的时候,flag数组的两个元素值均为FALSE
(b)线程0先执行,在执行while循环语句的时候,由于flag[1]=FALSE,所以顺利结束,不会被卡住。假设这个时候来了一个时钟中断,打断它的运行;
(c)线程1去执行,在执行while循环语句的时候,由于flag[0]=FALSE,所以顺利结束,不会被卡住,然后就进入了临界区;
(d)后来当线程0再执行的时候,也进入了临界区,这样就同时有两个线程在临界区
(2)可能会出现死锁
考虑如下的情形:
(a)初始化的时候,flag数组的两个元素值均为FALSE
(b)线程0先执行,flag[0]=TRUE,假设这个时候来了一个时钟中断,打断它的运行;
(c)线程1去执行,flag[1]=TRUE,在执行while循环语句的时候,由于flag[0]=TRUE,所以在这个地方被卡住了,直到时间片用完;
(d)线程0再执行的时候,由于flag[1]=TRUE,它也在while循环语句的地方被卡住了,这样,这两个线程都无法执行下去,从而死锁。
4、
(1)最后打印了3个字符'D'
(2)最少可能打印了0个字符'A',例如,P1连续执行了3次,然后P3连续执行了3次。P2一次也没有执行。
(3)不可能,因为当打印出前面的“CABAB”的时候,信号量R的值等于1,此时,不可能连续打印两个D。
(4)可能。相当于进程P2在打印完第二个A的时候被中断了。
5、
(1)信号量的定义:
int boys_waiting = 0, girls_waiting = 0, using = 0;
Semaphore S_mutex = 1, S_boys = 0, S_girls = 0;
(2)
void boy_wants_to_use_bathroom()
{
P(S_mutex);
if((using == 0) && (girls_waiting == 0))
{
using = 1;
V(S_mutex);
}
else
{
boys_waiting ++;
V(S_mutex);
P(S_boys);
}
}
(3)
void boy_leaves_bathroom()
{
P(S_mutex);
if(girls_waiting > 0)
{
girls_waiting --;
V(S_girls);
}
else if(boys_waiting > 0)
{
boys_waiting --;
V(S_boys);