1、全国自考操作系统(进程通信)模拟试卷 4 及答案与解析一、单项选择题1 不能利用_实现父子进程间的互斥。(A)文件(B)外部变量(C)信号量(D)锁2 若执行信号量 S 操作的进程数为 3,信号量 S 初值为 2,当前值为-1,表示有_个等待相关临界资源的进程。(A)0(B) 1(C) 2(D)33 下列机构中不能用于进程间数据通信的是_。(A)消息(B)共享存储(C)信号量(D)管道4 在下面的 Socket 远程通信的系统调用中_是客户端程序中要用到的系统调用。(A)bind(B) 1isten(C) accept(D)connect5 在_情况下,计算机系统一定出现了死锁。(A)系统中所
2、有的进程都处于封锁状态(B)进程申请的资源数大大超过资源总数(C)计算机硬件或软件系统发生重大故障(D)两个进程互相等待对方占有的资源6 在某一时刻,进程 P1 和 P2 执行或将执行各处于下列关于互斥资源的操作序列:进程 P1 申请到资源 S1,申请资源 S2,释放资源 S1;进程 P2 已申请到资源 S2,申请资源 S1,释放资源 S2,系统继续并发执行进程 P1、P2,系统将_。(A)必定产生死锁(B)可能产生死锁(C)不会产生死锁(D)无法确定是否会产生死锁7 系统共有 9 个磁带机,如每个进程最多分配 3 台磁带机,系统要限制_个进程使用,就没有死锁的危险。(A)1(B) 2(C)
3、3(D)48 相继地剥夺进程所占的资源,直至相关进程能继续运行是一种_方法。(A)死锁预防(B)死锁避免(C)死锁检测(D)死锁解除二、填空题9 在进程的同步和互斥问题中,可以用布尔变量实现_。10 有 m 个进程共享一个同类临界资源,如使用信号量解决进程间的互斥问题,那么信号量的取值范围为_。11 信号量当前值大于零时其数值表示_。12 与 E-mail 类似的进程间数据通信机制是 _。13 M 个同类资源被 n 个进程共享时,设 z 为每个进程申请该类资源的最大量。只要不等式_成立,则系统一定不会发生死锁。三、简答题14 为什么单用布尔变量的锁是不安全的?15 在两个进程间的同步,如计算进
4、程和打印进程的经典例子中,为什么对一个缓冲区要设置两个变量,是否能只设置一个变量,例如,当为 0(缓冲区没数据)时 P1执行,为 1(缓冲区有数据)时,P2 执行,可以这样实现吗 ?16 简述远程过程调用的步骤。17 试说明资源的按序分配策略能防止死锁的原因。18 考虑有三个进程共享 9 个资源,它们的占有量和最大需求量如表 42 所示。如三个进程均再申请两个资源,按照银行家算法,应该分配给谁?四、综合题19 编一个 C 程序,使用户进程的全局变量作为输入输出的缓冲区,线程 1 一次读入一个字符串,将其存入缓冲区,线程 2 从缓冲区取出数据,输出打印,用线程的条件变量实现两个线程间的同步。程序
5、调试成功后用 IO 转向再测试程序,标准输入输出都改为文件。可以用条件变量实现线程之间的同步。条件变量就像是一面旗子,用于通知需要同步的进程。条件变量函数总是和互斥锁在一起使用。与一般的锁变量不同,与条件变量相关锁的常态是锁住的,而在执行了 pthread_cond_wait(&flag,&lock) 等待条件变量后,互斥锁 lock 就打开了,然后等待条件变量的变化。如果在调用此函数之前,互斥量没有被锁住,函数执行的结果是不确定的。在该函数返回之前,该函数自动将指定的互斥量重新锁住。pthread_cond_slgnal 函数通过条件变量发消息。若有多个线程都在等待,只唤醒它们中的一个,但一
6、般只用于一个线程等待该条件变量。有关的函数和操作定义如下:#includepthreadh#includectypehpthread_mutex_t mutex=PTHREAD_MOTEX_INITIALIZER; *初始化锁*pthread_cond_t cond=PTHREAD_COND_INITIALIZER; *初始化条件变量*pthread_cond_wait(pthread_cond_t*cond,pthread_mutex_t*mutex) ;*等待条件变量 cond,开互斥锁 mutex*pthread_cond_signal(pthread_cond_t*cond); *通知
7、条件变量 cond 状态变化*20 假如一个阅览室最多可容纳 n 个人,读者进入和离开阅览室时,都必须在每次只允许一个人写的登记表上做进入登记和离开登记,系统对读者进入和离开两个过程各建立一个控制进程,试用 semWait、semSignal 操作实现读者进入与读者离开间的协调关系。21 编一个 UNIX 平台上的 C 程序。在程序的开始部分设置信号 SIGUSR1 的处理方式为执行 delete 程序。在创建子进程后,父进程向子进程发送信号 SIGUSR1,并在子进程终止后显示子进程传来的返回参数。子进程发现已收到信号,就执行信号 SIGUSR1 所对应的处理程序 delete,该程序删除当
8、前目录下的 core 文件,如删除失败,终止本进程,传给父进程的参数为 1,否则从 delete 程序返回后,子进程显示 Success,传给父进程的参数为 0。五、判断题22 在分配磁盘等共享设备时,可能会引起死锁。( )(A)正确(B)错误23 锁有三个状态值:-1,0,1。( )(A)正确(B)错误24 为了实现计算进程和打印进程之间的相互同步,就需要设置一个信号量 S。( )(A)正确(B)错误25 读者和写者问题是进程间的同步与互斥问题。( )(A)正确(B)错误26 信号处理程序能在用户态下运行。( )(A)正确(B)错误27 能将信号发送给消息队列。( )(A)正确(B)错误28
9、 银行家算法是死锁预防算法。( )(A)正确(B)错误全国自考操作系统(进程通信)模拟试卷 4 答案与解析一、单项选择题1 【正确答案】 B【试题解析】 各个进程的外部变量,包括父子进程的同名外部变量都是独立存储的,不能作为公共的共享锁。【知识模块】 进程通信2 【正确答案】 B【知识模块】 进程通信3 【正确答案】 C【知识模块】 进程通信4 【正确答案】 D【知识模块】 进程通信5 【正确答案】 D【知识模块】 进程通信6 【正确答案】 B【试题解析】 但如两个进程没有申请到第二个资源时不能继续执行,就必定产生死锁。【知识模块】 进程通信7 【正确答案】 D【知识模块】 进程通信8 【正确
10、答案】 D【知识模块】 进程通信二、填空题9 【正确答案】 锁操作【知识模块】 进程通信10 【正确答案】 1-(m-1)【知识模块】 进程通信11 【正确答案】 可用相关资源的数目【知识模块】 进程通信12 【正确答案】 消息通信【知识模块】 进程通信13 【正确答案】 n(x-1)+1M【试题解析】 在最坏的情况下,每一个进程都已平均分配了 x-1 个该类资源,系统只要还剩下 1 个资源,就可以分配给某个进程使用,使该进程得到全部的资源后,就能运行到底,从而可释放它所占用 x 个资源,这样其他进程又能获得资源,就没有死锁的危险。用数学公式表示就是 Mn(x-1),或 n(x-1)+1M。【
11、知识模块】 进程通信三、简答题14 【正确答案】 用布尔变量实现的锁的关闭操作 LOCK 包含测试和关闭两个操作步骤,这两个操作步骤涉及临界资源,故这段程序也是临界段。假定锁是打开的,当一个进程 P1 在测试锁的状态后,还没来得及关闭它的一瞬间,发生了中断,中断返回时,系统可能调度另一个进程 P2 执行。P2 执行时也对该锁的状态进行测试,发觉它处于打开状态,于是关闭该锁,并进入临界段。在 P1 被重新调度时,继续执行原先测试锁的状态的后续操作,关闭该锁,进入临界段。假如此时 P2 还未退出临界段,那么两个进程就同时处于一个临界段之中,这就破坏了临界段的执行原则。【知识模块】 进程通信15 【
12、正确答案】 要采用这个方法,该变量一定要是共享变量,如通过共享内存机制分配,对该变量要互斥访问,如果用纯软件实现将比较复杂。另外还要专门设计分别针对这两个用户进程的阻塞和唤醒操作,这要求这两个独立进程要是互相可见的(要有权限,至少要知道对方的标识数),而不能采用轮询的耗费处理机时间的方法,这样做还不如使用两个信号量实现两个进程间的同步。【知识模块】 进程通信16 【正确答案】 在网络或分布式系统中,设有两个节点 A、B ,节点 A 上的进程调用节点 B 上的一个过程时,在节点 B 上执行被调用的进程,消息以参数的形式从调用进程传送到被调用进程,并将被调用进程执行的结果返回给调用进程,这种通信方
13、式称为远程过程调用(RPC)。RPC 是一个运行在 ACPIP 等协议之上的高层次的网络应用。通过使用 RPC,分布式应用程序员避免了知晓下层网络接口的细节。RPC 基本原理是允许某一节点上的程序调用其他节点上的过程或函数。RPC 程序遵循分布式编程的客户机服务器的模式。客户端建立一个过程调用将请求发送到服务器并被阻塞,直至收到答复,或超时请求到达时,服务器调用调度例程,执行并完成客户端所请求的服务后,将答复发送到客户端。RPC 调用完成之后,客户端程序继续执行。对程序员来说,他看不到消息传递过程和 IO 处理过程。【知识模块】 进程通信17 【正确答案】 资源的按序分配即首先要为各种互斥的共
14、享资源规定一个线性顺序。如果一个进程已经分配了类型 R 的资源,那么以后它只能申请在资源顺序表中排在 R 后面的资源类型。 如可把一种资源类型与一个索引值联系起来,当且仅当 ij 时,资源 Ri 排在资源 Rj 的前面。现假定进程 A 和进程 B 之间发生死锁,原因是 A 获得了 Ri 并申请 Rj,B 获得了 Rj 并申请 Ri。但是,这种情况是不可能发生的,因为那意味着 ij 且 ji。这样,在资源分配和等待图中就不可能出现环路。【知识模块】 进程通信18 【正确答案】 这时系统还剩下 3 个资源,各个进程还要申请的资源数见表 151。如三个进程均再申请两个资源,按照银行家算法,应该分配给
15、进程 P2,因为该进程总共还需 3 个资源,分配它后,系统还剩下 1 个资源,而 P2 也只需要 1 个资源,系统还处于安全状态。如果分配给其他两个进程,系统就处于不安全的状态,就有可能产生死锁。【知识模块】 进程通信四、综合题19 【正确答案】 实现该功能的 C 程序为程序清单 15-1。有关的函数和操作定义如下:#includepthreadh#includectypehpthread_mutex_t mutex=PAHREAD_MUAEX_INIAIALIZER;*初始化锁*pthread_cond_t cond=PAHREAD_COND_INIAIALIZER;*初始化条件变量*pth
16、read_cond_wait(pthread_cond_t*cond,pthread_mutex_t*mutex) ;*等待条件变量 cond,开互斥锁 mutex*pthread_cond_signal(pthread_cond_t*cond)j*通知条件变量 cond 状态变化*在程序清单 15-1 的 pthread_condc 中,主线程创建两个线程,线程 1 一次读入一个字符串,将其存入缓冲区,线程 2 从缓冲区取出数据,输出打印。主线程先初始化锁变量和条件变量值后,创建了两个线程,线程 1 通过 pthread_cond_wait 等待条件变量的变化。当一个线程将字符串存入缓冲区后
17、,线程 2 将缓冲区中的字符串取出并打印,并用 pthread_cond_signal 通知线程 1 条件变量的变化,主线程就可将输入的字符串存人缓冲区,如此循环执行。程序清单 15-1pthread_condC#includestdioh#includestdlib h#includepthreadh#includectypehpthread_mutex_t lock=PAHREAD_MUAEX_INIAIALIZER;*初始化锁后,锁是关闭的*pthread_cond_t empty=PAHREAD_COND_INIAIALIZER;*初始化条件变量 l*pthread_cond_t fu
18、ll=PAHREAD_COND_INIAIALIZER;*初始化条件变量 2*char buf256;main()pthread_t t1,t2;*两个线程 *void *put buf(void*);* 线程 1 执行的输入和存入缓冲区的函数*void *get buf(void*);* 线程 2 执行的从缓冲区读出和打印的函数 *pthread_mutex_lock(&lock);*先关闭锁,封锁对 buf 的访问*pthread_cond signal(&empty);pthread_create(t1,NULL,put_buf1);*创建线程 1*pthread_create(t2,N
19、ULL,get_buf);*创建线程 2*pthread_join(t1,NULL);*等待子线程 1 结束*pthread_join(t2,NULL);*等待子线程 2 结束*void*put_buf()*线程并发执行的函数 1*while(1)pthread_cond_wait(&empty,&lock);*等待条件变量状态变化(等待旗帜 empty“升起“),开锁*printf(“empty flag was raised,I have the lockn“);*条件变量已变化(旗帜 empty 已“升起“),获得了锁 (锁已开)*pthread_mutex_lock(&lock);*关
20、锁,竞争 buf*printf(“pthreal:input stringn“);gets(buf);*读入,存入缓冲区*pthread_mutex_unlock(&lock);pthread_cond_signal(&full);*升起条件变量旗帜,通知线程 2*升起旗帜,通知线程 2,可再在 buf 存放结果*void*get_buf()*线程并发执行的函数 2*sleep(2);while(1);pthread_cond_wait(&full,&lock);*等待条件变量状态变化(等待旗帜 full“升起“),开锁*printf(“full flag was raised,I have
21、the lockn“);*条件变量已变化(旗帜 full 已“升起“),获得了锁(锁已开)*pthread_mutex_lock(&lock);*关锁,竞争 buf*printf(“thread2 output:sn“,buf);*从缓冲区取出,打印*pthread_cond_signal(&empty);*升起条件变量旗帜,通知线程 1*。【知识模块】 进程通信20 【正确答案】 信号量含义和初值如下。chair:阅览室椅子数,即最多可容纳人数,初值为 N。register:进入登记和离开登记的互斥信号量,初值为 1。读者进入 读者离开semWait(chair); semWait(regi
22、ster);semWait(register); 离开登记讲入登记: semSignal(register) ;semSlgnal(reglSter); SemSignal(chair);阅读; 离开阅览室。【知识模块】 进程通信21 【正确答案】 实现该功能的 C 程序见程序清单 15-4。程序清单 15-4:signalc#includesystypes h#includesignalhmain()int pid,status;void delete();signal(SIGUSR1,delete);*预置信号处理程序*if(pid=fork()*创建子进程*kill(pid,SIGUSR
23、1) ;*发送信号*wait(&status);*等待子进程终止*printf(“status=dn“,status),elsesleep(10),printf(“Chiid: Successn“);exit(0);void delete()int ret;ret=unlink(core);*删除当前目录下的 core 文件*if(ret=-1)exit(1),return;。【知识模块】 进程通信五、判断题22 【正确答案】 B【知识模块】 进程通信23 【正确答案】 B【试题解析】 锁只有两个状态值 0、1。【知识模块】 进程通信24 【正确答案】 B【试题解析】 需要设置两个信号量。【知识模块】 进程通信25 【正确答案】 B【试题解析】 是一个纯互斥问题。【知识模块】 进程通信26 【正确答案】 A【试题解析】 信号机构能执行用户定义的函数,故能在用户态下运行。【知识模块】 进程通信27 【正确答案】 B【知识模块】 进程通信28 【正确答案】 B【试题解析】 银行家算法是死锁避免算法。【知识模块】 进程通信