本文做内容介绍,不包含技术细节和使用说明。

Zephyr 内核使用一个通用数据结构库,这些数据结构也可以用到应用程序中。数据结构包含:

  • 链表
  • 包缓存
  • 红黑树
  • 环形缓存

需要注意的是:这些库访问数据结构的 API 都不是线程安全的。

链表 链接到标题

链表包含单向链表和双向链表:

单链表 : Zephyr 中单向链表以常数时间 O ( 1 ) 访问链表的头部和尾部元素,在头部前和尾部后插入元素,移除链表的头部元素。但要删除链表中的节点,则需要遍历链表进行搜索,因此需要线性时间 O ( n ) 。单链表节点内只存储指向下一个节点的一个指针。单向链表实现在下列文件中:

zephyr/include/zephyr/sys/slist.h zephyr/include/zephyr/sys/sflist.h

双向链表:Zephyr 中双向链表支持与单向链表相同的操作,并且还额外提供了在常数时间 O ( 1 ) 内在任意位置 ( 头部、尾部或内部节点 ) 进行插入和删除节点的能力。为了实现这些功能,双向链表每个节点需要存储两个指针,因此在运行时的代码和内存空间相较于单向链表会有些额外开销。双向链表实现在下列文件中:

zephyr/include/zephyr/sys/dlist.h

包缓冲区 链接到标题

包缓存包含 MPSC 和 SPSC:

MPSC 缓冲区 ( 多生产者单消费者 ): Multi Producer Single Consumer Packet Buffer ( MPSC ) 是一个用于存储数据包的循环缓冲区,按照先进先出的顺序进行处理。只有一个上下文 ( 消费者 ) 来消费数据。可能会有多个上下文 ( 生产者 ) 写入。数据包的生产和消费都分为两个步骤。生产者首先分配一定数量的空间,然后填充数据并提交。消费者首先声明要消费的数据包,获取指向数据包的指针和长度,在使用完这些数据后释放数据包。这种方法可以减少内存复制的次数,提高效率。MPSC 实现在下列文件中:

zephyr/include/zephyr/sys/mpsc_pbuf.h zephyr/lib/os/mpsc_pbuf.c

SPSC 缓冲区 ( 单生产者单消费者 ): Single Producer Single Consumer Packet Buffer ( SPSC ) 是一个用于存储数据包的循环缓冲区,按照先进先出的顺序进行处理。只有一个上下文 ( 消费者 ) 来消费数据,也只用一个上下文 ( 生产者 ) 产生数据。SPSC 消费者需要通过拷贝才能得到数据。SPSC 实现在下列文件中:

zephyr/include/zephyr/sys/spsc_pbuf.h zephyr/lib/os/spsc_pbuf.c

红黑树 链接到标题

排序的节点规模在运行时可能变得非常大,这时使用链表进行搜索操作的效率会变得很低 O(n) 。为了解决这个问题,Zephyr 提供了一种平衡树实现。平衡树在搜索和删除操作上的时间复杂度为 O(log2(n)) 。Zephyr 中平衡树采用红黑树算法。红黑实现在下列文件中:

zephyr/include/zephyr/sys/rb.h zephyr/lib/os/rb.c

环形缓冲区 链接到标题

环形缓冲区是一个循环缓冲区,其内容按照先进先出的顺序存储,可以按照下面两种模式操作

  • 字节模式:原始字节可以入队和出队
  • 数据项模式:带有元数据的多个 32 位字数据项,以最大 1020 字节的块从环形缓冲区入队和出队

环形缓冲区实现在下列文件中:

zephyr/include/zephyr/sys/ring_buffer.h zephyr/lib/os/ring_buffer.c

参考 链接到标题

https://docs.zephyrproject.org/latest/kernel/data_structures/index.html