Ring buffer구현

twins99의 이미지

Ring buffer를 구현하려 합니다.

구현 요구사항은, Read하는 쪽은 일정한 사이즈(30kbyte)로 읽어가고, Write하는 쪽은 가변 Size(1k~4kbyte)로 씁니다.

또한 buffer의 상태를 알 수 있어야 합니다.(몇% 사용되고 있다..)

구현시 참고할만한 자료가 있을까요?

코드를 추천해 주셔도 좋습니다.

그럼 답변 부탁드립니다.

mach의 이미지

아시다시피, 링버퍼 자체는(알고리즘) 아주 단순하지요.

* 언뜻 떠오르는 분야로는, 수동패킷수집분야에서는 ring buffer를 만들어 성능개선에 사용하고 있습니다.(과거 듀얼버퍼를 보다 많은 버퍼로.....)
libpcap + ring buffer , ethereal + ring buffer, ntop + ring buffer, winpcap + ring buffer 등등에서 사용되고 있습니다. 또한, 원초적으로는 커널의 TCP/IP프로토콜 스택 도 링버퍼를 사용하며, 오래전의 시리얼 통신을 만들때도 링버퍼를 사용했었고, 그 이전에 자료구조론을 설명하는 책에서 링버퍼를 논의하고 있습니다.
링버퍼 알고리즘 자체는 단순하지요. 단지, 특정 시스템(운영체제등)의 환경에 옵티마이즈된 링버퍼의 구현은 해당시스템에 대한 이해를 필요로 합니다. 아울러, 제로카피 메카니즘에 대한 테크닉을 동원하는게 통례입니다. 특히, 네트워크 인터페이스인 경우 NAPI를 사용하는등 다양한 테크닉이 동원되고 있습니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

체스맨의 이미지

다음 참조해보세요.
http://elonen.iki.fi/code/misc-notes/ringbuffer/

저도 얼마전 구현을 했는데, 실은 위 문서를 찾긴 했지만 참고는 별로 안했습니다. 링버퍼라는 게 결국 환형큐와 다를 바가 없습니다. 단지 인터넷에 떠도는 환형큐 예제들은 대개 하나의 엔트리만 넣고 하나의 엔트리만 빼는 것들입니다.

이것을 여러 엔트리를 넣고, 여러 엔트리를 뺄 수 있게 확장하면, 환형큐나 링버퍼나 그냥 말만 다를 뿐입니다.

Coral Library Project : http://coral.kldp.net
Orion Project : http://home.megapass.net/~heesc22/

Orion Project : http://orionids.org