间是二维的。 7.(D )在多道批处理系统中,内存中可同时驻留多道程序,这些程序可以并发执行。 8.( D)并行性是指两个或多个事件在同一时刻发生,强调时间点。 9.(X )当进程申请CPU得不到满足时,它将处于阻塞状态。 10.(X )实时系统的输出结果的正确性仅仅依赖于结果的正确性。 11.( D)内存分配最基本的任务是为每道程序分配内存空间,其所追求的主要目标是提高存储空间的利用率。 12.(X )分时系统中,时间片设置得越小,则平均响应时间越短。 13.( X)当进程由执行状态变为就绪状态时,CPU现场信息必须被保存在PCB中。 14.( D)管程每次只允许一个进程进入。 15.( X)临界区是指进程中用于实现进程同步的那段代码。 16.(D )在动态确定优先权时,随着进程执行时间的增加,其优先权降低。 17.(D )在非虚拟存储器中,要求作业在运行前必须全部装入内存,且在运行过程中也必须一直驻留内存。 18.( X)实时系统在响应时间、可靠性及交互作用能力等方面一般都比分时系统要求高。 19.( D)wait、signal操作可以解决一切互斥问题。 20.( X)资源要求多的作业,其优先权应高于资源要求少的作业。 21.( D)预防死锁设置的限制条件比避免死锁严格,不利于进程的并发执行。 22.(X)在请求段页式系统中,以页为单位管理用户的虚空间,以段为单位管理内存空间。 23.( X)在分配共享设备和独占设备时,都可能引起进程死锁。 24.( X)在分时系统中,为使多个用户能够同时与系统交互,最关键的问题是系统能及时接收多个用户的输入。 25.( X)在软实时系统中,系统必须满足任务对截止时间的要求,否则可能出现不可预期的结果。 26.( D)当某进程处于静止就绪状态时,该进程在外存交换区。 27.( X)在确定优先级时,资源要求多的作业,其优先权应高于资源要求少的作业。 28.( D)在多级反馈队列调度算法中,优先权越高的队列,其执行的时间片越短。 29.( D)在请求分段存储管理中,分段的尺寸受内存空间的限制,但作业的总的尺寸不受内存空间的限制。
四、简答题
1.什么是进程上下文?
答:进程执行活动全过程的静态描述。包括计算机中与执行该进程有关的各寄存器的值、程序段在经过编译之后形成的机器指令代码集(正文段)、数据集、各种堆栈和PCB结构。 2.死锁产生的原因和条件分别是什么? 答:
原因:1)竞争资源。当系统中供多个进程共享的资源不足时,将引起进程对资源的竞争的而产生死锁。
2)进程推进顺序非法。进程在运行过程中具有异步性特征,如果它们之间的推进顺序不当,也同样会导致进程产生死锁。 死锁产生的必要条件:
1)互斥条件。进程所竞争的资源必须被互斥使用。
2)请求和保持条件。指进程在保留自己已经获得的资源的同时再次申请其他资源。 3)不剥夺条件。进程已经获得的资源只能在使用完时自行释放。
4)环路等待条件。存在一个至少饮食两个进程的循环等待链,链中的每个进程都正在等待下一个进程所占有的资源。
3.在采用首次适应算法回收内存时,可能出现哪几种情况?应怎样处理这些情况? 答:有4种情况。
1)回收区与插入点的前一个分区相邻接。此时将回收区与插入点的前一个分区合并,不再为回收区分配新表项,而只需将前一个回收区的大小加上回收区的大小即可。
2)回收区与插入点的后一个分区相邻接。此时将回收区与插入点后的分区合并,也不再为回收区分配新表项,而只需将回收区的首地址作为新的首地址,其大小是二者之和。 3)回收区与插入点前后各一个分区相邻接。此时将回收区与这两个分区合并,其首地址保留为前一个分区的首地址,大小是三者大小之和。不仅不为回收区分配新表项,而且还需将后一个分区的表项删除。
4)回收区不与任何分区相邻接。此时需要为回收区分配一个新表项,将回收区的首地址和大小填入其中。
4.什么死锁?死锁产生的必要条件是什么? 死锁是指一组并发进程,它们共享系统的某些资源,该组进程中每个进程都已经占有了部分资源,但都不释放自己已经占有资源的情况下要求获得被其他进程已经占有的资源,从而造成它们相互等待,永远不能继续推进的一种状态。
死锁产生的必要条件:互斥条件、请求保持条件、不剥夺条件、环路等待条件。 5.什么是抖动?产生抖动的原因是什么? 答:
1)抖动是由于内存空间竞争引起的。当需要将一个新页面调入内存时,因内存空间紧张,不得不将一个老页面置换出去,而刚刚置换出去的老页面可能又要被使用,因此需要重新将它调入。若一个进程频繁地进行页面调入调出,势必加大系统的开销,使系统运行效率降低。通常称这种现象为该进程发生了抖动。
2)产生抖动的原因主要有:系统内的进程数量太多,致使一个进程分得的存储块过少;系统采取的置换算法不够合理。
6.什么是进程同步?进程同步机制应遵循哪些基本原则?
进程同步是指一组并发进程由于相互合作,共同完成某种任务,因而相互等待,使得各进程按一定的速度执行的过程。
进程同步的基本原则:空闲让进,忙则等待,有限等待,让权等待 7.试比较作业与进程的区别。
一个进程是一个程序对某个数据集的执行过程,是分配资源的基本单位。作业是用户需要计算机完成某项任务,而要求计算机所做工作的集合。一个作业的完成要经过作业提交、作业收容、作业执行和作业完成四个阶段。而进程是已经提交完毕的程序所执行过程的描述,是资源分配的基本单位。其主要区别关系如下:
1)作业是用户向计算机系统提交任务的任务实体,而进程则是完成用户任务的执行实体,是向系统申请分配资源的基本单位。
2)作业在没有进入执行状态时被存入外存的后备作业队列中等待调度执行,进程一旦被创建,总有相应总分放入内存。
3)一个作业可由多个进程组成,且必须至少由一个进程组成,反之不成立。
4)作业的概念应用范围主要局限于批处理系统中,而进程的概念则应用到几乎所有的多道程序系统中。
8.分页和分段存储管理有何区别?
1)页是信息的物理单位,是为减少内存的碎片,出于系统管理需要;段是信息的逻辑单位,
是出于用户的需要出发。
2)页的大小固定,由系统决定;段的长度不固定,由用户决定。 3)分页的地址空间是一维的,从0开始编址,而分段的地址空间是二维的,每个段的段内地址是连续的,也从0开始编址,但段间可以不连续,它们离散地分布在内存的各个分区中。
9.试修改下面生产者—消费者问题解法中的错误: producer: begin repeat ?
produce an item in nextp;
wait(mutex); 改为wait(empty); wait(full); wait(mutex); buffer(in):=nextp; in:=(in+1) mod n;
signal(mutex); singal(full); until false; end consumer: begin
repeat
wait(mutex); wait(full); wait(empty); wait(mutex); nextc:=buffer(out) out:=(out+1) mod n; signal(mutex); signal(empty);
consume item in nextc; until false; end
10.为什么进程在进入临界区之间,应先执行“进入区”代码?在退出前又要执行“退出区”代码?
1)由于临界资源必须互斥进行访问,因此,进程在进入临界区之前,应当首先对被访问的临界资源进行检查,看它是否被访问。如果该资源未被访问的话,该进程可设备它为“正被访问”的标志,并进入临界区进行访问;否则不能进行访问。
2)进程执行完临界区之后,应当放弃临界资源,让其他需要访问的进程使用它,因此需要将该资源设置为“未被访问”标志。
11.何谓静态链接?何谓装入时动态链接和运行时的动态链接?
1)静态链接。在程序装入之前,将各目标模块及它们所需要的库函数链接成一个完整的装配模块,以后不再拆开。
2)装入时动态链接。这种方式是指对于编译后得到的目标模块采用边装入边连接的方式。
3)运行时动态连接。这种方式是指将某些模块的连续推迟到程序运行时进行。即在执行过程中若发现一个被调用模块尚未调入内存,便将它装入内存并连接到调用的模块上。
12.某虚拟存储器的用户编程空间共32个页面,每页为1KB,内存为16KB。假定某时刻一用户页表中已调入内存的页面的页号和物理块号的对照表如下:
页号 0 1 2 3
物理块号
5 10 4 7
则逻辑地址0A5CH所对应的物理地址是什么? 答:125CH。其计算步骤如下:
分析:页式存储管理的逻辑地址分为两部分:页号和页内地址。 由已知条件“用户编程空间共32个页面”,可知页号部分占5位; 由“每页为1KB”,1K=1024,可知内页地址占10位。 由“内存为16KB”,可知有16块,块号为4位。
逻辑地址0A5C(H)所对应的二进制表示形式是:0000101001011100
根据上面的分析,单下划线部分为页内地址,双下划线为页号,编码“00010”为页号,表示该逻辑地址对应的页号为2。查页表,得到物理块号是4(十进制),即物理块地址为:0100 ,拼接块内地址10 0101 1100,得物理地址:01001001011100,即125CH。
五、计算与应用题
1. 一条小河上有一座独木桥,规定每次只允许一个人过桥。现假设河东、河西都有人要过桥,如果把每个过桥者看作一个进程,为保证安全,请用P、V操作实现正确管理。
令由东往西为方向1,由西向东为方向2。用计数器count[1]用来记录方向1的等待过河人数,计数器count[2]用来记录方向2的等待过河人数。让信号量wait[1]关联count[1],信号量wait[2]关联count[2]。 程序代码如下:
bgin semaphore:mutex:=1; semaphore:wait[1..2]:=0; int: count[1..2]:=0; cobegin process GO_BRIGE(i=1..2) begin P(wait[i]); if count[i]=0 then P(mutex); count[i]:=count[i]+1; V(wait[i]); “过桥”; P(wait[i]); count[i]:=count[i]-1; if count[i]=0 then V(mutex);