๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

NSCache 

์˜ค๋Š˜์€ ๊ฐ€๋ฒผ์šด ์ด๋ฏธ์ง€ ์บ์‹œ์— ์ž์ฃผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ๋ฌด์‹ฌ์ฝ” ์‚ฌ์šฉํ•ด์˜ค๊ธฐ๋งŒ ํ–ˆ๋˜ NSCache๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ์ •์ฑ…์„ ๋‘๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ณต์‹๋ฌธ์„œ์—๋Š” NSCache๊ฐ€ ๋‹ค์–‘ํ•œ ์ž๋™ ์ œ๊ฑฐ ์ •์ฑ…(auto-eviction policy)์„ ์‚ฌ์šฉํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๊ณ  ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”, ์–ด๋–ค ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ๋ ค์ฃผ๊ณ  ์žˆ์ง€๋Š” ์•Š์•„์š”. 

๊ทธ๋ž˜์„œ Foundation์— ๋“ค์–ด๊ฐ€๋Š” Objective-C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ libs-base์—์„œ NSCache์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๊ณ , ์ด ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค..! ์ œ๊ฑฐ Objc๋Š” ๋ฆฌ๋”ฉ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๋ชปํ•ด์„œ ํ‹€๋ฆฐ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜๋„ ์žˆ์–ด์š”..! ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„์€ ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค๊ณ  ๋‚จ๊ฒจ๋‘˜๊ฒŒ์š”!

์ฝ”๋“œ๋Š” ์—ฌ๊ธฐ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”! ๊ทธ๋Ÿผ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

 

GitHub - gnustep/libs-base: The GNUstep Base Library is a library of general-purpose, non-graphical Objective C objects.

The GNUstep Base Library is a library of general-purpose, non-graphical Objective C objects. - GitHub - gnustep/libs-base: The GNUstep Base Library is a library of general-purpose, non-graphical Ob...

github.com

 

NSCache ์ปจํ…Œ์ด๋„ˆ

NSCache ๋‚ด๋ถ€์—๋Š” _accesses์™€ NSMapTable์ด ๋ˆˆ์— ๋„๋Š”๋ฐ์š”, access๋Š” ์บ์‹œํ•  ๊ฐ์ฒด๋“ค์„ ์ €์žฅํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ๋กœ ๋ณด์ด๊ณ  NSMapTable์€ ํ™•์‹คํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์บ์‹ฑ๋œ ๊ฐ์ฒด๋ฅผ key๋ฅผ ํ†ตํ•ด ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

 

์บ์‹œ ๊ฐ์ฒด ์ปจํ…Œ์ด๋„ˆ

๋จผ์ € NSCache ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š” ๊ฐ์ฒด์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณผ๊ฒŒ์š”. object๋ผ๋Š” ๋ฒ”์šฉ ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ณ , NSString ํƒ€์ž…์˜ ํ‚ค ๊ฐ’์ด ์žˆ์–ด์š”. 

๊ทธ๋ฆฌ๊ณ  accessCount ๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ์š”, ๊ต์ฒด ์ •์ฑ…์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋ช‡ ๋ฒˆ ์ฐธ์กฐ๋˜์—ˆ๋Š”์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

cost๋Š” NSCache์˜ api ์ค‘์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด์„œ cost๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด cost๊ฐ€ ๊ทธ๋Œ€๋กœ ์ €์žฅ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด cost๋Š” ์šฉ๋Ÿ‰์„ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค. 

๋งˆ์ง€๋ง‰์œผ๋กœ isEvictable์€ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ€ ๊ต์ฒด ๋Œ€์ƒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ์šฉ๋„๋กœ ์“ฐ์ด๊ฒ ๋„ค์š”.

 

๋ฐ์ดํ„ฐ ์ถ”๊ฐ€

์ƒˆ๋กœ์šด key-value๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” setObject ๋ฉ”์„œ๋“œ๋Š” ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋Š”๋ฐ์š”, cost๋ฅผ ์ฃผ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋Š” ๊ทธ๋ƒฅ cost๊ฐ€ 0์ด ๋˜์–ด์„œ cost๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ€๋ฅด๊ณ  ์žˆ์—ˆ์–ด์š”. ๊ทธ๋ž˜์„œ cost๊ฐ€ ํฌํ•จ๋œ ์œ„์ชฝ setObject๋งŒ ํ™•์ธํ•ด๋ณด๋ฉด ๋  ๊ฒƒ ๊ฐ™์•„์š”.

๋จผ์ € oldObject, newObject๋ฅผ ์ค€๋น„ํ•˜๊ณ  ๋งŒ์•ฝ ์ฃผ์–ด์ง„ key์— ๋Œ€ํ•œ ๊ฐ์ฒด๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•ด์ค๋‹ˆ๋‹ค.

์ด์ œ _evitObjectsToMakeSpaceForObjectWithCost ๋ผ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”, ์ธ์ž๋กœ๋Š” NSCache์— ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์ „๋‹ฌ๋ฐ›์€ cost๊ฐ€ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์บ์‹œ ์ •์ฑ…์ด ์ˆ˜ํ–‰๋˜๋Š” ๋ถ€๋ถ„์ด ์ด๊ณณ์ผ ํ…๋ฐ ๋‚จ์€ ์ฝ”๋“œ๋ฅผ ๋งˆ์ € ๋ณด๊ณ  ํ™•์ธํ•ด๋ณผ๊ฒŒ์š”!

๊ทธ ์ดํ›„์— ์ƒˆ๋กœ์šด CachedObject ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ํ‚ค์™€ ๊ฐ’์„ ๋ชจ๋‘ RETAIN ํ•ฉ๋‹ˆ๋‹ค. NSCache์˜ key์™€ value์— ๊ฐ’ ํƒ€์ž…์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ์ด์œ ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ์—ˆ๋„ค์š”..! 

๊ทธ๋ฆฌ๊ณ  discardableContent๋ฅผ ์ฑ„ํƒํ•œ๋‹ค๋ฉด isEvictable์„ ๋งˆํ‚นํ•ด๋‘ก๋‹ˆ๋‹ค. 

๋งˆ์ง€๋ง‰์œผ๋กœ newObject๋ฅผ ์บ์‹œ์— ์ €์žฅํ•˜๊ณ  ์ „์ฒด cost๋„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์ƒˆ๋กœ์šด ํ‚ค-๊ฐ’ ์Œ์„ NSCache์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. 

 

๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ๋•Œ๋Š” key์— ๋Œ€ํ•œ ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์žˆ๋‹ค๋ฉด ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์ „์— accessCount๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ , totalAccesses๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์„œ ํ•ด๋‹น ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ ํšŸ์ˆ˜์™€ ์ „์ฒด ์ฐธ์กฐ ํšŸ์ˆ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์œผ๋กœ ์˜ฎ๊ฒจ์„œ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์‚ฌ์šฉํ•œ ๊ฐ์ฒด๊ฐ€ ์บ์‹œ ์ž๋ฃŒ๊ตฌ์กฐ์˜ ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์žˆ์–ด์š”.

 

๋ฐ์ดํ„ฐ ์‚ญ์ œ

์ด์ œ ์‹ค์ œ๋กœ ์บ์‹œ ์ •์ฑ…์ด ์–ด๋–ป๊ฒŒ ์ˆ˜ํ–‰๋˜๋Š”์ง€, ์•„๊นŒ ์ง€๋‚˜์ณค๋˜ _evitObjectsToMakeSpaceForObjectWithCost ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

๋จผ์ € ์ฃผ์„์ด ์žˆ์–ด์„œ ํ•ด์„ํ•ด๋ณด๊ณ  ์ง€๋‚˜๊ฐˆ๊ฒŒ์š”. ์—ฌ๊ธฐ์— ๊ตฌํ˜„๋œ ์ •์ฑ…์€ ๊ฐ„๋‹จํ•œ LRU, LFU์˜ ํ˜ผํ•ฉํ˜•์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. LRU๋Š” ๊ฐ€์žฅ ์˜ค๋ž˜์ „์— ์ฐธ์กฐํ•œ ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•˜๋Š” ๊ต์ฒด ์ •์ฑ…์ด๊ณ , LFU๋Š” ๊ฐ€์žฅ ์ฐธ์กฐ๋œ ํšŸ์ˆ˜๊ฐ€ ์ ์ธ ๊ฐ์ฒด๋ฅผ ์„ ํƒํ•˜๋Š” ๊ต์ฒด ์ •์ฑ…์ด์—์š”. NSCache๋Š” ์ด ๋‘˜์„ ์ ์ ˆํžˆ ์„ž์–ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

NSCache ๋ฌธ์„œ์—์„œ ์• ํ”Œ์ด ์ •์ฑ…์ด ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด์š”. ๊ทธ๋Ÿฐ ๋‚ด์šฉ์ด ์žˆ์—ˆ๋‚˜ ์‹ถ์–ด์„œ ํ™•์ธํ•ด๋ดค๋”๋‹ˆ,

๋‚˜์™€์žˆ๊ธด ํ•˜๋„ค์š”..ใ…Žใ…Ž ๊ทธ๋ž˜์„œ ์ดํ›„์—๋Š” ์ถ”๊ฐ€์ ์ธ ์ •์ฑ…์„ ๊ฐ€์ง„ class๊ฐ€ ๋‹ค๋ฅธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‚˜ ์บ์‹œ์— ๋Œ€ํ•ด ์ƒ๊ธธ ์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

์ด๊ฑด ํฌ๊ฒŒ ์ค‘์š”ํ•œ ๋‚ด์šฉ์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™๊ณ , LRU + LFU๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋˜๊ณ  ์žˆ๋Š”์ง€๋ฅผ ์ฃผ์˜ ๊นŠ๊ฒŒ ๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š”. ํ•จ์ˆ˜ ๋ฐ”๋””๊ฐ€ ์ข€ ๊ธธ์–ด์„œ ์กฐ๊ธˆ์”ฉ ๋Š์–ด์„œ ํ™•์ธํ•ด๋ณผ๊ฒŒ์š”.

๋จผ์ € spaceNeeded์™€ count ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•œ์ง€ ๊ณ„์‚ฐํ•ด ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์™€ ํ˜„์žฌ ์บ์‹œ์— ์ €์žฅ๋œ ๊ฐ์ฒด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. 

์•„๋ž˜์— ์žˆ๋Š” ์กฐ๊ฑด๋ฌธ์˜ ์กฐ๊ฑด์€ costLimit์ด 0๋ณด๋‹ค ํฌ๊ณ , totalCost์— ์ฃผ์–ด์ง„ cost๋ฅผ ๋”ํ–ˆ์„ ๋•Œ costLimit๋ณด๋‹ค ํฐ์ง€ ํ™•์ธํ•˜๋Š” ์กฐ๊ฑด์ธ๋ฐ์š”, ๊ฒฐ๊ตญ cost ์ œํ•œ์ด ์žˆ๋Š” ์ƒํ™ฉ์—์„œ ํ˜„์žฌ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๊ฐ์ฒด์˜ cost๋ฅผ ๋”ํ–ˆ์„ ๋•Œ ์ œํ•œ์„ ๋„˜์–ด์„ ๋‹ค๋ฉด ์–ผ๋งˆ๋งŒํผ์˜ ์šฉ๋Ÿ‰์„ ํ™•๋ณดํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ทธ ์•„๋ž˜์— ์žˆ๋Š” ์กฐ๊ฑด๋ฌธ์—์„œ๋Š” ๊ธฐ์กด์— ์žˆ๋Š” ๊ฐœ์ฒด๋“ค์„ ์‚ญ์ œํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ธ ์ œํ•œ์„ ๋„˜์–ด์„  ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•˜๊ณ  ์บ์‹œ ์ •์ฑ…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ์ง€์šฐ๊ณ , ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์œ„ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € ํ˜„์žฌ ์บ์‹œ์— ์žˆ๋Š” ๊ฐ์ฒด๋“ค์ด ๊ฐ€์ง„ ์ฐธ์กฐ ํšŸ์ˆ˜์˜ ํ‰๊ท ์„ ๊ตฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 0.2๋ฅผ ๊ณฑํ•˜๊ณ  1์„ ๋”ํ•˜๋Š” ๊ฑด ์™œ ํ•˜๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ, ํ•˜์ดํผ ํŒŒ๋ผ๋ฏธํ„ฐ์ฒ˜๋Ÿผ ํŠœ๋‹๋œ ๊ฒŒ ์•„๋‹๊นŒ ์‹ถ์–ด์š”.. 

evictsObjectsWithDiscardedContent๋Š” ๋ฌธ์„œ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ์–ด์š”.

Bool๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ˜„์žฌ ์บ์‹œ๊ฐ€ ์ด๋ฏธ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฒ„๋ ค์ง„ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๊ทธ๋ ‡๋‹ค๋ฉด evictedKeys์— ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์„œ ์ €์žฅํ•˜๊ณ  ์žˆ์–ด์š”.

๋‹ค์Œ ๋ผ์ธ๋ถ€ํ„ฐ๋Š” ๊ธด while๋ฌธ์ด ์ง„ํ–‰๋˜๋Š”๋ฐ์š”, ๋ฐ˜๋ณต์˜ ์กฐ๊ฑด์€ ํ™•์ธํ•  ๋‹ค์Œ ๊ฐ์ฒด๊ฐ€ ์—†์„ ๋•Œ์ž…๋‹ˆ๋‹ค.  obj ๋ณ€์ˆ˜์— ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ์–ด์š”. ๊ฐ์ฒด๋ฅผ ๊บผ๋‚ด์˜ค๋Š” ๋ฆฌ์ŠคํŠธ๋Š” ๊ฐ€์žฅ ์ฐธ์กฐํ•œ ์ง€ ์˜ค๋ž˜๋œ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์žฅ ์•ž์— ์žˆ๊ณ , ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ฐธ์กฐ๋œ ๊ฐ์ฒด๊ฐ€ ๊ฐ€์žฅ ๋’ค์— ์žˆ๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ LRU๊ฐ€ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์ด ๊ฐ์ฒด์˜ ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ ํ‰๊ท  ์ฐธ์กฐ ํšŸ์ˆ˜๋ณด๋‹ค ์ž‘๊ณ , ์ œ๊ฑฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด, ํ•ด๋‹น ๊ฐ์ฒด์˜ cost๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค๊ณ , isEvictable์„ NO๋กœ ๋งŒ๋“ค์–ด์„œ ์‚ญ์ œํ•  ํƒ€๊นƒ์œผ๋กœ ์„ค์ •๋˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. LFU๋Š” ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜๋„ค์š”.

๊ทธ๋ฆฌ๊ณ  discardContentIfPossible ๋ฉ”์„œ๋“œ๋ฅผ ๋ถ€๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ ๊ฐ™์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด์ฃ .

์ง€๊ธˆ ๋ณด๊ณ  ์žˆ๋Š” ํŒŒ์ผ ์•ˆ์—์„œ๋Š” ํ™•์ธํ•  ์ˆ˜ ์—†์—ˆ๊ณ  ๋ฌธ์„œ์— ๋‚ด์šฉ์ด ์žˆ์—ˆ๋Š”๋ฐ์š”, ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด accessed counter๊ฐ€ 0์ผ ๋•Œ ๊ฐ์ฒด์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ญ์ œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. accessed counter๋Š” NSDiscountableContent ๋ฌธ์„œ์— ์ •๋ฆฌ๋˜์–ด ์žˆ์–ด์š”.

NSDiscardableContent ๊ฐ์ฒด๋Š” ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์ด๊ณ , ์ด ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ์— ์ฝ๊ธฐ ์—ฐ์‚ฐ์ด ์ผ์–ด๋‚˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ ์ค„์ผ ๋•Œ ์นด์šดํ„ฐ๊ฐ€ 1 ์ด์ƒ์ด ๋˜๊ณ , ์‚ฌ์šฉ ์ค‘์ด์ง€ ์•Š๊ฑฐ๋‚˜ ์‚ญ์ œ๊ฐ€ ๊ฐ€๋Šฅํ•  ๋•Œ๋Š” 0์ด ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. 

๋งŒ์•ฝ ์นด์šดํ„ฐ๊ฐ€ 0์ด ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋•Œ discardedContentIfPossible์„ ํ˜ธ์ถœํ•˜๋ฉด ์นด์šดํ„ฐ์˜ ๊ฐ’์ด 0์ธ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•ด์ค€๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์„ ํƒ๋œ ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉ ์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์บ์‹œ์— ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด์„œ discardedContentIfPossible์„ ํ˜ธ์ถœํ•ด์ฃผ๋Š” ๊ฒƒ์ด์ฃ .

์‚ญ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด, isContentDiscarded๋ฅผ ํ†ตํ•ด ์กฐ๊ฑด๋ฌธ ๋ธ”๋ก ์•ˆ์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์‚ญ์ œํ•  ๊ฐ์ฒด์˜ cost๋ฅผ ์ €์žฅํ•ด ๋‘๊ณ  ๊ฐ์ฒด์˜ cost๋ฅผ 0์œผ๋กœ ๋งŒ๋“  ๋’ค์—, isEvictable์„ NO๋กœ ๋งŒ๋“ค์–ด์„œ ์ด ๊ฐ์ฒด๊ฐ€ ๋‹ค์‹œ ์„ ํƒ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ญ์ œํ•œ ํ›„์— ๊ทธ ํ‚ค ๊ฐ’์„ evictedKeys์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. 

๊ทธ ์ดํ›„์— ์ „์ฒด cost์—์„œ cost๋ฅผ ๋นผ์ฃผ๊ณ  ๋ฐฉ๊ธˆ ์ œ๊ฑฐํ•œ ๊ฐ์ฒด์˜ cost๊ฐ€ ์œ„์—์„œ ๊ณ„์‚ฐํ–ˆ๋˜ costNeeded๋ณด๋‹ค ํฌ๋‹ค๋ฉด ๋ฐ˜๋ณต์„ ์ค‘๋‹จํ•˜๊ณ , ์ž‘๋‹ค๋ฉด ์•„์ง ํ•„์š”ํ•œ ๋งŒํผ ๊ณต๊ฐ„์ด ํ™•๋ณด๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—  ๊ฐ™์€ ์ž‘์—…์„ ๋‹ค์Œ ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด evicted์— ์ฝ˜ํ…์ธ ๊ฐ€ ์‚ญ์ œ๋œ ๊ฐ์ฒด๋“ค์˜ ํ‚ค ๊ฐ’๋“ค์ด ๋ชจ์ด๊ฒ ์ฃ ?

๊ทธ๋ž˜์„œ ๋งˆ์ง€๋ง‰์—๋Š” evictedKeys์— ์ €์žฅ๋œ ํ‚ค ๊ฐ’๋“ค์„ ๋ชจ๋‘ ๊บผ๋‚ด์„œ ์บ์‹œ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ํ•ด๋‹น ํ‚ค์— ๋Œ€ํ•œ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. 

 

๋งˆ๋ฌด๋ฆฌ

์ด๋ ‡๊ฒŒ ํ•ด์„œ NSCache์˜ ๋‚ด๋ถ€๋ฅผ ํ™•์ธํ•ด๋ดค๋Š”๋ฐ์š”, ์ •๋ฆฌํ•˜์ž๋ฉด NSCache๋Š” LRU์™€ LFU๋ฅผ ํ˜ผํ•ฉํ•ด์„œ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์˜ค๋ž˜์ „์— ์ฐธ์กฐ๋œ ๊ฐ์ฒด๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ํ™•์ธํ•ด๋ณด์ง€๋งŒ, ๋งŒ์•ฝ ๊ทธ ๊ฐ์ฒด๊ฐ€ ์ฐธ์กฐ๋œ ํšŸ์ˆ˜๊ฐ€ ์บ์‹œ๊ฐ€ ๊ฐ€์ง„ ํ‰๊ท  ์ฐธ์กฐ ํšŸ์ˆ˜๋ณด๋‹ค ๋†’๋‹ค๋ฉด ๊ฝค ๋งŽ์ด ์ฐธ์กฐ๋œ ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์ด๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ ๋‹ค์‹œ ๋˜ ์ฐธ์กฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ•ด์„œ ์‚ญ์ œ ๋Œ€์ƒ์œผ๋กœ ์ •ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์ฃ . 

ํ•œ๋งˆ๋””๋กœ ๋งํ•ด๋ณด๋ฉด NSCache์˜ ์ •์ฑ…์€ "์ฐธ์กฐํ•œ ์ง€ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๊ฐ์ฒด ์ค‘์—์„œ ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ ํ‰๊ท  ์ฐธ์กฐ ํšŸ์ˆ˜๋ณด๋‹ค ์ ์€ ๊ฐ์ฒด"๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๊ฒ ๋„ค์š”.

ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ NSCache๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ์ด ๊ฝค ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ค ์ •์ฑ…์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ฒŒ ๋˜์–ด์„œ ๊ฝค ์˜๋ฏธ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ์Šต๋‹ˆ๋‹ค! ํ˜น์‹œ ์ž˜๋ชป๋œ ์ •๋ณด๊ฐ€ ์žˆ๊ฑฐ๋‚˜ ์ด์ƒํ•œ ๋‚ด์šฉ์ด ์žˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”! ์ €๋„ ๋‹ค์‹œ ๊ณ ๋ฏผํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!