嵌入式系统设计师学习笔记十五:进程管理⑥

任务间的通信

任务之间为了协调工作,需要相互交换数据和控制信息。

任务之间的通信可以分为两种类型:

①低级通信:只能传递状态和整数值等控制信息,例如信号量机制,异步信号机制

②高级通信:能够传输任意数量的数据,主要有三类:共享内存、消息传递和管道

共享内存:

各个任务共享其地址空间中的某些部分,在此区域,可以任意读写和使用任意的数据结构,把它看成一个通用的缓冲区。

使用共享内存来传送数据时,通常需和任务间的互斥机制结合起来,以免产生竞争条件,确保数据顺利传送。

在这里插入图片描述

消息传递:

消息:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义,其内容可以是实际的数据、数据块的指针或空。

对消息内容的解释由应用程序完成。
①从操作系统观点看,消息没有定义的格式,所有的消息都是字节流,没有特定的含义。
②从应用观点看,根据应用定义的消息格式,消息被解释成特定的含义。
应用可以只把消息当成一个标志,这时消息机制用于实现同步。

消息传递
任务与任务之间通过发送和接收信息来交换信息。

消息机制由操作系统来维护,包括定义寻址方式、认证协议、消息的数量等。

一般提供2个基本操作:
①send操作:发送一条消息
②receive操作:接收一条消息

任务间的通信方式:

直接通信:在通讯过程中双方必须明确地知道(命名)彼此:
Send(P,message) —— 发送一个消息到任务P
Receive(Q,message)—— 从任务Q接收一个消息

间接通信:通信双方不需要指出消息的来源或去向,而通过中间机制来通信。
如:
send(A,message)—— 发送一个消息给邮箱A
receive(A,message)—— 从邮箱A接收一个消息

一些操作系统内核把消息进一步分为:邮箱和消息队列。

邮箱仅能存放单条消息,它提供了一种低开销的机制来传送信息。每个邮箱可以保存一条大小为若干字节的消息。

消息队列可存放若干消息,提供了一种任务间缓冲通信的方法,间接通信方式。
在这里插入图片描述

消息队列状态图:

在这里插入图片描述

管道(pipe)

管道是提供非结构化数据交换和实现任务间同步的内核对象。在传统的实现中,管道是单向数据交换设施。
①数据在管道内像一个非结构字节流,按FIFO的次序从管道中读出。
②当管道空时,阻塞读者,当管道满时,阻塞写者。
在这里插入图片描述

管道允许有多个读者和写者。

在这里插入图片描述

管道的状态图:

在这里插入图片描述

管道与消息队列的区别:

①管道不存储多个消息,它存储的数据时非结构化的字节流;

②管道中的数据严格地遵循先进先出的顺序;

③管道支持选择(select)操作,而消息队列不支持。