A ring buffer is a way of storing information from a continuous stream in a fixed-size container. It’s called a ring buffer (or circular buffer) because conceptually, the two ends are joined. There’s no beginning or end of the storage. Imagine you hav a circular table. There’s a pointer to where on the ring the next bit of data should be added by the data producer, and that pointer works its way around the ring. But there’s also a pointer to where on the ring the next bit of data should be read by the data consumer, and that pointer works its way around the ring in the same direction, always consuming the oldest data and working its way to the newest data. If the producer adds data and moves its pointer, and it hits the consumer’s pointer, you have a buffer overrun. The producer gets stressed out and forgetful. There’s data to store and nowhere to put it. If the consumer reads data and moves its pointer, and it hits the producer’s pointer, you have a buffer underrun. The consumer has read all the data there is and is starting to get bored and cranky.
In the world of computers, ring buffers are often used to hold data that comes in from an input device for a very short time until it can be processed. It has the advantage of never needing to dynamically allocate or free memory, which is time-consuming. The big disadvantage is that “full is full”. You can’t easily make the ring larger without funky chaining and lookup tables, and then you’ve lost your performance advantage over keeping a pool of memory blocks around and reusing them.
Want to see how this relates to a really cool restaurant? Continue reading