操作系统(2.6.3)--直接消息传递系统实例

时间:2023-03-26 19:58:49

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

(1)消息缓冲区。在消息缓冲队列通信方式中,主要利用的数据结构是消息缓冲区。 它可描述如下:

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

(2) PCB中有关通信的数据项。在操作系统中采用了消息缓冲队列通信机制时,除了需 要为进程设置消息缓冲队列外,还应在进程的PCB中增加消息队列队首指针,用于对消息 队列进行操作,以及用于实现同步的互斥信号量mutex和资源信号量sm。在PCB中应增. 加的数据项可描述如下:

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

2.发送原语

操作系统(2.6.3)--直接消息传递系统实例

发送原语可描述如下:

void send(receiver, a) {receiver为接收进程标识符,a为发送区首址;
getbuf(a.size, i);根据a.size申请缓冲区;
copy(i.sender, a.sender);将发送区a中的信息复制到消息缓冲区i中:
i.size= =a.size;
copy(i.text, a.text);
i.next=0;
getid(PCBset,receiver:j);获得接收进程内部的标识符;
wait(j.mutex);
insert(&j.mq, i);将消息缓冲区插入消息队列;
signal(j.mutex); .
signal(j.sm); 

操作系统(2.6.3)--直接消息传递系统实例

3.接收原语

procedure receive(b)
begin
j:= internal name;
j为接收进程内部的标识符;
wait(j.sm);
wait(j.mutex);
remove(j.mq,i);
将消息队列中第一个消息移出;
signal(j.mutex);
b.sender:=i.sender;将消息缓冲区i中的信息复制到接收区b;
b.size:=i.size;
b.text:=i.text;
end

操作系统(2.6.3)--直接消息传递系统实例