信号量机制就是一种进程通信方式!!
通信方式:
通信方法:
发送进程直接将消息发送给接收进程,并将消息挂在接收进程 的消息队列上,接收进程从消息队列中取得消息。
发送进程发送消息到“信箱”中,接收进程从“信箱”中取得消息, 相应的系统称为电子邮件系统。
消息传递方式的变种很多,常用的有直接通信(消息缓冲区)方式和间接通信(信箱)方式,下图是消息传递通信机制模型。
发送者,在通信中存在两种可能的行为:
接收者,也存在两种可能的行为:
(1)发送者在发送消息前,先在自己的内存空间设置一个发送区,把欲发送的消息填入其中。
(2)发送者申请一个消息缓冲区,将已准备好的消息从发送区送到该消息缓冲区,并将发送者进程的名字、消息的开始地址以及消息的长度(通常以字节或字为单位)等信息填入该消息缓冲区中,然后把该消息缓冲区挂到接收进程的消息链上。
(3)接收者在接收消息前先在自己的内存空间设置相应的接收区。
(4)接收者摘下消息链上的第一条消息,将该消息从消息缓冲区复制到接收区,然后释放该消息缓冲区
struct messagebuffer{ int sender; //发送进程标识符 int size; //消息长度 char text[MAXSIZE]; //消息正文,MAXSIZE为数组text的长度 struct messagebuffer *next;// next为指向下一个消息缓冲区的指针}
void send(receiver,a){ lock out interrupts; //关中断 getbuffer(a.size,i); i.sender=a.sender; i.size=a.size; i.text=a.text; i.next=NULL; getid(PCBset,receiver,j); P(j.mutex); //互斥使用j的消息队列 Insert(j.mq,i); V(j.mutex); V(j.sm); unlock interrupts; //开中断}
void receive(b){ lock out interrupts; //关中断 j=internal name; P(j.sm); P(j.mutex); //互斥使用j的消息队列 Remove(j.mq,i); V(j.mutex); b.sender=i.sender; b.size=i.size; b.text=i.text; Releasebuff(i); unlock interrupts; //开中断}
(1)若发送信件时信箱已满,则发送进程应转变成等待信箱状态,直到信箱有空信格时才被唤醒。
(2)若取信件时信箱中已无信件,则接收进程转变成等待信件状态,直到有信件时才被唤醒。
(1)接收者创建属于自己的私用信箱;
(2)发送者产生一封信件(即一个消息)。
(3)发送者把信件投入接收者的私用信箱。
(4)接收者从自己的私用信箱中读取信件。
void deposit(boxname,msg){ lock out interrupts; //关中断 P(emptynum); //有空格子否,无则阻塞自己 选择标志位为空的格子; 把信件msg放入该空格子中; 置该格子的标志位为满; V(mesnum); //信件多了一个,若有接收者进程被阻塞则唤醒之 unlock interrupts; //开中断 }
void remove(boxname,msg){ lock out interrupts; //关中断 P(mesnum); //有信件否,无则阻塞自己 选择标志位为满的格子; 把该满格子中的信件放入msg中; 置该格子的标志位为空; V(emptynum); //空格子多了一个,若有发送者进程被阻塞则唤醒之 unlock interrupts; //开中断}
管道的作用类似于消息缓冲区(生产-消费),但有显著不同特点:
① 以文件为传输介质,可传输大量数据。
② 以字符流方式读写,不必以消息为单位。
③ 以队列方式工作,先写入的先读出。