什么是预分配缓冲区,您应该如何使用它?

What is a pre-allocated buffer, and how should you use one?

我正在研究 FreeRTOS,在他们的教程书中他们谈到使用“预分配缓冲区池”来保存指向 char[] 数组的指针(通过队列在任务之间传递)。

Chapter 4.5 Working with Large or Variable Sized Data 中找到的示例中,他们引用了这个名为 prvGetBuffer()sudo 函数并声明“未显示 prvGetBuffer() 的实现 –它可能会从预先分配的缓冲区池中获取缓冲区,或者只是动态分配缓冲区。”。这似乎是我想看一看的功能,但在他们的文档/示例中找不到它。

“预分配缓冲区池”到底是什么,C/C++ 中的实现是什么样的?我在互联网上找不到太多关于此的内容。

我想假设它可能是一个在 运行 时间之前“静态”分配的二维数组。也许它被声明为 char strBuffer[5][50]; 之类的 - idk.

What exactly is "a pool of pre-allocated buffers",

内存缓冲区是可以创建对象的内存区域。分配是获取资源的行为,在这种情况下,资源是内存缓冲区。

“Pre”前缀表示分配将在调用 prvGetBuffer 之前发生。 “池”是事物集合的抽象描述,例如数据结构。

池是共享项目的集合,例如 secretarial pool or motorpool

pre-allocated 个缓冲区池是一个内存块池。通常,池中的所有块大小都相同。应用程序可以从池中分配一个块,根据需要使用内存,然后在不再需要时 return 将块放入池中。 “Pre-allocated”表示块不会在程序的整个生命周期内从堆中重复动态分配。通常,块是静态分配的,并在初始化期间分配给池。

内存池通常被实现为FIFO queue, often using a linked list数据结构。从池中分配是从队列的开头获取下一个块。将块返回到池中就是将块添加到队列的末尾。链表很好,因为队列中项目的顺序可以在程序的整个生命周期中发生变化,因为项目不一定 return 按照它们从队列中分配的相同顺序进入队列。

使用 pre-allocated 缓冲区池是 avoid dynamic memory allocation 的好方法,这在嵌入式系统中是不可取的。