【教学课件】第4章进程间通信.ppt
《【教学课件】第4章进程间通信.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第4章进程间通信.ppt(22页珍藏版)》请在三一办公上搜索。
1、第4章 进程间通信 3,2023/8/6,2,4.4 Linux消息缓冲通信(消息队列)4.4.1 消息缓冲通信概述,1.Linux消息队列概述消息队列满足IPC通信机制的通用规则:使用一个消息队列标识符(键值key,参考上节中的ipc_perm结构)来唯一标识一个消息队列,并依此检查访问权限。通过多进程共享同一个消息队列实现。消息队列本身是一个临界资源,需实现互斥操作。,2023/8/6,3,2.Linux消息缓冲通信的数据结构,消息缓冲区msgbuf该数据结构用来存放需要发送或接收的消息类型和消息正文。消息缓冲区msgbuf的结构在/usr/src/linux-2.4/include/li
2、nux/msg.h文件中描述如下:/*message buffer for msgsnd and msgrcv calls*/struct msgbuf long mtype;/消息类型,由用户约定char mtext1;/消息正文;,mtext1是消息正文,该域可由程序员定义为任意数据结构,但消息及消息队列的长度有限,其设置在系统配置时可以改变,其缺省值定义在/usr/src/linux-2.4/include/linux/msg.h中:#define MSGMNI 16/*=IPCMNI*/*max#of msg queue identifiers*/#define MSGMAX 8192
3、/*=INT_MAX*/*max size of message(bytes)*/#define MSGMNB 16384/*=INT_MAX*/*default max size of a message queue*/,2023/8/6,4,2.Linux消息缓冲通信的数据结构,每条消息使用一个数据结构msg_msg进行描述,并通过指针*next与msgbuf链接成一个完整的消息实体。同一消息队列中的消息通过m_list表组织起来,形成一个满足同一key值的消息队列。msg_msg数据结构在文件/usr/src/linux-2.4/ipc/msg.c中定义为:/*one msg_msg s
4、tructure for each message*/struct msg_msg struct list_head m_list;long m_type;int m_ts;/*message text size*/struct msg_msgseg*next;/*the actual message follows immediately*/;,2023/8/6,5,消息队列链表msgque,Linux内核维护一个消息队列链表msgque,该表描述了当前系统中的消息队列。链表中每个元素指向一个描述消息队列的kern_ipc_perm结构,以及与该消息队列有关的3个队列结构的头元素:消息缓冲队
5、列、接收进程等待队列、发送进程等待队列。同时,还保留有关队列变动的时间以及进程标识等信息。其结构定义在/usr/src/linux-2.4/ipc/msg.c文件中:/*one msq_queue structure for each present queue on the system*/struct msg_queue struct kern_ipc_perm q_perm;time_t q_stime;/*last msgsnd time*/time_t q_rtime;/*last msgrcv time*/time_t q_ctime;/*last change time*/uns
6、igned long q_cbytes;/*current number of bytes on queue*/unsigned long q_qnum;/*number of messages in queue*/unsigned long q_qbytes;/*max number of bytes on queue*/pid_t q_lspid;/*pid of last msgsnd*/pid_t q_lrpid;/*last receive pid*/struct list_head q_messages;struct list_head q_receivers;struct lis
7、t_head q_senders;,2023/8/6,6,3.Linux消息缓冲通信数据结构之间的关系,2023/8/6,7,发送消息原语与接收消息原语的同步互斥算法描述如下:,/*发送消息原语*/send()P(s2);P(mutex);将消息缓冲区msgbuf挂到消息队列;V(mutex);V(s1);,/*接收消息原语*/receive()P(s1);P(mutex);从消息队列取消息缓冲区msgbuf;V(mutex);V(s2),/*mutex 为互斥信号量,s1表示消息队列上是否有消息,s2表示消息队列是否有空(允许长度)*/int mutex=1,s1=0,s2=n;,2023/
8、8/6,8,4.发送和接收消息执行过程,2023/8/6,9,发送消息进程与接收消息进程:,发送进程在调用send()原语之前,先要作好以下准备工作:申请一个消息缓冲区msgbuf;复制消息到缓冲区msgbuf;,接收进程在接收到消息后要做以下善后处理:将消息缓冲区msgbuf中的消息复制到进程存储空间;释放消息缓冲区msgbuf;,2023/8/6,10,4.4.2 Linux消息缓冲通信的系统调用,共提供了4个系统调用msgget()Msgsnd()msgrcv()Msgctl()所用头函数:#include#include,2023/8/6,11,4.4.2 Linux消息缓冲通信的系统
9、调用,1.创建一个消息队列或获取已存在消息队列的标识格式:int msgget(key_t key,int msgflag);功能:创建标识为key值的消息队列或者获取已存在的消息队列的描述符msgid。参数说明:msgqid该系统调用返回的消息队列描述符,-1表示失败;key用户指定的消息队列标识符,为一正整数,其值可以由用户指定,如果使用IPC_PRIVATE则由系统产生key值;flag用户设置的标志或访问方式,其值由操作权限和控制命令进行或运算得到。返回:正确返回该消息队列的描述符msgid;错误返回1。通常使用语句:msgid=msgget(Key,0666|IPC_CREAT);,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 教学课件 教学 课件 进程 通信
链接地址:https://www.31ppt.com/p-5658882.html