๋ง ๋ฒ„ํผ (Ring Buffer)

https://chronicle.software/ring-buffer/
๋ง ๋ฒ„ํผ๋Š” FIFO queue ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋‹ค. circular buffer๋ผ๊ณ ๋„ ๋ถ€๋ฅธ๋‹ค.

๊ธฐ๋ณธ ์ž๋ฃŒ๊ตฌ์กฐ ๊ฐœ๋ก ์—์„œ๋Š” ์ž˜ ๋‹ค๋ค„์ง€์ง€ ์•Š๋Š”๋ฐ, ์‘์šฉ์˜ ํญ์ด ๊ฝค ๋„“์–ด์„œ ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.




๊ธฐ๋ณธ ์›๋ฆฌ

์ด๊ฑด ๋ฐฐ์—ด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ์ •์  ๋ฐฐ์—ด์ธ์ง€, ํฌ๊ธฐ๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ๋™์  ๋ฐฐ์—ด์ธ์ง€๋Š” ๊ตฌํ˜„ ์„ ํƒ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค.

๊ตฌ์„ฑ์š”์†Œ๋Š” ๊ฐ„๋‹จํ•œ ํŽธ์ด๋‹ค.
๋ฐฐ์—ด ํ•œ์ค„๊ณผ, ์•ž์„ ๊ฐ€๋ฆฌํ‚ค๋Š” start ์ธ๋ฑ์Šค, ๋์„ ๊ฐ€๋ฆฌํ‚ค๋Š” end ์ธ๋ฑ์Šค๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

๊ธฐ๋ณธ ๋™์ž‘ ์›๋ฆฌ๋„ ๊ฐ„๋‹จํ•œ ํŽธ์ด๋‹ค.

  1. ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ผ ๋•Œ๋Š” start ์ธ๋ฑ์Šค ์œ„์น˜์—์„œ ์š”์†Œ๋ฅผ ๊บผ๋‚ด๊ณ  start๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  2. ๋ฐ์ดํ„ฐ๋ฅผ ์ง‘์–ด๋„ฃ์„ ๋•Œ๋Š” end ์˜ค๋ฅธ์ชฝ์— ์š”์†Œ๋ฅผ ์ง‘์–ด๋„ฃ๊ณ  end๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

๊ทธ๋Ÿผ start๊ฐ€ ์˜ค๋ฅธ์ชฝ ๋์„ ๋„˜์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์‚ฌ์‹ค ๊ทธ๋ž˜๋„ ๋ฌธ์ œ๋Š” ์—†๋‹ค.
๋ฐฐ์—ด ์ž์ฒด๋Š” ์ง์„ ์ด์ง€๋งŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” ์›ํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ ์ธ๋ฑ์Šค ๋‹ค์Œ์„ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค๋กœ ๊ฐ„์ฃผํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ end๊ฐ€ start ์™ผ์ชฝ์— ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.
https://eteo.tistory.com/m/359

๊ทผ๋ฐ, ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฝ‰ ์ฐฌ ์ƒํƒœ์—์„œ ์š”์†Œ๋ฅผ ์ง‘์–ด๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ• ๊นŒ?

  1. ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ˜„์—์„œ๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜๋œ, start ์œ„์น˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๊ณ  ๋ฐ€์–ด๋„ฃ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
    ์ŠคํŠธ๋ฆฌ๋ฐ์ด๋‚˜ ๋กœ๊ทธ agent์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ์˜ ๋ถ€๋ถ„์ ์ธ ์œ ์‹ค์ด ํฌ๊ฒŒ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์ด ๋ฐฉ๋ฒ•์ด ์ถฉ๋ถ„ํžˆ ํšจ์œจ์ ์ด๋‹ค.
  2. ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๋ฐฐ์—ด ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. ํ›„์ˆ ํ•  dynamic ring buffer๊ฐ€ ์ด๋Ÿฐ ์›๋ฆฌ๋‹ค.



์žฅ์ ๊ณผ ๋‹จ์ 

๋ฐฐ์—ด์˜ ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์— ๊ธฐ๋ฐ˜ํ•ด์„œ queue ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
queue๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์ธ linked list๋‚˜ chunked array์— ๋น„ํ•ด์„œ ์‚ฝ์ž…, ์‚ญ์ œ, ์ ‘๊ทผ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋›ฐ์–ด๋‚˜๋‹ค.

๋Œ€์‹ , (๊ธฐ๋ณธ ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ) ๋ฐ์ดํ„ฐ ์œ ์‹ค ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ณ , (dynamic ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ) ํ™•์žฅ๊ณผ ์ถ•์†Œ์˜ ๊ด€๋ฆฌ๊ฐ€ linked list์— ๋น„ํ•ด ์œ ์—ฐํ•˜์ง€ ๋ชปํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.
ring buffer๋ฅผ ๋™์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ring buffer๊ฐ€ ์ตœ์ ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋Š” ๊ฒฝ์šฐ๋‹ค.




Dynamic Ring Buffer

ring buffer์˜ ์ด์ƒ์ ์ธ ์‚ฌ์šฉ์‚ฌ๋ก€๋Š” ํฌ๊ธฐ๊ฐ€ ๊ณ ์ •๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ์ง€๋งŒ, ์‘์šฉํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๊ทธ๋Ÿฐ ํ•œ๊ณ„์ ์„ ๋‘๊ณ ์„œ๋Š” ์จ๋จน๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ผ๋ถ€ ์‘์šฉ ๊ตฌํ˜„์—์„œ๋Š” ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ์„œ ์ž๋™์œผ๋กœ ๋ฐฐ์—ด์ด ํ™•์žฅ๋˜๊ฑฐ๋‚˜ ์ถ•์†Œ๋˜๋Š” ํ˜•ํƒœ๋กœ ๋ณ€ํ˜•์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

dynamic ring buffer๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ž˜ ์ผ๋ฐ˜ํ™”๋˜์–ด์žˆ์ง€๋Š” ์•Š์ง€๋งŒ, ๊ทธ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์ ์€ ๋Œ€์ถฉ ์ด๋Ÿฐ ๊ฒƒ๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

  1. ํฌ๊ธฐ๊ฐ€ ๋Š˜๊ฑฐ๋‚˜ ์ค„์–ด๋“ค๋•Œ๋งˆ๋‹ค, ๋ฐฐ์—ด์„ ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ์˜ฎ๊ฒจ์•ผ ํ•œ๋‹ค. ์ ์ง€ ์•Š์€ ๋น„์šฉ์ด๊ณ , ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ์—๋„ ๋ถˆ๋ฆฌํ•œ ์ง€์ ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋ฆฌ์‚ฌ์ด์ง•์„ ๋Œ๋ฆฌ๋Š” ์ฃผ๊ธฐ๋ฅผ ์ž˜ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

  2. ์‚ฌ์šฉ๋Ÿ‰์ด ๊ธ‰๊ฒฉ์ด ๋Š˜์–ด๋‚ฌ๋‹ค๊ฐ€ ์ค„์–ด๋“ค ๊ฒฝ์šฐ์— ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํฌ๊ธฐ๋ฅผ ์‚ฌ์šฉ๋Ÿ‰์— ๋งž์ถฐ ํ•ญ์ƒ compactํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๊ฑฐ์˜ ๋ถˆ๊ฐ€ํ•˜๋‹ค.

๋Œ€ํ‘œ์ ์ธ dynamic Ring Buffer ๊ตฌํ˜„์ฒด๋กœ๋Š” Rust์˜ ๊ธฐ๋ณธ ์ž๋ฃŒ๊ตฌ์กฐ VecDeque๊ฐ€ ์žˆ๋‹ค.
Java์˜ ArrayDeque๋„ Ring buffer ๊ธฐ๋ฐ˜์˜ ๊ตฌํ˜„์ฒด๋กœ ์•Œ๋ ค์ ธ์žˆ๋‹ค.