循环缓冲区,或环形缓冲区是一种数据结构,它使用单个固定大小的缓冲区,就好像它是端到端连接一样。
循环缓冲区首先开始为空,并具有一些预定义的长度。例如,这是一个 7 元素的缓冲区:
[ ][ ][ ][ ][ ][ ][ ]
假设 1 被写入缓冲区的中间(其实精确的起始位置在循环缓冲区中无关紧要):
[ ][ ][ ][1][ ][ ][ ]
然后假设添加了另外两个元素 - 2 和 3 - 在 1 之后,附加:
[ ][ ][ ][1][2][3][ ]
如果从缓冲区中,删除了两个元素,则删除缓冲区内最旧的值。在这种情况下,删除的两个元素是 1 和 2,缓冲区只有 3:
[ ][ ][ ][ ][ ][3][ ]
如果缓冲区有 7 个元素,那么它就完全填满了:
[6][7][8][9][3][4][5]
当缓冲区已满时,将引发错误,警告客户端,进一步写入被阻止,直到插槽空闲为止。
当缓冲区已满时,客户端可以选择使用强制写入,覆盖最旧的数据。在这种情况下,添加了另外两个元素 - A 和 B - 它们会覆盖 3 和 4:
[6][7][8][9][A][B][5]
3 和 4 已被 A 和 B 取代,使得 5 现在是缓冲区中最旧的数据。最后,如果删除了两个元素,那么返回的是 5 和 6,和剩余的缓冲区:
[ ][7][8][9][A][B][ ]
因为有可用的空间,但如果客户端再次覆盖存储 C 和 D,那么先前存储 5 和 6 的空间将被使用,而不是 7 和 8 的位置。7 仍然是最旧的元素,缓冲区又是充分.
[D][7][8][9][A][B][C]