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); //释放消息缓冲区
}