This is the
talk page for discussing improvements to the
Circular buffer article. This is not a forum for general discussion of the article's subject. |
Article policies
|
Find sources: Google ( books · news · scholar · free images · WP refs) · FENS · JSTOR · TWL |
![]() | This article is rated Start-class on Wikipedia's
content assessment scale. It is of interest to the following WikiProjects: | ||||||||||||||||||||||||||||||||||||||||
|
Try putting 1..N, followed by getting 1..N times, then try putting, where the buffer is empty shows it is full. — Preceding unsigned comment added by 4ureyz ( talk • contribs) 18:18, 25 November 2023 (UTC)
The template queue's IsFull function is incorrect. Notice it is identical to IsEmpty(), only advancing the tail before doing a check. Consider: Q::Resize(2); Q::Enqueue(T); Q::Enqueue(T); The second enqueue will throw as IsFull reports true (tail=1, +1 & mask = head == true) — Preceding unsigned comment added by 98.232.107.82 ( talk) 23:09, 12 June 2011 (UTC)
When was the ring buffer invented or first publicly discussed or first mentioned in an academic paper or first used in an actual operating system? 209.252.104.131 ( talk) 10:47, 16 March 2008 (UTC) ring buffer has been invented by Alblas Hans (pe1ayx) publicly made in 1993-1995 in linux kernel source tree in /drivers/char/scc.c under the name buffer pool concept and ring buffer chain. copyricht by none gnu use —Preceding unsigned comment added by 83.101.55.202 ( talk) 15:35, 3 October 2010 (UTC)
one still has to always check before a read or a write if the read pointer and a write pointer overlap.
this is never needed incase of a simple write ->read->write buffer a simple write->read->write kind of buffer works sequentially and simply does not let one write to the buffer is someone has not read what is already written because it assumes buffer_size=max message size and simply keeps check of whether the buffer is read or not.
In Circular buffer mechanics paragraph, it says that the start pointer points to the start of valid data and the end pointer points to the end of valid data. So, in my understanding, and according to the figures:
In the following paragraph Difficulties, a full buffer is represented with start = end. This is the same for the free buffer. We can suppose that the rule is different in this paragraph: the start pointer points to the start of valid data and the end pointer points to the next element after the end of valid data (if any). If there is no valid data, start = end.
Did I miss something ? —Preceding unsigned comment added by 84.14.106.33 ( talk) 14:45, August 27, 2007 (UTC)
You didn't miss anything, the Circular buffer mechanics paragraph is incorrect, the first pointer will point to the first element to be read, and the second pointer will point to the first element to be written. I'm going to try to remember this when I have some time to correct the diagrams and fix it. 70.230.2.66 ( talk) 23:24, 10 March 2008 (UTC)
In Circular buffer mechanics it talks about a "buffer border". What is the buffer border and when can it be "read over"? 137.44.2.188 ( talk) 09:51, 9 April 2008 (UTC)
I rewrote the sentence about a "buffer border" to hopefully make it more clear. Maybe the 'clarify' notice can be removed? Shervinemami ( talk) 18:50, 1 July 2010 (UTC)
The RRDtool currently mentions a "a round-robin archive (RRA).", and the brief description reminds me of a circular buffer. Is "round-robin archive" an exact synonym for "circular buffer", or some specific variant of a circular buffer? Or is it something significantly different? -- 68.0.124.33 ( talk) 00:49, 15 January 2009 (UTC)
When checking to see how much space is used in the buffer, needing to be read (The space between the write and read pointers) could you not just use another variable, incrementing it as you write something, and decrementing it as you read something? For example, once it is initialized, the buffer is empty therefore your variable would = 0. But once you write, say 3 bytes, with out reading something, the variable would than = 3. And again after reading 2 bytes, that same variable would equal 1, effectively indicating that there is one byte remaining to be read in the buffer. This eliminates the need for any crazy algorithms for when your write pointer has wrapped around before you read pointer has. —Preceding unsigned comment added by 205.250.74.174 ( talk) 23:15, 17 June 2009 (UTC)
I find the C# example distinctly uninformative and overly verbose. While perhaps it shows good design, it doesn't illustrate the subject matter any better than the other two C examples. I'm removing it for now. SiegeLord ( talk) 18:33, 13 September 2010 (UTC)
Another solution not mentioned in the article is to have an additional boolean variable. When an element is inserted, it is set to true, and when an element is removed, it is set to false. If the indices are equal and the variable is true, the buffer is full. If the indices are equal and the varaible is false, the buffer is empty. Platypus1130 ( talk) 21:58, 30 January 2011 (UTC)
Please don't replace the C code with some pseudo code which doesnt really help anybody... — Preceding unsigned comment added by 130.149.245.245 ( talk) 16:17, 19 December 2012 (UTC)
Is it really useful to have two full implementations of a ring buffer? Wouldn't it be better to just have some pseudo code? This is an encyclopedia, not a pastebin, is it not? —Preceding unsigned comment added by 142.244.143.199 ( talk) 17:22, 12 April 2011 (UTC)
Agreed, it's currently quite unencyclopaedic. See below a simpler C implementation which I think works as an easy-to-understand example without being too C-specific. I suggest replacing the whole "Difficulties section" using this as a starting point. Thoughts? HoboBen ( talk) 20:05, 20 April 2011 (UTC) Edit: spoke too soon, there's a bug in my RetrieveFromQueue function where start==end when it's full. Needs to be fixed first. HoboBen ( talk) 21:05, 21 April 2011 (UTC)
Fixed. HoboBen ( talk) 16:06, 22 April 2011 (UTC)
While it might not be written in its founding statement, many people turn to wikipedia as a place to quickly learn about a topic. I wanted to quickly learn about circular buffers - specifically, how to use them - and I found the description, as well as the implementations, to be extremely useful. I don't think it would be "better" to remove some information that some might find useful. It is at the bottom of the article - you only scroll to that section if you want to read it. However, I STILL think there is a problem with the implementation, though. I'm not sure why the IsFull and IsEmpty variables are included in the read/write functions, and they seem to be updated at the wrong time (before the increment). Hithisishal ( talk) 07:31, 10 January 2012 (UTC)
#define BUFFER_SIZE 256 item *buffer[BUFFER_SIZE]; int start = 0; int end = 0 int active = 0; void PushToQueue(item *p) { buffer[end] = p; end = (end + 1) % BUFFER_SIZE; if (active < BUFFER_SIZE) { active++; } else { /* Move start to next-oldest */ start = (start + 1) % BUFFER_SIZE; } } item *RetrieveFromQueue(void) { item *p; if (!active) { return NULL; } p = buffer[start]; start = (start + 1) % BUFFER_SIZE; active--; return p; }
Can we please get consensus on replacing the current C examples with this alternative? Agree, disagree, or suggest modifications below. HoboBen ( talk) 12:58, 27 July 2011 (UTC)
Initialization:
p1=0; p2=0; numItems=0; isFull=false; isEmpty=true;
Function put(x):
array[p1] = x; p1++; numItems++; // insert item and advance write pointer
Function get():
return array[p2]; p2++; numItems--; // remove item and advance read pointer
With either function:
if (p1= arrayLength) then p1 = 0; // reset write pointer to beginning if we've reached the end ("ring" around)
if (p2= arrayLength) then p2 = 0; // same for read pointer
if (p1<0) then p1 = arrayLength; // reset write pointer to end of buffer if we've reached the beginning
if (p2<0) then p2 = arrayLength; // same for read pointer
if (numItems >= arrayLength) then isFull = true; isEmpty = false; // check if we've filled all spaces
if (numItems <= 0) then isEmpty = true; isFull = false; // check if we've read from all spaces
Function isFull(): return isFull // return whether the buffer is full or empty
Function isEmpty(): return isEmpty
I just wrote that off the top of my head. It's not really "proper psudocode" - and I'm not even sure it will work correctly - I'm pretty sure that the isFull and isEmpty logic isn't right. But something like that. — Preceding unsigned comment added by Jimw338 ( talk • contribs) 19:40, 9 August 2012 (UTC)
A while back, I added the following external link:
This is a link to a page on my own website. I know that under some circumstances this is allowed if there is consensus that the link is a useful addition to the article. But alas, I have a bit of a history for linking to my site, and after I became a bit pushy in a discussion elsewhere, the links were (understandably) removed. To save you some time, I should mention that I have been made very aware of the WP guidelines that are frowning upon me. I stand on nothing except IAR and a sure conviction that the article is better off with the link than without it. Some points to note:
I have learned my lesson about pushing when there is potential for COI, but I believe there is rather an alignment of interest (even though the only interest I derive from my website is satisfaction). Would you consider the case for restoring the link, based purely on the merits of its inclusion? (Those essays listed in IAR make for some really good reading :) -- Tennenrishin ( talk) 15:55, 13 July 2011 (UTC)
If you really believe the implementations are similar, please take a moment to compare them. It will also help you to understand my arguments. -- Tennenrishin ( talk) 21:23, 6 September 2011 (UTC)
There is no need to repeat yourself. Just explain why you say the link is not helpful, or point me to where you have explained this already. Let me break the question down for you:
Alternatively, if you no longer wish to dispute that the link is helpful, but insist on its removal despite its helpfulness (for reasons such as WP:COI or WP:EL), then please say so. -- Tennenrishin ( talk) 13:26, 8 September 2011 (UTC)
Allow me to repeat the arguments, and summarize my position for the benefit of any newcomers. (B2 and D were added now)
Now, my claim is that each of A, B, C and D point to a significant improvement in the WP article. -- Tennenrishin ( talk) 19:40, 8 September 2011 (UTC)
I'm a little surprised to see my Bip Buffer article removed from here (not that I added it, but I was quite honored that it was linked). It was removed during removal of specific implementations... except it's not an actual implementation per se - it's a variant algorithm which provides nearly the efficiency of a regular circular buffer, but with reduced overhead for reading data in chunks; it ensures that all chunks read are contiguous. Fleetingshadow ( talk) 22:15, 7 September 2011 (UTC)
I think the "Uses"-part is too black-and-white as it is...
Wrong, just use a pointer to the start of the buffer. The circularity just helps in reclaiming the dead space in front of such a buffer.
Wrong if the queue almost never uses the maximum size.
Yes, but Linked lists have a huge space (and sometimes cache miss) overhead, and a performance penalty because of the indirections, while a Circular buffer can be almost as fast as an Array. So the "may" is strong in this one.
Bottom line, the claims are more or less correct, but they do not reflect the fine distinctions necessary to choose a data structure in the real world. Also, there are applications in some scheduling algorithms, and the multimedia example can be generalized to the synchronization of many more single-producer-single-consumer-cases. Sorry I'm only criticizing, and not editing, but my English is not good enough for that... -- 89.204.152.53 ( talk) 04:36, 8 August 2013 (UTC)
Please explain why you undid my revision which I commented thus: "there is a contradiction because the "end" pointer is defined in two different ways, once as an end pointer and once as a next pointer." Methinks this contradiction is obvious and, if I had the time, I'd make the examples consistent. Vincent J. Lipsio ( talk) 22:25, 11 November 2013 (UTC)
definition | quote | illustration |
---|---|---|
end pointer | "end of valid data" |
![]() |
next pointer | "in the case the buffer is entirely full, both pointers point to the same element" |
![]() |
I'm surprised to see the Optimized POSIX implementation example being removed from the article on April 14, 2014. This example is extremely useful, well written, and provides a great benefit to readers. Please consider restoring it. -- Victorspm ( talk) 17:53, 21 April 2014 (UTC)
From the desciption of a 1950s telephone exchange I quote: "The mechanical storage element of the pulse repeater is a lamellar disc with 72 resilient lamellae which is rotatably arranged in a raceway. The storage magnet turns the disc one step further with each incoming pulse. The marker magnet presses the lamellas on one side of the ring when the magnet is attracted and on the other side of the ring when the magnet has fallen off. These markings are retained for one full turn of the flap disc and thus mark the end of a previously stored series of pulses. Up to the start of withdrawal, 64 pulses can be saved. The scanning arm is on the other side (scanning side). This arm moves with the lamellar disc when it is stored. When releasing, the scanning arm slides over the lamellar support ring against the rotary movement of the lamellar disk and thereby scans each lamellar step until it is stopped at the end of the series of marked lamellas." See https://www.youtube.com/watch?v=_xI9tXi-UNs for the german original text.
From the US patent 3979733 I quote: "Responsive to clock signal CK1 and the coincidence of the comparator and input enable signals on lead 302, the contents of the read address register are incremented by adder 350. Thereby the contents of the read address register are advanced to correspond to the direct address of the next of the consecutive memory cells in the FIFO queue, i.e., the cell from which a packet may next be read ... Thereafter, responsive to clock signal CK3 and the coincidence of the comparator and input enable signals, the contents of the write address register are incremented by adder 350. Thereby the contents of the write address register are advanced to correspond to the direct address of the next available memory cell in the FIFO queue, i.e., the next cell into which a packet may be written." Is it necessary to put this quote into the Wikimedia article? I am sure that a 1976 patent is not the first document about circular buffer. The original inventor of circular buffer is not known to me, I think the name got lost in history. Can we now put down the "needs additional citations" sign? AndreAdrian ( talk) 11:31, 15 December 2021 (UTC)
The article cites an example in which consecutive virtual memory pages are mapped to the same buffer for apparent performance improvement as "automatic" wrap around is managed by hardware. However it is not necessarily true that virtual memory homonyms are performantly accessed. In fact, mapping in this fashion may significantly slow stores to the buffer on modern CPUs (and other hardware). At a minimum, a citation showing how this improves performance is needed. — Preceding unsigned comment added by Jcm ( talk • contribs) 16:25, 23 January 2022 (UTC)
gr::vmcircbuf
and its subclasses. See:
[1]
Ammrat13 (
talk)
05:31, 16 June 2024 (UTC)This is the
talk page for discussing improvements to the
Circular buffer article. This is not a forum for general discussion of the article's subject. |
Article policies
|
Find sources: Google ( books · news · scholar · free images · WP refs) · FENS · JSTOR · TWL |
![]() | This article is rated Start-class on Wikipedia's
content assessment scale. It is of interest to the following WikiProjects: | ||||||||||||||||||||||||||||||||||||||||
|
Try putting 1..N, followed by getting 1..N times, then try putting, where the buffer is empty shows it is full. — Preceding unsigned comment added by 4ureyz ( talk • contribs) 18:18, 25 November 2023 (UTC)
The template queue's IsFull function is incorrect. Notice it is identical to IsEmpty(), only advancing the tail before doing a check. Consider: Q::Resize(2); Q::Enqueue(T); Q::Enqueue(T); The second enqueue will throw as IsFull reports true (tail=1, +1 & mask = head == true) — Preceding unsigned comment added by 98.232.107.82 ( talk) 23:09, 12 June 2011 (UTC)
When was the ring buffer invented or first publicly discussed or first mentioned in an academic paper or first used in an actual operating system? 209.252.104.131 ( talk) 10:47, 16 March 2008 (UTC) ring buffer has been invented by Alblas Hans (pe1ayx) publicly made in 1993-1995 in linux kernel source tree in /drivers/char/scc.c under the name buffer pool concept and ring buffer chain. copyricht by none gnu use —Preceding unsigned comment added by 83.101.55.202 ( talk) 15:35, 3 October 2010 (UTC)
one still has to always check before a read or a write if the read pointer and a write pointer overlap.
this is never needed incase of a simple write ->read->write buffer a simple write->read->write kind of buffer works sequentially and simply does not let one write to the buffer is someone has not read what is already written because it assumes buffer_size=max message size and simply keeps check of whether the buffer is read or not.
In Circular buffer mechanics paragraph, it says that the start pointer points to the start of valid data and the end pointer points to the end of valid data. So, in my understanding, and according to the figures:
In the following paragraph Difficulties, a full buffer is represented with start = end. This is the same for the free buffer. We can suppose that the rule is different in this paragraph: the start pointer points to the start of valid data and the end pointer points to the next element after the end of valid data (if any). If there is no valid data, start = end.
Did I miss something ? —Preceding unsigned comment added by 84.14.106.33 ( talk) 14:45, August 27, 2007 (UTC)
You didn't miss anything, the Circular buffer mechanics paragraph is incorrect, the first pointer will point to the first element to be read, and the second pointer will point to the first element to be written. I'm going to try to remember this when I have some time to correct the diagrams and fix it. 70.230.2.66 ( talk) 23:24, 10 March 2008 (UTC)
In Circular buffer mechanics it talks about a "buffer border". What is the buffer border and when can it be "read over"? 137.44.2.188 ( talk) 09:51, 9 April 2008 (UTC)
I rewrote the sentence about a "buffer border" to hopefully make it more clear. Maybe the 'clarify' notice can be removed? Shervinemami ( talk) 18:50, 1 July 2010 (UTC)
The RRDtool currently mentions a "a round-robin archive (RRA).", and the brief description reminds me of a circular buffer. Is "round-robin archive" an exact synonym for "circular buffer", or some specific variant of a circular buffer? Or is it something significantly different? -- 68.0.124.33 ( talk) 00:49, 15 January 2009 (UTC)
When checking to see how much space is used in the buffer, needing to be read (The space between the write and read pointers) could you not just use another variable, incrementing it as you write something, and decrementing it as you read something? For example, once it is initialized, the buffer is empty therefore your variable would = 0. But once you write, say 3 bytes, with out reading something, the variable would than = 3. And again after reading 2 bytes, that same variable would equal 1, effectively indicating that there is one byte remaining to be read in the buffer. This eliminates the need for any crazy algorithms for when your write pointer has wrapped around before you read pointer has. —Preceding unsigned comment added by 205.250.74.174 ( talk) 23:15, 17 June 2009 (UTC)
I find the C# example distinctly uninformative and overly verbose. While perhaps it shows good design, it doesn't illustrate the subject matter any better than the other two C examples. I'm removing it for now. SiegeLord ( talk) 18:33, 13 September 2010 (UTC)
Another solution not mentioned in the article is to have an additional boolean variable. When an element is inserted, it is set to true, and when an element is removed, it is set to false. If the indices are equal and the variable is true, the buffer is full. If the indices are equal and the varaible is false, the buffer is empty. Platypus1130 ( talk) 21:58, 30 January 2011 (UTC)
Please don't replace the C code with some pseudo code which doesnt really help anybody... — Preceding unsigned comment added by 130.149.245.245 ( talk) 16:17, 19 December 2012 (UTC)
Is it really useful to have two full implementations of a ring buffer? Wouldn't it be better to just have some pseudo code? This is an encyclopedia, not a pastebin, is it not? —Preceding unsigned comment added by 142.244.143.199 ( talk) 17:22, 12 April 2011 (UTC)
Agreed, it's currently quite unencyclopaedic. See below a simpler C implementation which I think works as an easy-to-understand example without being too C-specific. I suggest replacing the whole "Difficulties section" using this as a starting point. Thoughts? HoboBen ( talk) 20:05, 20 April 2011 (UTC) Edit: spoke too soon, there's a bug in my RetrieveFromQueue function where start==end when it's full. Needs to be fixed first. HoboBen ( talk) 21:05, 21 April 2011 (UTC)
Fixed. HoboBen ( talk) 16:06, 22 April 2011 (UTC)
While it might not be written in its founding statement, many people turn to wikipedia as a place to quickly learn about a topic. I wanted to quickly learn about circular buffers - specifically, how to use them - and I found the description, as well as the implementations, to be extremely useful. I don't think it would be "better" to remove some information that some might find useful. It is at the bottom of the article - you only scroll to that section if you want to read it. However, I STILL think there is a problem with the implementation, though. I'm not sure why the IsFull and IsEmpty variables are included in the read/write functions, and they seem to be updated at the wrong time (before the increment). Hithisishal ( talk) 07:31, 10 January 2012 (UTC)
#define BUFFER_SIZE 256 item *buffer[BUFFER_SIZE]; int start = 0; int end = 0 int active = 0; void PushToQueue(item *p) { buffer[end] = p; end = (end + 1) % BUFFER_SIZE; if (active < BUFFER_SIZE) { active++; } else { /* Move start to next-oldest */ start = (start + 1) % BUFFER_SIZE; } } item *RetrieveFromQueue(void) { item *p; if (!active) { return NULL; } p = buffer[start]; start = (start + 1) % BUFFER_SIZE; active--; return p; }
Can we please get consensus on replacing the current C examples with this alternative? Agree, disagree, or suggest modifications below. HoboBen ( talk) 12:58, 27 July 2011 (UTC)
Initialization:
p1=0; p2=0; numItems=0; isFull=false; isEmpty=true;
Function put(x):
array[p1] = x; p1++; numItems++; // insert item and advance write pointer
Function get():
return array[p2]; p2++; numItems--; // remove item and advance read pointer
With either function:
if (p1= arrayLength) then p1 = 0; // reset write pointer to beginning if we've reached the end ("ring" around)
if (p2= arrayLength) then p2 = 0; // same for read pointer
if (p1<0) then p1 = arrayLength; // reset write pointer to end of buffer if we've reached the beginning
if (p2<0) then p2 = arrayLength; // same for read pointer
if (numItems >= arrayLength) then isFull = true; isEmpty = false; // check if we've filled all spaces
if (numItems <= 0) then isEmpty = true; isFull = false; // check if we've read from all spaces
Function isFull(): return isFull // return whether the buffer is full or empty
Function isEmpty(): return isEmpty
I just wrote that off the top of my head. It's not really "proper psudocode" - and I'm not even sure it will work correctly - I'm pretty sure that the isFull and isEmpty logic isn't right. But something like that. — Preceding unsigned comment added by Jimw338 ( talk • contribs) 19:40, 9 August 2012 (UTC)
A while back, I added the following external link:
This is a link to a page on my own website. I know that under some circumstances this is allowed if there is consensus that the link is a useful addition to the article. But alas, I have a bit of a history for linking to my site, and after I became a bit pushy in a discussion elsewhere, the links were (understandably) removed. To save you some time, I should mention that I have been made very aware of the WP guidelines that are frowning upon me. I stand on nothing except IAR and a sure conviction that the article is better off with the link than without it. Some points to note:
I have learned my lesson about pushing when there is potential for COI, but I believe there is rather an alignment of interest (even though the only interest I derive from my website is satisfaction). Would you consider the case for restoring the link, based purely on the merits of its inclusion? (Those essays listed in IAR make for some really good reading :) -- Tennenrishin ( talk) 15:55, 13 July 2011 (UTC)
If you really believe the implementations are similar, please take a moment to compare them. It will also help you to understand my arguments. -- Tennenrishin ( talk) 21:23, 6 September 2011 (UTC)
There is no need to repeat yourself. Just explain why you say the link is not helpful, or point me to where you have explained this already. Let me break the question down for you:
Alternatively, if you no longer wish to dispute that the link is helpful, but insist on its removal despite its helpfulness (for reasons such as WP:COI or WP:EL), then please say so. -- Tennenrishin ( talk) 13:26, 8 September 2011 (UTC)
Allow me to repeat the arguments, and summarize my position for the benefit of any newcomers. (B2 and D were added now)
Now, my claim is that each of A, B, C and D point to a significant improvement in the WP article. -- Tennenrishin ( talk) 19:40, 8 September 2011 (UTC)
I'm a little surprised to see my Bip Buffer article removed from here (not that I added it, but I was quite honored that it was linked). It was removed during removal of specific implementations... except it's not an actual implementation per se - it's a variant algorithm which provides nearly the efficiency of a regular circular buffer, but with reduced overhead for reading data in chunks; it ensures that all chunks read are contiguous. Fleetingshadow ( talk) 22:15, 7 September 2011 (UTC)
I think the "Uses"-part is too black-and-white as it is...
Wrong, just use a pointer to the start of the buffer. The circularity just helps in reclaiming the dead space in front of such a buffer.
Wrong if the queue almost never uses the maximum size.
Yes, but Linked lists have a huge space (and sometimes cache miss) overhead, and a performance penalty because of the indirections, while a Circular buffer can be almost as fast as an Array. So the "may" is strong in this one.
Bottom line, the claims are more or less correct, but they do not reflect the fine distinctions necessary to choose a data structure in the real world. Also, there are applications in some scheduling algorithms, and the multimedia example can be generalized to the synchronization of many more single-producer-single-consumer-cases. Sorry I'm only criticizing, and not editing, but my English is not good enough for that... -- 89.204.152.53 ( talk) 04:36, 8 August 2013 (UTC)
Please explain why you undid my revision which I commented thus: "there is a contradiction because the "end" pointer is defined in two different ways, once as an end pointer and once as a next pointer." Methinks this contradiction is obvious and, if I had the time, I'd make the examples consistent. Vincent J. Lipsio ( talk) 22:25, 11 November 2013 (UTC)
definition | quote | illustration |
---|---|---|
end pointer | "end of valid data" |
![]() |
next pointer | "in the case the buffer is entirely full, both pointers point to the same element" |
![]() |
I'm surprised to see the Optimized POSIX implementation example being removed from the article on April 14, 2014. This example is extremely useful, well written, and provides a great benefit to readers. Please consider restoring it. -- Victorspm ( talk) 17:53, 21 April 2014 (UTC)
From the desciption of a 1950s telephone exchange I quote: "The mechanical storage element of the pulse repeater is a lamellar disc with 72 resilient lamellae which is rotatably arranged in a raceway. The storage magnet turns the disc one step further with each incoming pulse. The marker magnet presses the lamellas on one side of the ring when the magnet is attracted and on the other side of the ring when the magnet has fallen off. These markings are retained for one full turn of the flap disc and thus mark the end of a previously stored series of pulses. Up to the start of withdrawal, 64 pulses can be saved. The scanning arm is on the other side (scanning side). This arm moves with the lamellar disc when it is stored. When releasing, the scanning arm slides over the lamellar support ring against the rotary movement of the lamellar disk and thereby scans each lamellar step until it is stopped at the end of the series of marked lamellas." See https://www.youtube.com/watch?v=_xI9tXi-UNs for the german original text.
From the US patent 3979733 I quote: "Responsive to clock signal CK1 and the coincidence of the comparator and input enable signals on lead 302, the contents of the read address register are incremented by adder 350. Thereby the contents of the read address register are advanced to correspond to the direct address of the next of the consecutive memory cells in the FIFO queue, i.e., the cell from which a packet may next be read ... Thereafter, responsive to clock signal CK3 and the coincidence of the comparator and input enable signals, the contents of the write address register are incremented by adder 350. Thereby the contents of the write address register are advanced to correspond to the direct address of the next available memory cell in the FIFO queue, i.e., the next cell into which a packet may be written." Is it necessary to put this quote into the Wikimedia article? I am sure that a 1976 patent is not the first document about circular buffer. The original inventor of circular buffer is not known to me, I think the name got lost in history. Can we now put down the "needs additional citations" sign? AndreAdrian ( talk) 11:31, 15 December 2021 (UTC)
The article cites an example in which consecutive virtual memory pages are mapped to the same buffer for apparent performance improvement as "automatic" wrap around is managed by hardware. However it is not necessarily true that virtual memory homonyms are performantly accessed. In fact, mapping in this fashion may significantly slow stores to the buffer on modern CPUs (and other hardware). At a minimum, a citation showing how this improves performance is needed. — Preceding unsigned comment added by Jcm ( talk • contribs) 16:25, 23 January 2022 (UTC)
gr::vmcircbuf
and its subclasses. See:
[1]
Ammrat13 (
talk)
05:31, 16 June 2024 (UTC)