开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情
消息传递间接通信的实现方法
信箱的种类
- 私用信箱
- 用户进程为自己创建的信箱,是进程的一部分。 只有自己有权读,可采用单向链路实现。
- 公用信箱
- 由操作系统创建,所有系统核准进程都可使用, 采用双向通信链路实现。
- 共享信箱
- 由某进程创建并指明可共享,则拥有者和共享者可使用。
信箱的结构
间接通信方式
- 信箱的创建与撤消
- 信箱中消息的发送与接收
- 信箱使用规则
- 若发送信件时信箱已满,则发送进程被置为“等信箱”状态, 直到信箱有空时才被唤醒
- 若取信件时信箱中无信,则接收进程被置为“等信件”状态, 直到有信件时才被唤醒
Send实现
send(MailBox,M):
把信件M送到指定的信箱MailBox中
步骤:
- 查找指定信箱MailBox ;
- 若信箱未满,则把信件M送入信箱且唤醒“等信件”者;
- 若信箱已满,置发送信件进程为“等信箱”状态;
receive实现
receive(MailBox,X):
从指定信箱MailBox中取出一封信,存放 到指定的地址X中
步骤:
- 查找指定信箱MailBox ;
- 若信箱中有信,则取出一封信存于X中且唤醒“等信箱”者;
- 若信箱中无信件,置接收信件进程“等信件”状态
在操作系统空间设置一组缓冲区。
- 当发送进程需要发送消息时,执行send系统调用,产生访管 中断,进入操作系统。
- 操作系统为发送进程分配一个空缓冲区,并将所发送的消息 从发送进程copy到缓冲区中,然后将该载有消息的缓冲区连 接到接收进程的消息队列队尾,如此就完成了发送过程。
- 发送进程返回到用户态继续执行
- 在以后某个时刻,当接收进程执行到receive接收原语时,也产 生访管中断进入操作系统。
- 由操作系统将载有消息的缓冲区从消息队列中取出,并把消息 内容copy到接收进程空间,之后收回缓冲区,如此就完成了消 息的接收,接收进程返回到用户态继续进行