|
知识路径: > 嵌入式系统软件基础知识 > 嵌入式操作系统基础知识 > 处理器管理 > 任务间通信(共享内存、消息、邮箱、管道、信号等) > 任务间通信 >
|
相关知识点:3个
|
|
|
|
消息是内存空间中一段长度可变的缓冲区,其长度和内容均由用户定义。从操作系统的角度来看,所有的消息都是单纯的字节流,既没有确切的格式,也没有特定的含义。对消息内容的解释是由应用来完成的,应用根据自定义的消息格式,将消息解释成特定的含义,如某种类型的数据、数据块的指针或空。
|
|
|
消息传递指的是任务与任务之间通过发送和接收消息来交换信息。
|
|
|
消息机制由操作系统来维护,包括定义寻址方式、认证协议、消息的数量等。一般提供两个基本的操作:send操作,用来发送一条消息;receive操作,用来接收一条消息。如果两个任务想要利用消息机制来进行通信,它们首先要在两者之间建立一个通信链路,然后就可以使用send和receive操作来发送和接受消息。
|
|
|
任务之间的通信方式可以分为直接通信和间接通信两种。
|
|
|
(1)直接通信。在直接通信方式下,通信双方必须明确知道与之通信的对象。采用类似下面的通信原语:
|
|
|
.send(P,message):发送一条消息给任务P;
|
|
|
.receive(Q,message):从任务Q那里接收一条消息。如果没有收到消息,可以阻塞起来等待消息的到来,也可以立即返回。
|
|
|
在通信双方之间存在一条通信链路,该链路具有如下特征:
|
|
|
|
.每条链路只涉及一对相互通信的任务,每对任务之间仅存在一条链路;
|
|
|
|
(2)间接通信。在间接通信方式下,通信双方不需要指出消息的来源或去向,而是通过共享的邮箱(mailbox)来发送和接收消息,每个邮箱都有一个唯一的标识。采用类似下面的通信原语:
|
|
|
.send(A,message):发送一条消息给邮箱A;
|
|
|
.receive(A,message):从邮箱A接收一条消息。
|
|
|
|
.对于一对任务,只有当它们共享一个公共邮箱时才能进行通信;
|
|
|
.一个邮箱可以被多个任务访问,每对任务也可以使用多个邮箱来通信;
|
|
|
|
邮箱只能存放单条消息,它提供了一种低开销的消息传递机制,其状态只有两种:空或满。另外一种间接通信机制是消息队列。它与邮箱是类似的,但可以同时存放若干条消息,提供了一种任务间缓冲通信的方法。如下图所示,发送消息的任务将消息放入队列,而接收消息的任务则将消息从队列中取出。
|
|
|
|
|