dev

Ring buffer(Circular buffer) 고찰

재삐신생 2017. 4. 19. 20:33
반응형

링버퍼 구현체를 찾아보면, 다양한 방법들로 구현이 되어 있다.


이미 하이레벨 언어에서는 기본적으로 지원해주기에, 직접 구현해서 쓸 일을 별로 없는 것



단일 배열로 구현한 형태를 기준으로

_HEAD와 _TAIL을 가리키는 포인터 형태가 일반적이다.

  • HEAD는 PUT할 위치를 가르킨다.
  • TAIL은 GET할 위치를 가르킨다.

그러면, 내부 멤버변수는 배열, HEAD, TAIL 총 3개, 여기에 SIZE 를 추가하면 총 4개다.


데이터의 크기를 담을 SIZE 변수가 있으면, 비거나, 꽉찬 상태를 체크하기가 쉽다.


SIZE변수가 없는 경우는 어떨까??


HEAD와 TAIL로 사이즈를 구하는 것은 불가능 하다. 비었을 경우나, 꽉찬 경우 모두 HEAD == TAIL이 성립하기 때문이다.


이것을 해결한 구현방법은 배열 생성시, 사용할 크기보다 +1 한 크기로 배열을 만들어서, 구현했다.

이것은 아래 조건을 만족한다.

  • HEAD + 1 == TAIL 이거나, TAIL == 0 이고, HEAD == 버퍼크기이면, 꽉찬 상태
  • HEAD == TAIL 이면, 빈 상태
  • HEAD가 가르키는 위치는 항상 비어있다. (+1 시킨 배열위치가 사용됨)
전자나 후자나, 사실, 별다른 이점은 없다.
성능적인 부분은 거의 미비하며
멤버변수 Int(4바이트)보다 1개 더 들어갈 배열의 메모리 사용량 또한, 미비하다.


반응형

'dev' 카테고리의 다른 글

비트연산시 실수  (0) 2017.05.10
콜백  (0) 2017.05.06
버퍼풀  (0) 2017.05.05
IO(input/output) model  (0) 2017.04.03
Modern Data Binding  (0) 2017.03.14