- 论坛徽章:
- 0
|
LINUX IPC机制:
3.消息缓冲通信
相关含义:
满足IPC通信机制的通用规则:使用一个消息队列标识符(键值key)来唯一标识一个消息队列,并依此检查访问权限。这种通信的实现是通过多进程共享同一个消息队列。因此,消息队列是一个临界资源,针对同一消息队列的诸发送和接收进程必须互斥进入,这也由操作系统提供的发送和接收系统调用自动实现。
/*发送消息原语*/
send()
{
P(s2);
P(mutex);
将消息缓冲区msgbuf挂到消息队列;
V(mutex);
V(s1);
}
/*接收消息原语*/
receive()
{
P(s1);
P(mutex);
从消息队列取消息缓冲区msgbuf;
V(mutex);
V(s2)
}
实现方法:
int msgget ( key_t key, int msgflag );
创建标识为key值的消息队列或者获取已存在的消息队列的描述符msgid。
int msgsnd( int msgid, struct msgbuf*msgp, int size, int flag );
功能:
发送一个消息给指定描述符的消息队列。将msgp所指向的msgbuf中的消息复制到消息数据结构并挂到指定消息队列尾,唤醒等待消息的进程
int msgrcv( int msgid, struct msgbuf*msgp, int size, int type, int flag);
功能:
从指定的消息队列接收一个消息。将消息复制到msgp所指的msgbuf中,从消息队列中删除此消息,若消息未到则调用进程阻塞插入等待消息队列尾。
int msgctl( int msgid, int cmd, struct msgid_ds *buf );
功能:
查询一个消息队列的状态;设置或修改它的状态;撤消一个消息队列。
消息缓冲机制提供了任意进程间的信息交换方式,且自带同步工具,使用起来很方便。
但是无论发送进程还是接收进程,都必须有一个普通缓冲区与消息缓冲区之间的信息复制过程,因此这种通信方式对于信息量大或信息交换频繁的场合是不适合的。消息队列机制是客户/服务器模型中常用的进程通信方式。
4.共享存储区通信
相关含义:
允许多个进程共享同一块物理内存空间来实现进程之间的信息交换,其特点是没有中间环节,直接将共享的内存页面通过附接,映射到相互通信的进程各自的虚拟地址空间中,从而使多个进程可以直接访问同一个物理内存页面,如同访问自己的私有空间一样(但实质上不是私有的而是共享的)
实现方法:
shmget()获得一个内部标识为shmid的共享存储区。
shmat()
字符型共享内存:
shmat( int shmid, char *shmaddr, int msgflg, ulong *raddr );
数值型共享内存:
shmat( int shmid, int *shmaddr, int msgflg, ulong *raddr );
功能:
逻辑上将内部标识符为shmid的共享存储区附接到进程的虚拟地址空间shmaddr。
shmdt(viraddr);
功能:
将一个共享存储区从指定进程的虚拟地址空间断开。
shmctl(int shmid, int cmd, struct shmid_ds *buf)
功能:
对与共享存储区关联的各种参数进行操作,从而对共享存储区进行控制包括删除共享存储区。
通信方式小结
无名管道简单方便,但工作在单向通信方式,且只能在创建它的进程及其子孙进程之间共享;
消息缓冲可以在任意进程之间通信,而且自带同步工具,使用方便,但是信息复制消耗CPU的时间,不适宜于信息量大或操作频繁的场合;
共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,快捷、信息量大是其优点,但是不带同步工具,同步和互斥问题需要各进程利用其他同步工具解决,而且要求这些进程都在同一存储介质上运行,不方便网络通信。
5.信号量
相关含义:
主要用于进程间的互斥与同步。
实现方法:
创建一个新的信号量集或获取一个已经存在的信号量集
int semget(key_t key, int nsems, int semflg);
对信号量的P、V操作
int semop(int semid, struct sembuf * sops, unsigned nsops);
信号量集的控制函数
int semctl(int semid, int semnum, int cmd, union semun arg);
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/94732/showart_1912264.html |
|