[操作系统]进程通信------发送者/接受者问题

mac2024-07-22  62

目录

 

进程通信

分类

类型

直接通信

空缓冲块个数+消息缓冲队列中消息的个数=缓冲池中缓冲块总个数     

PCB中有关通信的数据项:

发送原语:send(Receiver,a) 

接收原语:Receive(b)

互斥

同步


进程通信

定义:就是进程间进行数据交换

分类:    

1低级:控制进程的执行速度

2高级:交换进程间数据

类型:

1共享存储器系统:----用于少量通信

向系统申请一个或多个分区,获得分区后即可读/写

2消息传递系统:-----是目前主要的通信方式

分为直接通信和间接通信

3管道通信:-------用于大量通信

连接读进程和写进程文件,以文件为基础,实质上是以外存进行通信

直接通信

生产者和消费者利用公用缓冲池对信息进行交换

发送者进程直接将消息送入内存公用消息缓冲池,并将它挂接在接收者进程的消息缓冲队列上,接收进程从消息缓冲队列中取走消息。

空缓冲块个数+消息缓冲队列中消息的个数=缓冲池中缓冲块总个数     

PCB中有关通信的数据项:

mq :消息队列头指针;

mutex :消息队列互斥信号量,初值为1;

sm 同步信号量,用于消息队列中的消息计数,初值为0;

Emphead:空缓冲队列头指针;

Bufmutex:缓冲池的互斥信号量,初值为1;

Bufempty:缓冲池的同步信号量,初值为n;

发送原语:send(Receiver,a) 

----用来发送消息,其中receiver 是接收者进程,a是发送区起始地址

申请一个空缓冲块,将以a为首址的信息写入空缓冲块,将该缓冲块挂入消息缓冲队列

摘链:

从缓冲池中摘取结点i(类C代码)

if(Empty!=null){ i=EmptyHead.next; EmptyHead->next=i->next; }  挂链:链入消息缓冲队列

if(mq!=null){ i->next=mq->next; mq->next=i; }

接收原语:Receive(b)

用来接收消息,b是接收区首地址;

从消息缓冲队列中取一条消息,将该消息链入以b为首址的接收区,释放消息缓冲块

同步互斥关系实现:

互斥:

发送者进程和接受者进程对缓冲池的互斥访问,互斥信号量BufMutex初=1,表示缓冲池空闲

发送者进程和接受者进程对消息缓冲队列的互斥访问,互斥信号量Mutex=1,表示消息缓冲队列空闲

同步:

当EmptyHead为空/mq为满时:同步信号量BufEmpty初=0,表示没有空缓冲块当EmptyHead为满/mq为空时:同步信号量sm初=0,表示消息缓冲队列中没有消息

每发送一条消息:EmptyHead-1  sm+1

 

 

最新回复(0)