进程间通信(二)

来源:互联网 发布:unity3d 节点 编辑:程序博客网 时间:2024/05/31 06:21

1. 互斥锁与二值信号灯的区别在哪里

信号灯强调共享资源,只要共享资源可用,其他进程同样可以修改信号灯的值,互斥锁更强调进程,占用资源的进程使用完资源后,必须由进程本身来解锁

 

2. 信号灯的竞争问题该怎么解决

第一个创建信号灯的进程在初始化信号灯时,第二个进程又调用semget,并且发现信号灯已经存在,此时,第二个进程必须具有判断是否有进程正在对信号灯进行初始化的能力。绕过这种竞争状态的方法:当semget创建一个新的信号灯时,信号灯结构semid_dssem_otime成员初始化后的值为0,因此,第二个进程在成功调用semget后,可再次以IPC_STAT命令调用semctl,等待sem_otime变为非零值,此时可判断该信号灯已经初始化完毕

 

3. 进程间同步通信与异步通信有什么关联

当两个进程并发执行时,由于资源共享或者进程合作,使同处于一个系统中的进程之间可能存在以下两种形式的同步关系:间接同步关系(间接制约);直接同步关系(直接制约)

 

4. 共享内存的优缺点是什么

优点:相对其他方式有更少的数据拷贝,效率较高;随内核持续,相比于随进程持续生命力更强

缺点:自身不具备同步机制。

 

5. 信号灯的应用有哪些

信号灯相当于内存中的标志,进程可以根据它判断是否能够访问某些共享资源,同时,进程也可以修改该标志。除了用于访问控制外,还可用于进程同步。

 

6. mmmap()和系统V的区别在哪里

系统V共享内存中的数据,从来不写入到实际磁盘文件中,而通过mmap()映射普通文件实现的共享内存通信可以指定何时将数据写入到磁盘文件中。

系统V共享内存是随内核持续的,即便所有访问共享内存的进程都已正常结束,共享内存区仍然存在,在内核重新引导之前,对该共享内存区域的任何改写操作都将一直保留。

通过调用mmap()映射普通文件进行进程间通信时,一定要注意考虑进程何时终止对进程的影响,而通过系统V共享内存实现通信的进程则不然。

 

7. 系统V共享内存的应用有哪些

共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制。共享内存可以通过系统V共享内存机制实现。应用接口和原理很简单,内部机制复杂。为了实现更安全通信,往往还与信号灯等同步机制

共同使用

 

8. 几种IPC的优缺点

Socket:方式实现起来比较简单;自身携带同步机制,不需要额外的方式来辅助实现同步;随进程持续。

共享内存:相对其他方式有更少的数据拷贝,效率较高;自身不具备同步机制;随内核持续,相比于随进程持续生命力更强。

管道:只能用于有亲缘关系间进程的通信;只支持单向数据流;自身具备同步机制;随进程持续。

FIFO:是有名管道,支持没有亲缘关系的进程通信;需要创建两个描述符来实现实现双向通信;自身具备同步机制;随进程持续。

信号:这种通信可携带的信息极少,不适合需要经常携带数据的通信;不具备同步机制,类似于中断,什么时候产生信号,进程是不知道的。

消息队列:使用一个路径名来实现各个无亲缘关系进程之间的通信;提供有格式的字节流;消息具有类型和优先级;具备同步机制;随内核持续。

 

9. 进程间通信方式的分类有哪些方法

进程间通信主要包括管道,系统IPC(包括消息队列,信号,共享存储),套接字

管道包括三种:普通管道PIPE,流管道s_pipe,命名管道

 

10. 使用信号的注意事项有哪些

防止不该丢失的信号丢失;

考虑到程序的可移植性,应该尽量采用POSIX信号函数;

为了增强程序的稳定性,在信号处理程序中应当使用可再入函数