习题4
1 子进程中对于变量的修改为什么父进程感知不到?
答:因为父子进程的程序存储于各自不同的内存映像空间,因而一方对于其地址空间中变量或数据的修改另一方感知不到。(参考3.2.1中[例3-5]的结果分析)
2 软中断通信适用于什么场合?
答:软中断通信特别适合于系统或用户用来处理异步事件。
3 管道通信的使用条件是什么?
答:共享管道的进程必须是同一家族的进程,并由其祖先创建。
4 消息缓冲通信中发送进程与接收进程之间的同步由谁实现?共享内存通信中又由谁实现?
答:消息缓冲通信中发送进程与接收进程之间的同步由操作系统实现,共享内存通信中由用户自己编程实现同步。
5 Linux操作系统提供的进程通信机制有哪些种类?它们各自的特点是什么?
答:Linux操作系统提供的进程通信机制有低级通信和高级通信两种方式。低级通信包括软中断信号和信号量通信;高级通信包括管道、消息缓冲和共享内存。
1
第4章习题参考答案
低级通信中:
软中断通信简单,适合处理随机事件;
信号量用来实现进程间的同步和互斥。
高级通信中:
无名管道简单方便,但工作在单向通信方式,且只能在创建它的进程及其子孙进程之间共享;
消息缓冲可以在任意进程之间通信,而且自带同步工具,使用方便,但是信息复制消耗CPU的时间,不适宜于信息量大或操作频繁的场合;
共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,快捷、信息量大是其优点。缺点是不带同步工具,同步和互斥问题需要各进程利用其他同步工具解决,而且要求这些进程都在同一存储介质上运行,不方便网络通信。
因此,对于不同的应用问题,要根据问题本身的情况来选择进程间的通信方式。
6 如何使用Linux提供的信号量来实现进程的互斥和同步?
答:信号量及其P、V操作的实现方式归纳如下:
1. 定义信号量标识符:int semid;
2
第4章习题参考答案
如果有n个信号量,则需要分别定义n个不同的信号量标识符。
2. 定义信号量数据结构
⑴.定义P、V操作所用的数据结构:struct sembuf P,V;
⑵.定义给信号量赋初值的参数数据结构:union semun arg;
3. 申请只有一个信号量的信号量集semid=semget(IPC_PRIVITE,1,IPC_0666);
其中,第一个参数:IPC_PRIVATE由系统产生key值,也可以由用户使用具体的整型数值作为key值指定;第二个参数表示信号量集中只有一个信号量;操作权限取决于最后一个参数,0666表示任意用户可读可写,只设置semflag的IPC_CREAT位,则创建一个信号量集,如果该信号量集已经存在,则返回其标识符。
4. 分别对每个信号量semid赋初值
arg.val=初值;
semctl(semid,0,SETVAL,arg);
5. 定义信号量的P操作(供所有信号量的P操作使用)
P.sem_num=0;
P.sem_op=-1;
/*-1表示P操作时对信号量减1*/
3
第4章习题参考答案
P.sem_flg=SEM_UNDO;
6. 定义信号量的V操作(供所有信号量的V操作使用)
V.sem_num=0;
V.sem_op=1; /*1表示V操作时对信号量加1*/
V.sem_flg=SEM_UNDO;
7. 对信号量semid执行P操作:semop(semid,&P,1);
8. 对信号量semid执行V操作:semop(semid,&V,1);
9. 撤消信号量:semctl(semid,IPC_RMID,0);
因为信号量不是普通变量,对它赋初值只能通过semctl(semid,0,SETVAL,arg),其值的修改只能通过P、V操作,而不能使用普通的赋值语句。因此信号量的初值及其P、V操作需要事先定义好,然后才能在进程中执行P、V操作。
4
因篇幅问题不能全部显示,请点此查看更多更全内容