写出消息缓冲通信的 send原语和receive原语。

typedef struct message_buffer
{
    int sender;//发送者进程标识符
    int size;//消息长度
    char *text;//消息正文
    struct message_buffer *next;//指向下一个消息缓存区的指针
};
typedef struct processcontrol_block
{
    struct message_buffer *mq;//消息队列队首指针
    semaphore mutex;//消息队列互斥信号量
    semaphore sm;//消息队列资源信号量
    
};
message_buffer *a,*i,*b;
processcontrol_block *j;
void send(receiver,a)
{//receiver为接收进程标识符,a为发送进程首地址
    getbuf(a.size,i);//根据a.size申请缓冲区
    i.sender=a.sender;//将发送进程的内容复制到缓冲区i
    i.size = a.size;//
    copy(i.text,a.text);//将发送区a中的信息复制到消息缓冲区
    i.text  =  0;//因为缓冲区是在需要的时候才创建,所以赋值为0
    getid(PCBset,receiver.j);//取得发送进程的pcb设置,j为消息缓冲队列
    wait(j.mutex);//互斥访问消息队列
    insert(&j.mq,i);//将i的地址放置到j中的为空的第一个缓冲单元
    signal(j.mutex);//释放该消息队列的使用权
    signal(j.sm);//消息队列多了一个资源

}
void receive(b)
{
    j= internal name;//j为接收进程内部的标识符
    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);//释放消息缓冲区
}

 

posted @ 2022-04-24 16:46  YUYUUUU  阅读(396)  评论(0编辑  收藏  举报