## 队列介绍 ### 什么是队列 队列(Queue),又称消息队列。是线程间实现通信的一种方式。实现了数据的存储和传递功能。根据优先级可以将数据写入到队列头或队列尾,但只能从队列的头处读取数据。 ### 为什么需要队列 用户在业务处理时,需要有大量数据的存储和传递功能,用户可以采用数组方式实现,但管理比较麻烦。UniProton的队列机制提供了通用的同步和异步通信机制,可以使各个相关任务/中断之间通过队列来发送和接收数据(消息)。队列发送和接收消息可以根据用户不同需求,传递不同长度的数据。 ## 概念解释 | 名称 | 解释说明 | | ---- | ---- | | 队列ID | 用于唯一标识一个队列,在创建队列时通过参数返回给用户,以便进行读写操作。 | | 队列消息单元 | 队列中数据读取的基本单元。每一次写队列,都会使用一个新的消息单元;每一次读队列,都会从最早写入的消息单元中读取数据。 | | 队列消息单元大小 | 指队列中成员的大小(成员大小均相等),单位:字节。 | | 队列长度 | 队列最大消息个数,即该队列最多支持的成员个数。单位:个。 | | 紧急写入 | 消息写入到队列头,优先读取。 | | 普通写入 | 消息写入到队列尾,按先进先出方式读取。 | ### 运作机制 创建队列时,根据用户传入队列长度和消息单元大小来开辟相应的内存空间以供该队列使用。在队列控制块中维护一个头指针Head和一个尾指针Tail来表示当前队列中数据存储情况。头指针Head表示队列中被占用消息的起始地址,尾指针Tail表示队列中空闲消息的起始地址。 - 刚创建时Head和Tail指针均指向队列起始地址。 - 在写队列时,先PEND一下写的信号量;再根据Tail指针找到被占用消息单元末尾的空闲消息单元(紧急消息是头部的空闲消息单元)作为数据写入对象;如果Tail指针已经指向队列尾则采用回卷方式重新指向队列头;最后POST读的信号量。 - 在读队列时,先PEND一下读的信号量;根据Head指针找到最先写入队列中的消息单元进行读取;如果Head指针已经指向队列尾则采用回卷方式重新指向队列头;最后POST写的信号量。