直接消息传递系统实例|操作系统

本文详细介绍了消息缓冲队列通信机制中的数据结构,包括消息缓冲区和进程控制块(PCB)的相关字段,以及发送和接收原语的实现过程。发送原语负责将消息从发送进程传递到消息队列,而接收原语则用于从队列中摘取消息并将其传递给接收进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.消息缓冲队列通信机制中的数据结构

1)消息缓冲区

typedef struct message_buffer
{
	int sender;   //发送者进程标识符
	int size;     //消息长度
	char *text;   //消息正文
	struct message_buffer *next;  //指向下一个消息缓冲区
}

2)PCB有关通信的数据项

在操作系统中采用消息缓冲队列通信机制时,除了需要为进程设置消息缓冲队列以外,还应该在进程的PCB中增加消息队列的首指针,用于对消息队列进行操作,以及用于实现同步的互斥信号量(mutex)和资源信号量(sm)

在PCB增加的数据项

typedef struct processcontrol_block
{
	...
	struct message_buffer *mq;   //消息队列队首指针
	semaphore mutex;             //消息队列互斥信号量
	semaphore sm;                //消息队列资源信号量
	...
}PCB

2.发送原语

发送进程在利用发送原语发送消息之前,应先在自己的内存空间设置一发送区a,把带发送的消息正文,发送进程标识符,消息长度等填入其中

//a是发送区首地址
void send(reciver,a)
{
	getbuf(a.size,i);        //根据a.size申请缓冲区
	i.sender = a.sender;
	i.size = a.size;
	copy(i.text,a.text);     //将发送区a中的消息复制到缓冲区i中
	i.next=0;
	getid(PCBset,reciver.j); //获得接受进程内部的标识符j
	wait(j.mutex);           //j.mq消息队列是临界资源,操作前要wait()
	insert(&j.mq,i);
	signal(j.mutex);
	signal(j.sm);
}

接受原语

接收进程调用接收原语receive(b),从自己的消息缓冲队列mq中摘下第一个消息缓冲队列i,并将其中的数据复制到以b为首地址的指定消息接受区内。

void receive(b)
{
	j = internal name;    //接收进程内部的标识符
	wait(j.sm);
	wait(j.mutex);
	remove(j.mq,i);       //将消息队列中的第一个消息移出
	signal(j.mutex);
	b.sender = i.sender;
	b.size = i.size;
	copy(b.text,i.text);   //将消息缓冲区i中的信息复制到接受区b中
	releasebuf(i);         //释放消息缓冲区
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值