Minix操作系统进程间通信中有关消息传递机制的说明

来源:互联网 发布:小米手机如何连mac 编辑:程序博客网 时间:2024/05/15 23:43

 

                     Minix操作系统进程间通信中有关消息传递机制的说明

 


 消息传递是Minix中进程间通信的基础,本文根据对Minix源代码和《操作系统设计与实现》一书再进行描述。

 


1: Minix发送消息的类型有5种,由内核代码负责进程S 向进程D发送消息,消息的发送通常是由硬件中断和系统调用引起的。


在描写之前,先简要写出minix用于进程间消息传递所需要的数据结构。

(1)  进程描述符

 

Struct  proc{

 Proc_nr_t  p_nr (int,进程号)

struct  priv*p_priv(系统优先权表)

Char  p_rts_flags;

 

/*下面两个用于构建消息队列*/

struct proc* p_caller_q;

struct proc* p_q_link;

 

Message *p_messbuf; 消息

Proc_nr_t  p_getfrom;

Proc_nr_t  p_sendto;

}

 

 

进程间通信的实质就是进程SP_messbuf所指向的消息复制到进程DP_messbuf所指的内存,这个工作是由copyMess 完成的。

 

下面看看消息的结构:

typedef  struc{

int m_source;        //指出消息所属的进程

int m_type;            //指出消息的类型

union {                  

   mess_1   m_m1   ;

   mess_2   m_m2  ;

   mess_3   m_m3  ;

          mess_4   m_m4  ;  

mess_5   m_m5  ; 

mess_7   m_m7  ;

       mess_8   m_m8  ;

} m_u                        //消息的内容

}  message.

 

关于消息的内容为什么会使用Union类型,我想是消息的类型有很多。如果对每种消息中内容的描述都使用struc结构的话。则将使用的内存会是现在union结构的7倍左右。

 

 

 

消息的操作:

(1)     发送:当一个进程S要发送消息给进程D时,内核先检测进程D是否准备接收进程S的消息(即进程D是否阻塞在接受进程S的消息上),如果是,则消息从进程S的内存空间上通过CopyMess复制到进程D的内存空间上。内存空间的具体位置由S的进程描述符表(Proc)中的P_messbuf指针所指定。如果进程D没有等待从消息S传递消息过来,那么进程S阻塞在给进程D发送消息上,同时把自己加入到进程Dp_caller_q所指向的发送阻塞链表中,如下图所示。

 


(2)     接受: 对于消息的接受,内核先查看是否有在该进程中挂起的通知,如果有,则先处理通知,因为通知将优于普通消息进行处理。如果没有挂起的通知,则从图1中所示的队列中找到发送方S的消息,进行复制处理。如果发送方S只是为发送消息而阻塞的话,还要将S进程加入就绪队列中。