Skip to content

Latest commit

ย 

History

History
146 lines (136 loc) ยท 12.5 KB

220110_NSCache.md

File metadata and controls

146 lines (136 loc) ยท 12.5 KB

220110 NSCache

TIL (Today I Learned)

1์›” 11์ผ (ํ™”)

ํ•™์Šต ๋‚ด์šฉ

  • ์˜คํ”ˆ ๋งˆ์ผ“ ํ”„๋กœ์ ํŠธ STEP 2 PR ์ž‘์„ฑ
  • NSCache์ด๋ž€?

ย 

๊ณ ๋ฏผํ•œ ์  / ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

[NSCache]

  • ์บ์‹œ๋ฉ”๋ชจ๋ฆฌ(Cache Memory)๋ž€?
    • ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์™€ CPU๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์†๋„ ํ–ฅ์ƒ์„ ์œ„ํ•œ ์ค‘๊ฐ„ ๋ฒ„ํผ ์—ญํ• ์„ ํ•˜๋Š” CPU ๋‚ด ๋˜๋Š” ์™ธ์— ์กด์žฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ
    • ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ์‚ฌ์ด์—์„œ ๋น ๋ฅด๊ฒŒ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋‹จ๊ธฐ๊ฐ„์— ํ•„์š”๋กœ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ์ •๋ณด๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•  ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์šฉ๋Ÿ‰์ด ๋” ํฐ ์ €์žฅ์žฅ์น˜๋“ค์€ ์šฉ๋Ÿ‰์ด ์ž‘์€ ์ €์žฅ์žฅ์น˜๋“ค๋ณด๋‹ค ์†๋„๊ฐ€ ๋Š๋ฆฐ๋ฐ ์†๋„์ฐจ์ด์— ๋”ฐ๋ฅธ ๋ณ‘๋ชฉํ˜„์ƒ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ์ด๋‹ค.
    • ์ง€์—ญ์„ฑ์„ ์ด์šฉํ•˜์—ฌ CPU๊ฐ€ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•  ๊ฒƒ์ธ๊ฐ€๋ฅผ ์–ด๋Š์ •๋„ ์˜ˆ์ธกํ•˜์—ฌ ์บ์‹œ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค.
  • ์ง€์—ญ์„ฑ(Locality)
    • CPU์—์„œ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ๋งค๋ฒˆ Cache Memory๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ Hit๋ฅ ์ด ์ง€์—ญ์„ฑ์„ ๊ฐ–๋Š”๋‹ค.
    • ์ง€์—ญ์„ฑ(Locality Of Reference)์€ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๊ธฐ์–ต์žฅ์น˜ ๋‚ด์˜ ์ •๋ณด๋ฅผ ๊ท ์ผํ•˜๊ฒŒ ์•ก์„ธ์Šคํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์–ด๋Šํ•œ ์ˆœ๊ฐ„์— ํŠน์ •๋ถ€๋ถ„์„ ์ง‘์ค‘์ ์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
    • ์ง€์—ญ์„ฑ ๋ฉ”๋ชจ๋ฆฌ์˜ ์œ„์น˜์™€ ์ ‘๊ทผ ์‹œ๊ฐ„์— ๋”ฐ๋ผ์„œ ๊ณต๊ฐ„์ , ์‹œ๊ฐ์ ์ธ ํŠน์„ฑ์„ ๋ณด์ธ๋‹ค.
    • ๊ณต๊ฐ„์  ์ง€์—ญ์„ฑ(Spatial Locality)
      • ์ตœ๊ทผ์— ์ฐธ์กฐ๋œ ์ฃผ์†Œ์˜ ์ธ์ ‘ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ฐธ์กฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ํŠน์„ฑ
      • a[0], a[1] ์ฒ˜๋Ÿผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋ฐฐ์—ด์— ์—ฐ์†์ ์œผ๋กœ ์ ‘๊ทผํ•  ๋•Œ ์ฐธ์กฐ๋œ ๋ฐ์ดํ„ฐ ๊ทผ์ฒ˜์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์ž ์‹œ ํ›„ ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
    • ์‹œ๊ฐ„ ์ง€์—ญ์„ฑ(Temporal Locality)
      • ์ตœ๊ทผ์— ์ฐธ์กฐ๋œ ์ฃผ์†Œ์˜ ๋‚ด์šฉ์ด ์žฌ ์ฐธ์กฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ํŠน์„ฑ
      • For, While ๊ฐ™์€ ๋ฐ˜๋ณต๋ฌธ์— ์‚ฌ์šฉ๋˜๋Š” ์กฐ๊ฑด ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ํ•œ๋ฒˆ ์ฐธ์กฐ๋œ ๋ฐ์ดํ„ฐ๋Š” ์ž ์‹œ ํ›„ ์ฐธ์กฐ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.
  • ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ๋Š”, ์ฐธ์กฐ ์ง€์—ญ์„ฑ(๊ณต๊ฐ„)์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์˜† ์ฃผ์†Œ์˜ ๋ฐ์ดํ„ฐ๋„ ๊ฐ™์ด ๊ฐ€์ ธ์™€ ๋ฏธ๋ž˜์— ์“ฐ์ผ ๊ฒƒ์„ ๋Œ€๋น„ํ•ด์•ผ ํ•œ๋‹ค.
  • ์บ์‹œ ๋ฏธ์Šค(Cache miss)๋ž€?
    • CPU๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ์ด๋ฅผ ์บ์‹œํžˆํŠธ๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด์„œ DRAM์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค๋ฉด ์บ์‹œ ๋ฏธ์Šค ๋ผ๊ณ  ํ•œ๋‹ค.
    • ์บ์‹œ๋ฏธ์Šค ์œ ํ˜•์—” 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
      • Cold start miss(Compulsory miss)
        • ๋ฐ์ดํ„ฐ์— ์ฒ˜์Œ ์ ‘๊ทผ ์‹œ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ฐœ์ƒํ•˜๋Š” ์บ์‹œ๋ฏธ์Šค
      • Capactiy miss
        • ์บ์‹œ์˜ ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•˜์—ฌ ๋ฐœ์ƒํ•˜๋Š” ๋ฏธ์Šค
        • ์ฆ‰ ํ”„๋กœ๊ทธ๋žจ ์ˆ˜ํ–‰์‹œ ์ ‘๊ทผํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์บ์‹œ์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ๋„˜์–ด๊ฐˆ ๊ฒฝ์šฐ ๋ฐœ์ƒํ•œ๋‹ค.
        • ์˜ˆ๋ฅผ ๋“ค์–ด 32K direct mapped cache๋ฅผ ๋‹ฌ๊ณ  ์žˆ๋Š” ์ปดํ“จํ„ฐ์—์„œ 128k array data๋ฅผ ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ ์บ์‹œ๋Š” array data๋ฅผ ๋ชจ๋‘ ์ €์žฅํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์šฉ๋Ÿ‰ ๋ถ€์กฑ์— ์˜ํ•œ ์บ์‹œ๋ฏธ์Šค๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฏธ์Šค๋ฅผ capacity miss๋ผ ํ•œ๋‹ค.
      • Conflict miss
        • ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— A์™€ B ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์•ผํ•˜๋Š”๋ฐ, A์™€ B๊ฐ€ ๊ฐ™์€ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ํ• ๋‹น๋˜์–ด์„œ ๋‚˜๋Š” ์บ์‹œ๋ฏธ์Šค.
        • ์บ์‹œ๋ฏธ์Šค ๋น„์œจ์€ ๋Œ€์ฒด๋กœ ํ‰๊ท  10% ์•ˆ์ชฝ์ด๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•ด ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์˜ ํ‰๊ท  ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ ์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋Ÿญ ์†๋„, ์ฝ”์–ด ๊ฐœ์ˆ˜์™€ ํ•จ๊ป˜ ์ปดํ“จํ„ฐ ์„ฑ๋Šฅ์—์„œ ๋งค์šฐ ํฐ ๋น„์ค‘์„ ์ฐจ์ง€ํ•œ๋‹ค.
        • ๊ทธ๋Ÿฌ๋‚˜ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๋ฉฐ ์‹ค์ œ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†์ด ํด๋Ÿญ ์†๋„๊ฐ€ ๋” ๋†’์€ CPU๊ฐ€ ํด๋Ÿญ์†๋„๋Š” ๋‚ฎ์ง€๋งŒ ์บ์‹œ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๋Š” CPU๋ณด๋‹ค ๋Œ€์ฒด๋กœ ๋” ๋‚˜์œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค€๋‹ค.
  • ์š”์•ฝ
    • ์บ์‹œ๋Š” ์žฌ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์„๋งŒํ•œ ์ž์›์„ ํŠน์ • ์˜์—ญ์— ์ €์žฅํ•ด๋†“๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ถ”๊ฐ€์ ์ธ ์ž์›์„ ์†Œ๋ชจํ•˜์ง€ ์•Š๊ณ  caching Data๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์›์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ํ–ฅ์ƒ๋œ๋‹ค.
    • Caching์€ ์›น ๋ธŒ๋ผ์šฐ์ €๋ถ€ํ„ฐ ์›น ์„œ๋ฒ„, ํ•˜๋“œ ๋””์Šคํฌ ๋ฐ CPU์— ์ด๋ฅด๊ธฐ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฉด์—์„œ ์ ์šฉ๋˜๊ณ  ์žˆ๋‹ค.
    • iOS์—์„œ ์บ์‹ฑ์€ memory caching๊ณผ disk caching 2๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
  • Memory Caching
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์˜ ์ผ๋ถ€๋ถ„์„ ์บ์‹ฑ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
    • ํ•˜์ง€๋งŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜์–ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋ฉด ์ด ์˜์—ญ์— ์žˆ๋˜ ๋ฆฌ์†Œ์Šค๋“ค์€ OS์— ๋ฐ˜ํ™˜๋˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹ฑ๋˜์–ด์žˆ๋˜ ๋ฆฌ์†Œ์Šค๋“ค์€ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.
  • Disk Caching
    • ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ผ ํ˜•ํƒœ๋กœ ๋””์Šคํฌ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ป๋‹ค ์ผœ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š์ง€๋งŒ, ๋””์Šคํฌ ์บ์‹ฑ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋ฉด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ฐจ์ง€ํ•˜๋Š” ์šฉ๋Ÿ‰์ด ์ปค์ง„๋‹ค.
      • ex) ์นด์นด์˜คํ†ก์—์„œ ์ด๋ฏธ์ง€๋‚˜ ๋™์˜์ƒ์„ ๋””๋ฐ”์ด์Šค์— ์ €์žฅํ•˜์ง€ ์•Š๋”๋ผ๋„ ๋ˆˆ์œผ๋กœ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์•ผํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํŒŒ์ผ๋“ค์ด Disk Chching๋˜์–ด ์•ฑ์„ ์ข…๋ฃŒํ–ˆ๋‹ค๊ฐ€ ์‹คํ–‰ํ•ด๋„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ํŠน์ด iOS์—์„œ๋Š” NSCache๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ฃผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹ฑ์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.
  • NSCache
    • ์ฃผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹ฑ์— ์‚ฌ์šฉ๋˜๋Š” ํด๋ž˜์Šค
    • ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋  ๋•Œ ์ž๋™์œผ๋กœ ์บ์‹œ๋œ ๋‚ด์šฉ์ด ์ œ๊ฑฐ๋˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ ์ž์›์ด ๋ถ€์กฑํ•ด๋„ ์‚ญ์ œ ๋Œ€์ƒ์ด ๋œ๋‹ค.
    • NSCache๋Š” Thread-Safeํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ์ ‘๊ทผํ•  ๋•Œ์—๋„ Cache์— lock์„ ๊ฑธ์–ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • key-value ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž„์‹œ๋กœ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋ณ€ ์ปฌ๋ ‰์…˜์„ ๋งํ•œ๋‹ค.
    • ํŠน์ง•
      • Linked List๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๋ฐ ์‚ญ์ œ์— ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. (ํƒ์ƒ‰ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(n))
      • ๋ณ„๋„์˜ Dictionary๋ฅผ ๋‘์–ด ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์—๋„ ์šฉ์ดํ•˜๋‹ค (๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(1))
  • NSDictionary์™€์˜ ์ฐจ์ด์ 
    • ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ(๊ธฐ๋ณธ ์ œ๊ณต)
      • ๋จผ์ € NSCache๋Š” ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๊ฝ‰ ์ฐจ๋ฉด ์ž๋™์œผ๋กœ ์บ์‹œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•ด์ค€๋‹ค.
      • ์•ฑ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•œ๋ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์šฐ๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ๊ฒƒ
      • ๋งŒ์•ฝ NSDictionary๋ฅผ Cache ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ์‹œ์Šคํ…œ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ›์•˜์„ ๋•Œ ์‚ฌ์ „์ด ์ด์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.
    • Thread-Safe
      • NSCache๋Š” Thread-Safeํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๊ณ  ์ง€์šธ๋•Œ๋งˆ๋‹ค ๋”ฐ๋กœ lock์„ ํ•ด์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
        • ๋™์‹œ์— ์—ฌ๋Ÿฌ Thread๊ฐ€ ์ ‘๊ทผํ•˜๋”๋ผ๋„ ๊ฐ์ž lock์„ ์žก์•„์ค„ ํ•„์š”๊ฐ€ ์—†๋‹ค.
      • ํ•˜์ง€๋งŒ NSDictionary๋Š” Thread-safeํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ ‘๊ทผํ•  ๋•Œ ๋”ฐ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    • Retain Key
      • NSCache๋Š” key๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋ฆฌํ…Œ์ธํ•œ๋‹ค.
      • key๊ฐ€ ๋ณต์‚ฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๋„ ํฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค.
      • ๋”ฐ๋ผ์„œ ๋ณต์‚ฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด์™€๋„ ์ž˜ ๋™์ž‘ํ•œ๋‹ค.
  • NSCache Declaration
class NSCache<KeyType, ObjectType> : NSObject where KeyType : AnyObject, ObjectType : AnyObject
  • NSCache Property
    • Cache ๊ฐ์ฒด์—๋Š” ๋‹ค์–‘ํ•œ ์ž๋™ ์ œ๊ฑฐ ์ •์ฑ…์ด ์žˆ์œผ๋ฉฐ ์ด๋“ค์„ ํ†ตํ•ฉํ•˜์—ฌ ์ผ๋ถ€ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•œ๋‹ค.
    • ์ด๋Ÿฌํ•œ ์ž๋™ ์ œ๊ฑฐ ์ •์ฑ…์—๋Š” ์บ์‹œ ๊ฐ์ฒด์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ณ  ๋ชจ๋“  ์บ์‹œ ๊ฐ์ฒด์˜ ์ตœ๋Œ€ cost๋ฅผ ์ œํ•œํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋‹ค.
    • var countLimit: Int
      • ์บ์‹œ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ํ•œ์˜ ๊ฐ์ฒด ์ˆ˜
      • ์œ„ ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ์บ์‹ฑํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ๋งŒ์•ฝ countLimit๊ฐ€ 10์œผ๋กœ ์„ค์ •๋˜์–ด์žˆ๋Š”๋ฐ, 11๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ NSCache์— ๋„ฃ๊ฒŒ ๋˜๋ฉด 1๊ฐœ๋Š” ์ž๋™์œผ๋กœ ๋ฒ„๋ฆฐ๋‹ค.
      • ๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ๊ฐœ์ˆ˜ ์ œํ•œ์ด ์—†๋‹ค.
    • var totalCostLimit: Int
      • ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์ „์— ์บ์‹œ๊ฐ€ ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋น„์šฉ
      • ๊ฐ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ cost(Int)๋ฅผ ํ•จ๊ป˜ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ด ๋•Œ, totalCostLimit์€ cost๋“ค์˜ ์ดํ•ฉ์˜ ์ตœ๋Œ“๊ฐ’์ด๋‹ค.
      • ์ฆ‰ NSCache์— ์ถ”๊ฐ€๋œ ๋ฐ์ดํ„ฐ๋“ค์˜ cost๊ฐ€ totalCostLimit์— ๋„๋‹ฌํ•˜๊ฑฐ๋‚˜ ๋„˜๊ฒŒ๋˜๋ฉด NSCache๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„๋ฆฐ๋‹ค.
      • ๊ธฐ๋ณธ๊ฐ’์€ 0์œผ๋กœ ๋น„์šฉ ์ œํ•œ์ด ์—†๋‹ค.
    <์˜ˆ์‹œ>
    let cache: NSCache<NSString, UIImage> = NSCache()
    cache.countLimit // ํ—ˆ์šฉํ•˜๋Š” key์˜ ๊ฐœ์ˆ˜
    cache.totalCostLimit // cost ํ•ฉ๊ณ„์˜ ์ตœ๋Œ“๊ฐ’
    • var evictsObjectsWithDiscardedContent: Bool
      • NSCache๋Š” ์‹œ์Šคํ…œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ๋””์ž์ธ๋˜์–ด ์žˆ๋‹ค.
      • ๊ทธ๋ž˜์„œ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ์ง€์šฐ๋Š” ๋‹ค์–‘ํ•œ ์ •์ฑ…์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
      • protocol NSDiscardableContent
        • ํด๋ž˜์Šค ๋‚ด ๊ฐ์ฒด์˜ ํ•˜์œ„ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ๋•Œ ์‚ญ์ œ๋˜์–ด๋„ ๋œ๋‹ค๋ฉด ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•จ์œผ๋กœ์จ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ณต๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
      • func object(forKey: KeyType) -> ObjectType
        • ์ฃผ์–ด์ง„ key์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • NSDiscardableContent
    • NSCache๋Š” ์ž๋™์œผ๋กœ ๊ฐ์ฒด์˜ ์บ์‹ฑ ๋ฐ ์ œ๊ฑฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€๋งŒ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•  ์‹œ๊ธฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜๋Š” ์—†๋‹ค.
    • ๋”์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒฝ์šฐ NSPurgeableData, NSDiscardableContent ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • NSDiscardableContent๋Š” ํ•„์š”ํ•œ ์ˆœ๊ฐ„์— ์‚ฌ์šฉํ•˜๋˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜๋‚ฉํ•ด์•ผํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.
    • NSDiscardableContent ํ”„๋กœํ† ์ฝœ์€ ๋‚ด๋ถ€์กฑ์œผ๋กœ ๊ฐ์ฒด์˜ life cycle์„ ๋‹ค๋ฃจ๋Š” Counter ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค.
    • Counter ๋ณ€์ˆ˜๋Š” ํ˜„์žฌ ๊ฐ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๊ฐ์ฒด์—์„œ ์‚ฌ์šฉ์ค‘์ธ์ง€ ์—ฌ๋ถ€๋ฅผ ์ถ”์ ํ•˜๋Š” ์šฉ๋„ ์‚ฌ์šฉ๋œ๋‹ค.
    • ๊ธฐ๋ณธ์ ์œผ๋กœ Counter ๋ณ€์ˆ˜๋Š” 1๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค.
    • beginContentAccess() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 1์”ฉ ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๊ณ  endContentIfPossible() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น์‹œ์ ์— ๊ด€๋ จ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•ด์ œ๋œ๋‹ค.
  • NSPurgeableData
    • ํ•ด๋‹น ํด๋ž˜์Šค๋Š” ๋”์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜๋‚ฉํ•ด์•ผํ•˜๋Š” mutable data ๊ฐ์ฒด์ด๋‹ค.
    • ์ด ๊ฐ์ฒด๋Š” ์ž๋™ ๋ฐ˜๋‚ฉ๋˜๋Š” ๋ฐ์ดํ„ฐ(autopurging data)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
    • ์ด ๊ธฐ๋Šฅ์€ ์ด ๊ฐ์ฒด๊ฐ€ ์ž๋™์œผ๋กœ ๋ฐ˜๋‚ฉ๋˜๋ฉด ์บ์‹œ์—์„œ๋„ ์ž๋™์œผ๋กœ ์ œ๊ฑฐ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.
    • class NSPurgeableData: NSMutableData
      • ์ด ํด๋ž˜์Šค๋Š” NSDiscardableContent ํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๋Š” NSMutableData์˜ ์„œ๋ธŒํด๋ž˜์Šค๋‹ค
      • NSPurgeableData๋Š” NSDiscardableContent ํ”„๋กœํ† ์ฝœ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์ด ๋˜์–ด์žˆ๋‹ค.
      • NSPurgeableData ๊ฐ์ฒด๊ฐ€ NSCache์— ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๋ฉด ๋ฐ˜๋‚ฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜๋‚ฉ๋˜๋ฉด ์ž๋™์œผ๋กœ ์บ์‹œ์—์„œ ์ œ๊ฑฐ๋œ๋‹ค.
      • ๋ฐ˜๋‚ฉ๋  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์— ์ ‘๊ทผํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋ฐ˜๋‚ฉ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด beginContentAccess()๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•œ๋‹ค.
      • ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด ์‚ฌ์šฉ์ด ๋๋‚ฌ์„ ๊ฒฝ์šฐ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ˜๋‚ฉํ•ด๋„ ๋œ๋‹ค๊ณ  ์•Œ๋ฆฌ๋Š” endContentAccess()๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • NSCache ๊ตฌํ˜„
    • ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹ฑํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„œ ๋ช…ํ™•ํžˆ ์„œ์ˆ ๋˜์–ด ์žˆ์ง€๋Š” ์•Š์ง€๋งŒ, ์บ์‹œ๋Š” ์ค‘๊ฐ„์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๋นˆ๋ฒˆํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ ์œ„ํ•ด(๋ฐฐ์—ด๋กœ ํ•ด๋‹น ์ž‘์—…์„ ์ˆ˜ํ–‰์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์•ž์œผ๋กœ ๋‹น๊ธฐ๊ฑฐ๋‚˜ ๋’ค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ฐ€์–ด์•„ํ•˜๋Š” ์ž‘์—…์ด ์ถ”๊ฐ€์ ์œผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค.) ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„๋œ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
    • ๋˜ํ•œ NSCache๋Š” ๋ณ„๋„๋กœ Dictionary๋ฅผ ๋‘์–ด ๋ฐ์ดํ„ฐ์˜ ์ ‘๊ทผ๋„ O(1)์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๊ณ  ์žˆ๋‹ค.
// NSCache
open class NSCache<KeyType : AnyObject, ObjectType : AnyObject> : NSObject {

    private var _entries = Dictionary<NSCacheKey, NSCacheEntry<KeyType, ObjectType>>()
    private var _head: NSCacheEntry<KeyType, ObjectType>?
}