嵌入式系统设计师学习笔记十五:进程管理⑥——任务间的通信
嵌入式系统设计师学习笔记十五:进程管理⑥
任务间的通信
任务之间为了协调工作,需要相互交换数据和控制信息。
任务之间的通信可以分为两种类型:
①低级通信:只能传递状态和整数值等控制信息,例如信号量机制,异步信号机制等
②高级通信:能够传输任意数量的数据,主要有三类:共享内存、消息传递和管道。
共享内存:
各个任务共享其地址空间中的某些部分,在此区域,可以任意读写和使用任意的数据结构,把它看成一个通用的缓冲区。
使用共享内存来传送数据时,通常需和任务间的互斥机制结合起来,以免产生竞争条件,确保数据顺利传送。
消息传递:
消息:内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义,其内容可以是实际的数据、数据块的指针或空。
对消息内容的解释由应用程序完成。
①从操作系统观点看,消息没有定义的格式,所有的消息都是字节流,没有特定的含义。
②从应用观点看,根据应用定义的消息格式,消息被解释成特定的含义。
应用可以只把消息当成一个标志,这时消息机制用于实现同步。
消息传递:
任务与任务之间通过发送和接收信息来交换信息。
消息机制由操作系统来维护,包括定义寻址方式、认证协议、消息的数量等。
一般提供2个基本操作:
①send操作:发送一条消息
②receive操作:接收一条消息
任务间的通信方式:
直接通信:在通讯过程中双方必须明确地知道(命名)彼此:
Send(P,message) —— 发送一个消息到任务P
Receive(Q,message)—— 从任务Q接收一个消息
间接通信:通信双方不需要指出消息的来源或去向,而通过中间机制来通信。
如:
send(A,message)—— 发送一个消息给邮箱A
receive(A,message)—— 从邮箱A接收一个消息
一些操作系统内核把消息进一步分为:邮箱和消息队列。
邮箱仅能存放单条消息,它提供了一种低开销的机制来传送信息。每个邮箱可以保存一条大小为若干字节的消息。
消息队列可存放若干消息,提供了一种任务间缓冲通信的方法,间接通信方式。
消息队列状态图:
管道(pipe)
管道是提供非结构化数据交换和实现任务间同步的内核对象。在传统的实现中,管道是单向数据交换设施。
①数据在管道内像一个非结构字节流,按FIFO的次序从管道中读出。
②当管道空时,阻塞读者,当管道满时,阻塞写者。
管道允许有多个读者和写者。
管道的状态图:
管道与消息队列的区别:
①管道不存储多个消息,它存储的数据时非结构化的字节流;
②管道中的数据严格地遵循先进先出的顺序;
③管道支持选择(select)操作,而消息队列不支持。