要求诸进程公用某些数据结构,来实现进程间的信息交换。
为了传输大量的数据,在存储器中划出一块共享存储区,诸进程通过对共享存储区中数据的读或写来实现通信。
管道:是指用于连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又名pipe文件。
在消息传递系统中,进程间的数据交换,是以格式化的消息为单位的,将通信的数据封装在消息中,并利用OS提供的一组通信命令(原语),在进程间进行消息传递,完成进程间的数据交换。
不仅能实现大量数据的传递,而且还隐藏了通信的实现细节
多个进程在进行交换信息时,如何传递信息,即消息传递通信的实现方法。按照源进程向目标进程传递消息时是以直接的或间接的方式而分为直接通信方式、间接通信方式。
利用OS提供的发送原语,直接把消息发送给目标进程
OS提供两条通信命令(原语):
Send(receiver,message); //发送一个消息给接收进程;
Receive(sender,message); //接收Sender发来的消息;
Receive (id,message); //返回接收到该消息进程的标识符
在单机系统中,发送进程和接收进程处于同一台机器中,环境相同,传递的消息格式比较简单。
消息较短,存放消息的内存空间比较小,但对于发送消息的用户不方便。
在计算机网络环境下,发送进程和接收进程所处环境不同,消息格式较复杂。
长度可变,对于发送消息的用户较方便,但存放消息的内存空间较大。
设置适当的同步机制使进程间能够协调的进行通信
为了在发送进程和接收进程之间能进行通信,必须在两者之间建立一条通信链路。
进程之间的通信需要通过设置一个共享数据结构的实体来完成
Send(mailbox, message); //将一个消息发送到指定信箱;
Receive(mailbox, message); //从指定信箱中接收一个消息;
type struct message_buffer { //记录型
int sender; //发送者进程标识符
int size; //消息长度
char *text; //消息正文
struct message_buffer *next; //指向下一个消息缓冲区的指针
}
type struct processcontrol_block {
…
mq; //消息队列队首指针
mutex; //消息队列互斥信号量用于实现进程互斥
sm; //消息队列资源信号量用于实现进程共同步
…
}
这就是PCB中应增加的三项数据,这些都是保存在接收进程的PCB中的。
void send(receiver,a) {
getbuf(a.size, i);
i.sender := a.sender;
i.size := a.size;
copy(i.text, a.text);
i.next := 0;
getid(PCB set, receiver.j);
wait(j.mutex);
insert(j.mq, i);
signal(j.mutex);
signal(j.sm);
}
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);
releasebuf(i);
}
原文:https://www.cnblogs.com/weiyalin/p/10806044.html