๐Ÿ–ฅ๏ธ ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ ๊ตฌํ˜„: C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ˆจ์€ ๋ณด์„ ๐Ÿ’Ž

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ–ฅ๏ธ ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ ๊ตฌํ˜„: C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ˆจ์€ ๋ณด์„ ๐Ÿ’Ž

 

 

์•ˆ๋…•, ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์ •๋ง ํฅ๋ฏธ์ง„์ง„ํ•œ ์ฃผ์ œ๋กœ ์—ฌ๋Ÿฌ๋ถ„๊ณผ ํ•จ๊ป˜ํ•  ๊ฑฐ์•ผ. ๋ฐ”๋กœ 'ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ ๊ตฌํ˜„'์— ๋Œ€ํ•ด ๊นŠ์ด ํŒŒํ—ค์ณ๋ณผ ๊ฑฐ๋ž€ ๋ง์ด์ง€. ๐Ÿ˜Ž ์ด ์ฃผ์ œ๊ฐ€ ์™œ ์ค‘์š”ํ•˜๋ƒ๊ณ ? ์šฐ๋ฆฌ๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ์˜ ์„ฑ๋Šฅ์„ ํš๊ธฐ์ ์œผ๋กœ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋ฐ€ ๋ฌด๊ธฐ๋‹ˆ๊นŒ! ์ž, ์ด์ œ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋กœ ํ•จ๊ป˜ ๋น ์ ธ๋ณด์ž๊ณ .

๐Ÿ’ก ์•Œ๊ณ  ๊ฐ€์ž! ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ๋Š” ์ปดํ“จํ„ฐ ์„ฑ๋Šฅ์˜ ์ˆจ์€ ์˜์›…์ด์•ผ. ์ด๊ฑธ ์ œ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด, ๋„ˆ์˜ ํ”„๋กœ๊ทธ๋žจ์ด ๋กœ์ผ“์ฒ˜๋Ÿผ ๋นจ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ !

๐Ÿš€ ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ๋ž€ ๋ญ˜๊นŒ?

์ž, ๋จผ์ € ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ๊ฐ€ ๋ญ”์ง€ ์•Œ์•„๋ณด์ž. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ์ด๊ฑด ์ปดํ“จํ„ฐ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณณ์— ์ž„์‹œ๋กœ ์ €์žฅํ•ด๋‘๋Š” ๊ฑฐ์•ผ. ๋งˆ์น˜ ๋„ค๊ฐ€ ์ž์ฃผ ์“ฐ๋Š” ๋ฌผ๊ฑด์„ ์ฑ…์ƒ ์œ„์— ๋‘๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์ง€! ๐Ÿ—‚๏ธ

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ? ๋„ˆ๊ฐ€ ๋งค์ผ ์•„์นจ ์ปคํ”ผ๋ฅผ ๋งˆ์‹ ๋‹ค๊ณ  ์น˜์ž. ์ปคํ”ผ ๋จธ์‹ ์„ ๋งค๋ฒˆ ์ฐฌ์žฅ์—์„œ ๊บผ๋‚ด๊ณ  ๋‹ค์‹œ ๋„ฃ๋Š” ๊ฒƒ๋ณด๋‹ค, ๊ทธ๋ƒฅ ์ฃผ๋ฐฉ ์นด์šดํ„ฐ์— ๋‘๋Š” ๊ฒŒ ํ›จ์”ฌ ํŽธํ•˜๊ฒ ์ง€? ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ๋„ ์ด์™€ ๋น„์Šทํ•ด. ์ž์ฃผ ์“ฐ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ '์ฃผ๋ฐฉ ์นด์šดํ„ฐ' ๊ฐ™์€ ๊ณณ์— ๋‘๋Š” ๊ฑฐ์•ผ.

๐ŸŽˆ ์žฌ๋ฏธ์žˆ๋Š” ์‚ฌ์‹ค: ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ ๋•๋ถ„์—, ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์ด๋‚˜ ํ”„๋กœ๊ทธ๋žจ์ด ํ›จ์”ฌ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์—์„œ ์›ํ•˜๋Š” ์žฌ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ์ฐพ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด. ํšจ์œจ์ ์ด๊ณ  ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ์ด ์žˆ์œผ๋ฉด, ์›ํ•˜๋Š” ์žฌ๋Šฅ์„ ์ˆœ์‹๊ฐ„์— ์ฐพ์„ ์ˆ˜ ์žˆ์ž–์•„?

๐Ÿ› ๏ธ C ์–ธ์–ด๋กœ ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ ๊ตฌํ˜„ํ•˜๊ธฐ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ C ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ์ผ ์‹œ์Šคํ…œ ์บ์‹œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ ๊ฑฐ์•ผ. ๊ฒ๋จน์ง€ ๋งˆ! ์ฒœ์ฒœํžˆ, ๋‹จ๊ณ„๋ณ„๋กœ ํ•ด๋ณผ ๊ฑฐ๋‹ˆ๊นŒ. ๐Ÿ˜‰

1๏ธโƒฃ ๊ธฐ๋ณธ ๊ตฌ์กฐ ์„ค๊ณ„ํ•˜๊ธฐ

๋จผ์ €, ์šฐ๋ฆฌ์˜ ์บ์‹œ ์‹œ์Šคํ…œ์˜ ๋ผˆ๋Œ€๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์ด๊ฑด ๋งˆ์น˜ ์ง‘์„ ์ง€์„ ๋•Œ ๊ธฐ์ดˆ ๊ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„.


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_CACHE_SIZE 1024
#define MAX_FILENAME_LENGTH 256

typedef struct {
    char filename[MAX_FILENAME_LENGTH];
    char* data;
    size_t size;
} CacheEntry;

typedef struct {
    CacheEntry entries[MAX_CACHE_SIZE];
    int count;
} Cache;

Cache cache;
</string.h></stdlib.h></stdio.h>

์šฐ์™€, ๋ญ”๊ฐ€ ๋ณต์žกํ•ด ๋ณด์ด์ง€? ๊ฑฑ์ • ๋งˆ! ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ๐Ÿ˜Š

  • CacheEntry: ์ด๊ฑด ์บ์‹œ์˜ ๊ฐ ํ•ญ๋ชฉ์„ ๋‚˜ํƒ€๋‚ด. ํŒŒ์ผ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ, ํฌ๊ธฐ๋ฅผ ์ €์žฅํ•ด.
  • Cache: ์ „์ฒด ์บ์‹œ ์‹œ์Šคํ…œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด์•ผ. ์—ฌ๋Ÿฌ ๊ฐœ์˜ CacheEntry๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€.
  • MAX_CACHE_SIZE: ์บ์‹œ๊ฐ€ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํ•ญ๋ชฉ ์ˆ˜์•ผ. ์—ฌ๊ธฐ์„œ๋Š” 1024๊ฐœ๋กœ ์„ค์ •ํ–ˆ์–ด.

๐ŸŒŸ ๊ฟ€ํŒ: ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ๋ฌถ์„ ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ํŽธํ•ด์ง„๋‹ค๊ณ !

2๏ธโƒฃ ์บ์‹œ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ์ค€๋น„๋ฅผ ํ•ด๋ณผ๊นŒ? ์บ์‹œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.


void initCache() {
    cache.count = 0;
    memset(cache.entries, 0, sizeof(cache.entries));
}

์ด ํ•จ์ˆ˜๋Š” ์ •๋ง ๊ฐ„๋‹จํ•ด ๋ณด์ด์ง€? ํ•˜์ง€๋งŒ ์—„์ฒญ ์ค‘์š”ํ•ด! ์ด ํ•จ์ˆ˜๋Š” ์šฐ๋ฆฌ์˜ ์บ์‹œ๋ฅผ ๊นจ๋—์ด ๋น„์šฐ๊ณ  ์ƒˆ๋กœ ์‹œ์ž‘ํ•  ์ค€๋น„๋ฅผ ํ•ด์ฃผ๋Š” ๊ฑฐ์•ผ. ๋งˆ์น˜ ์ƒˆ ํ•™๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ฑ…๊ฐ€๋ฐฉ์„ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿ“š

3๏ธโƒฃ ์บ์‹œ์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ํ•˜๊ธฐ

์ด์ œ ์บ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ์–ด๋ณด์ž. ์ด๊ฑด ๋งˆ์น˜ ๋„ˆ์˜ ๋น„๋ฐ€ ์ƒ์ž์— ์†Œ์ค‘ํ•œ ๋ฌผ๊ฑด์„ ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด!


int addToCache(const char* filename, const char* data, size_t size) {
    if (cache.count >= MAX_CACHE_SIZE) {
        printf("์บ์‹œ๊ฐ€ ๊ฐ€๋“ ์ฐผ์–ด์š”! ๐Ÿ˜ฑ\n");
        return 0;
    }

    CacheEntry* entry = &cache.entries[cache.count];
    strncpy(entry->filename, filename, MAX_FILENAME_LENGTH - 1);
    entry->filename[MAX_FILENAME_LENGTH - 1] = '\0';
    
    entry->data = malloc(size);
    if (entry->data == NULL) {
        printf("๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์‹คํŒจ! ๐Ÿ˜ž\n");
        return 0;
    }
    
    memcpy(entry->data, data, size);
    entry->size = size;
    
    cache.count++;
    return 1;
}

์šฐ์™€, ์ด ํ•จ์ˆ˜๋Š” ์ข€ ๊ธธ์–ด ๋ณด์ด์ง€? ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ! ์ฒœ์ฒœํžˆ ์„ค๋ช…ํ•ด์ค„๊ฒŒ. ๐Ÿ˜Š

  1. ๋จผ์ €, ์บ์‹œ๊ฐ€ ๊ฐ€๋“ ์ฐผ๋Š”์ง€ ํ™•์ธํ•ด.
  2. ๊ทธ ๋‹ค์Œ, ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ์œ„ํ•œ ๊ณต๊ฐ„์„ ๋งŒ๋“ค๊ณ  ํŒŒ์ผ ์ด๋ฆ„์„ ๋ณต์‚ฌํ•ด.
  3. ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•ด.
  4. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์บ์‹œ์— ์ €์žฅ๋œ ํ•ญ๋ชฉ ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ.

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ: ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์ •๋ง ์ค‘์š”ํ•ด! ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์ด ๋Š๋ ค์ง€๊ฑฐ๋‚˜ ์‹ฌ์ง€์–ด ์ถฉ๋Œํ•  ์ˆ˜๋„ ์žˆ์–ด. ํ•ญ์ƒ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ผญ ํ•ด์ œํ•ด์ฃผ๋Š” ๊ฑธ ์žŠ์ง€ ๋งˆ!

4๏ธโƒฃ ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์•„๋ณด์ž. ์ด๊ฑด ๋งˆ์น˜ ๋„์„œ๊ด€์—์„œ ์›ํ•˜๋Š” ์ฑ…์„ ์ฐพ๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด!


CacheEntry* findInCache(const char* filename) {
    for (int i = 0; i < cache.count; i++) {
        if (strcmp(cache.entries[i].filename, filename) == 0) {
            return &cache.entries[i];
        }
    }
    return NULL;
}

์ด ํ•จ์ˆ˜๋Š” ์บ์‹œ๋ฅผ ๋’ค์ ธ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๋Š” ํŒŒ์ผ์„ ๋ฐœ๊ฒฌํ•˜๋ฉด ๊ทธ ์ •๋ณด๋ฅผ ๋Œ๋ ค์ค˜. ๋ชป ์ฐพ์œผ๋ฉด? ๊ทธ๋Ÿผ NULL์„ ๋ฐ˜ํ™˜ํ•˜์ง€. ๋งˆ์น˜ ์ฑ…์„ ์ฐพ๋‹ค๊ฐ€ ์—†์œผ๋ฉด ๋นˆ์†์œผ๋กœ ๋Œ์•„์˜ค๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿ“š

5๏ธโƒฃ ์บ์‹œ ์ •๋ฆฌํ•˜๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ, ์šฐ๋ฆฌ์˜ ์บ์‹œ๋ฅผ ๊นจ๋—์ด ์ •๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์ด๊ฑด ๋ฐฉ ์ฒญ์†Œํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด!


void cleanCache() {
    for (int i = 0; i < cache.count; i++) {
        free(cache.entries[i].data);
    }
    cache.count = 0;
}

์ด ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ์บ์‹œ ํ•ญ๋ชฉ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ•ด์ œํ•˜๊ณ , ์บ์‹œ๋ฅผ ๋น„์›Œ. ๋งˆ์น˜ ํ•™๋…„์ด ๋๋‚˜๊ณ  ์ฑ…๊ฐ€๋ฐฉ์„ ์™„์ „ํžˆ ๋น„์šฐ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

๐Ÿ’ก ์ค‘์š” ํฌ์ธํŠธ: ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜์•ผ. ํ•ญ์ƒ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ํ•ด์ œํ•ด์ฃผ๋Š” ๊ฑธ ์žŠ์ง€ ๋งˆ! ์ด๊ฑด ๋งˆ์น˜ ๋นŒ๋ฆฐ ๋ฌผ๊ฑด์„ ๊ผญ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„.

๐ŸŽญ ์‹ค์ œ ์‚ฌ์šฉ ์˜ˆ์‹œ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์บ์‹œ ์‹œ์Šคํ…œ์„ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ. ์ด๊ฑด ๋งˆ์น˜ ์ƒˆ๋กœ ์‚ฐ ์žฅ๋‚œ๊ฐ์„ ์ฒ˜์Œ ๊ฐ€์ง€๊ณ  ๋…ธ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‹ ๋‚˜๋Š” ์ผ์ด์•ผ! ๐Ÿ˜„


int main() {
    initCache();  // ์บ์‹œ ์ดˆ๊ธฐํ™”

    // ์บ์‹œ์— ๋ฐ์ดํ„ฐ ์ถ”๊ฐ€
    addToCache("file1.txt", "Hello, World!", 14);
    addToCache("file2.txt", "C programming is fun!", 23);

    // ์บ์‹œ์—์„œ ๋ฐ์ดํ„ฐ ์ฐพ๊ธฐ
    CacheEntry* entry = findInCache("file1.txt");
    if (entry) {
        printf("Found in cache: %s\n", entry->data);
    } else {
        printf("Not found in cache\n");
    }

    // ์บ์‹œ ์ •๋ฆฌ
    cleanCache();

    return 0;
}

์ด ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, ์šฐ๋ฆฌ์˜ ์บ์‹œ ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ๋ฏธ๋‹ˆ ์˜ํ™”๋ฅผ ๋ณด๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์•„? ๐ŸŽฌ

  1. ๋จผ์ € ์บ์‹œ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด.
  2. ๊ทธ ๋‹ค์Œ, ๋‘ ๊ฐœ์˜ ํŒŒ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์— ์ถ”๊ฐ€ํ•ด.
  3. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ, "file1.txt"๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์ฐพ์•„๋ด.
  4. ๋งˆ์ง€๋ง‰์œผ๋กœ, ์‚ฌ์šฉ์ด ๋๋‚œ ์บ์‹œ๋ฅผ ๊นจ๋—์ด ์ •๋ฆฌํ•ด.

๐ŸŒˆ ์žฌ๋ฏธ์žˆ๋Š” ์ƒ๊ฐ: ์ด ์บ์‹œ ์‹œ์Šคํ…œ์€ ๋งˆ์น˜ ์žฌ๋Šฅ๋„ท์˜ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ๊ณผ ๋น„์Šทํ•ด! ์‚ฌ์šฉ์ž๋“ค์ด ์ž์ฃผ ์ฐพ๋Š” ์žฌ๋Šฅ์„ ๋น ๋ฅด๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด, ์žฌ๋Šฅ๋„ท๋„ ๋น„์Šทํ•œ ์บ์‹ฑ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ.

๐Ÿš€ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์บ์‹œ ์‹œ์Šคํ…œ์„ ๋”์šฑ ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๋ณผ๊นŒ? ์—ฌ๊ธฐ ๋ช‡ ๊ฐ€์ง€ ๊ฟ€ํŒ์„ ์ค„๊ฒŒ. ์ด๊ฑด ๋งˆ์น˜ ๋„ค ์ž์ „๊ฑฐ๋ฅผ ์Šˆํผ์นด๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„! ๐ŸŽ๏ธ

1. ํ•ด์‹œ ํ…Œ์ด๋ธ” ์‚ฌ์šฉํ•˜๊ธฐ

์ง€๊ธˆ์€ ์šฐ๋ฆฌ๊ฐ€ ์„ ํ˜• ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์–ด. ์ด๊ฑด ๋งˆ์น˜ ๋„์„œ๊ด€์—์„œ ์ฑ…์„ ์ฐพ์„ ๋•Œ ์ฑ…์žฅ์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ๋’ค์ง€๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€. ํ•˜์ง€๋งŒ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋ฉด? ์™€์šฐ, ์—„์ฒญ ๋นจ๋ผ์งˆ ๊ฑฐ์•ผ!


#include <stdint.h>

#define HASH_TABLE_SIZE 1024

typedef struct {
    CacheEntry* entries[HASH_TABLE_SIZE];
    int count;
} HashCache;

HashCache hashCache;

// ๊ฐ„๋‹จํ•œ ํ•ด์‹œ ํ•จ์ˆ˜
uint32_t hash(const char* str) {
    uint32_t hash = 5381;
    int c;
    while ((c = *str++))
        hash = ((hash << 5) + hash) + c;
    return hash % HASH_TABLE_SIZE;
}

void addToHashCache(const char* filename, const char* data, size_t size) {
    uint32_t index = hash(filename);
    // ์—ฌ๊ธฐ์— ์ถฉ๋Œ ์ฒ˜๋ฆฌ ๋กœ์ง ์ถ”๊ฐ€
    // ...
}

CacheEntry* findInHashCache(const char* filename) {
    uint32_t index = hash(filename);
    // ์—ฌ๊ธฐ์— ๊ฒ€์ƒ‰ ๋กœ์ง ์ถ”๊ฐ€
    // ...
}
</stdint.h>

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ O(n)์—์„œ O(1)๋กœ ๋นจ๋ผ์ ธ! ๋งˆ์น˜ ์ฑ…์„ ์ฐพ์„ ๋•Œ ๋ฐ”๋กœ ๊ทธ ์ฑ…์ด ์žˆ๋Š” ์ฑ…์žฅ์œผ๋กœ ์งํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€.

๐ŸŽ“ ์•Œ์•„๋‘๋ฉด ์ข‹์€ ์ : ํ•ด์‹œ ํ…Œ์ด๋ธ”์€ ๋งŽ์€ ์‹ค์ œ ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ด๋Ÿฐ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

2. LRU (Least Recently Used) ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ

์บ์‹œ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ, ์–ด๋–ค ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•ด์•ผ ํ• ๊นŒ? LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€์žฅ ์˜ค๋ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ํ•ญ๋ชฉ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ๋งˆ์น˜ ๋ƒ‰์žฅ๊ณ ์—์„œ ์œ ํ†ต๊ธฐํ•œ์ด ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ์Œ์‹๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด!


typedef struct CacheNode {
    char filename[MAX_FILENAME_LENGTH];
    char* data;
    size_t size;
    struct CacheNode* prev;
    struct CacheNode* next;
} CacheNode;

typedef struct {
    CacheNode* head;
    CacheNode* tail;
    int count;
    int capacity;
} LRUCache;

LRUCache lruCache;

void initLRUCache(int capacity) {
    lruCache.head = lruCache.tail = NULL;
    lruCache.count = 0;
    lruCache.capacity = capacity;
}

void addToLRUCache(const char* filename, const char* data, size_t size) {
    // ์—ฌ๊ธฐ์— LRU ์ถ”๊ฐ€ ๋กœ์ง ๊ตฌํ˜„
    // ...
}

CacheNode* findInLRUCache(const char* filename) {
    // ์—ฌ๊ธฐ์— LRU ๊ฒ€์ƒ‰ ๋กœ์ง ๊ตฌํ˜„
    // ...
}

void removeLRU() {
    // ์—ฌ๊ธฐ์— ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ํ•ญ๋ชฉ ์ œ๊ฑฐ ๋กœ์ง ๊ตฌํ˜„
    // ...
}

์ด LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด, ์บ์‹œ๊ฐ€ ๊ฐ€๋“ ์ฐผ์„ ๋•Œ ๊ฐ€์žฅ ํšจ์œจ์ ์œผ๋กœ ๊ณต๊ฐ„์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์˜ท์žฅ์—์„œ ์˜ค๋ž˜ ์ž…์ง€ ์•Š์€ ์˜ท๋ถ€ํ„ฐ ์ •๋ฆฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

๐Ÿ” ๊นŠ์ด ๋“ค์–ด๊ฐ€๊ธฐ: LRU ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹ค์ œ๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์žฌ๋Šฅ๋„ท์—์„œ ์‚ฌ์šฉ์ž๋“ค์ด ์ž์ฃผ ๋ณด๋Š” ์žฌ๋Šฅ ์ •๋ณด๋ฅผ ์บ์‹œ์— ์ €์žฅํ•  ๋•Œ ์ด๋Ÿฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด.

3. ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ์ง€์› ์ถ”๊ฐ€ํ•˜๊ธฐ

์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์‹œ์— ์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด? ์™€, ์ด๊ฑด ์ •๋ง ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์–ด! ํ•˜์ง€๋งŒ ๊ฑฑ์ • ๋งˆ, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์„ ์ง€์›ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด. ์ด๊ฑด ๋งˆ์น˜ ์—ฌ๋Ÿฌ ๋ช…์˜ ๋„์„œ๊ด€ ์‚ฌ์„œ๊ฐ€ ๋™์‹œ์— ์ผํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„!


#include <pthread.h>

pthread_mutex_t cache_mutex = PTHREAD_MUTEX_INITIALIZER;

void thread_safe_add_to_cache(const char* filename, const char* data, size_t size) {
    pthread_mutex_lock(&cache_mutex);
    addToCache(filename, data, size);
    pthread_mutex_unlock(&cache_mutex);
}

CacheEntry* thread_safe_find_in_cache(const char* filename) {
    pthread_mutex_lock(&cache_mutex);
    CacheEntry* result = findInCache(filename);
    pthread_mutex_unlock(&cache_mutex);
    return result;
}
</pthread.h>

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

๐Ÿš€ ์„ฑ๋Šฅ ํŒ: ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์€ ์„ฑ๋Šฅ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋™์‹œ์— ๋ณต์žก์„ฑ๋„ ์ฆ๊ฐ€ํ•ด. ํ•ญ์ƒ ๋ฐ๋“œ๋ฝ(deadlock)์ด๋‚˜ ๋ ˆ์ด์Šค ์ปจ๋””์…˜(race condition) ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์กฐ์‹ฌํ•ด์•ผ ํ•ด!

๐Ÿงช ํ…Œ์ŠคํŠธ์™€ ๋””๋ฒ„๊น…

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ๋ฉ‹์ง„ ์บ์‹œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์—ˆ์–ด. ํ•˜์ง€๋งŒ ์ž ๊น, ์ด๊ฒŒ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ? ๋ฐ”๋กœ ํ…Œ์ŠคํŠธ์™€ ๋””๋ฒ„๊น…์ด ํ•„์š”ํ•œ ์‹œ์ ์ด์•ผ! ์ด๊ฑด ๋งˆ์น˜ ์ƒˆ๋กœ ๋งŒ๋“  ์š”๋ฆฌ๋ฅผ ๋ง›๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ๐Ÿณ

1. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ

๊ฐ ํ•จ์ˆ˜๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž. ์ด๊ฑด ๋งˆ์น˜ ๋ ˆ๊ณ  ๋ธ”๋ก์„ ํ•˜๋‚˜์”ฉ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„!


#include <assert.h>

void test_add_and_find() {
    initCache();
    addToCache("test.txt", "Hello, Test!", 13);
    CacheEntry* entry = findInCache("test.txt");
    assert(entry != NULL);
    assert(strcmp(entry->data, "Hello, Test!") == 0);
    printf("Add and Find test passed!\n");
}

void test_cache_full() {
    initCache();
    for (int i = 0; i < MAX_CACHE_SIZE + 1; i++) {
        char filename[20];
        sprintf(filename, "file%d.txt", i);
        int result = addToCache(filename, "Test", 5);
        if (i == MAX_CACHE_SIZE) {
            assert(result == 0);
            printf("Cache full test passed!\n");
            return;
        }
    }
    assert(0 && "Should not reach here");
}

int main() {
    test_add_and_find();
    test_cache_full();
    return 0;
}
</assert.h>

์ด๋Ÿฐ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ์šฐ๋ฆฌ ์ฝ”๋“œ์˜ ๊ฐ ๋ถ€๋ถ„์ด ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์š”๋ฆฌ์˜ ๊ฐ ์žฌ๋ฃŒ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ง›๋ณด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์ง€!

๐ŸŽฏ ํ”„๋กœ ํŒ: ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์— ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ TDD(Test-Driven Development)๋ผ๊ณ  ํ•ด. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์•ˆ์ •์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด!

2. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ์ฒดํฌํ•˜๊ธฐ

C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ๋ฌด์„œ์šด ์  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์•ผ. ์ด๊ฑด ๋งˆ์น˜ ๋ฌผ์ด ์ƒˆ๋Š” ํŒŒ์ดํ”„์™€ ๊ฐ™์•„์„œ, ์ฒœ์ฒœํžˆ ํ•˜์ง€๋งŒ ํ™•์‹คํ•˜๊ฒŒ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” Valgrind ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ์ฒดํฌํ•  ๊ฑฐ์•ผ!


// ํ„ฐ๋ฏธ๋„์—์„œ ์‹คํ–‰:
// valgrind --leak-check=full ./your_program

Valgrind๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ž์„ธํžˆ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์˜์‚ฌ๊ฐ€ ๋„ˆ์˜ ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ!

๐Ÿšจ ์ฃผ์˜์‚ฌํ•ญ: ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ค๊ณ , ์‹ฌ๊ฐํ•œ ๊ฒฝ์šฐ ์‹œ์Šคํ…œ ์ถฉ๋Œ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์–ด. ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ์ฃผ์˜๋ฅผ ๊ธฐ์šธ์ด์ž!

3. ๋กœ๊น… ์ถ”๊ฐ€ํ•˜๊ธฐ

ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด? ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒŒ ์ข‹์•„! ์ด๊ฑด ๋งˆ์น˜ ๋„ˆ์˜ ์ผ๊ธฐ์žฅ์„ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“  ์ค‘์š”ํ•œ ํ–‰๋™์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์ง€.


#include <time.h>

void log_message(const char* message) {
    time_t now;
    time(&now);
    printf("[%s] %s\n", ctime(&now), message);
}

// ์‚ฌ์šฉ ์˜ˆ:
log_message("์บ์‹œ์— ์ƒˆ ํ•ญ๋ชฉ ์ถ”๊ฐ€๋จ");
log_message("์บ์‹œ์—์„œ ํ•ญ๋ชฉ ์ฐพ์ง€ ๋ชปํ•จ");
</time.h>

์ด๋ ‡๊ฒŒ ๋กœ๊น…์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ํƒ์ •์ด ์‚ฌ๊ฑด์˜ ๋ชจ๋“  ๋‹จ์„œ๋ฅผ ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿ•ต๏ธโ€โ™‚๏ธ

๐Ÿ’ก ์Šค๋งˆํŠธ ํŒ: ๋กœ๊ทธ ๋ ˆ๋ฒจ(์˜ˆ: DEBUG, INFO, WARNING, ERROR)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ฒด๊ณ„์ ์œผ๋กœ ๋กœ๊ทธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€์™€ ๋œ ์ค‘์š”ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์ง€!

๐ŸŒŸ ๊ณ ๊ธ‰

๐ŸŒŸ ๊ณ ๊ธ‰ ์ตœ์ ํ™” ๊ธฐ๋ฒ•

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์บ์‹œ ์‹œ์Šคํ…œ์„ ํ•œ ๋‹จ๊ณ„ ๋” ์—…๊ทธ๋ ˆ์ด๋“œํ•ด๋ณผ ์‹œ๊ฐ„์ด์•ผ! ์ด๊ฑด ๋งˆ์น˜ ์ผ๋ฐ˜ ์ž๋™์ฐจ๋ฅผ ์Šˆํผ์นด๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„. ์ค€๋น„๋๋‹ˆ? ๊ฐ€๋ณด์ž๊ณ ! ๐ŸŽ๏ธ๐Ÿ’จ

1. ์บ์‹œ ๊ต์ฒด ์ •์ฑ… ๊ฐœ์„ ํ•˜๊ธฐ

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” LRU(Least Recently Used) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ์–ด. ํ•˜์ง€๋งŒ ๋” ๋˜‘๋˜‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด? ARC(Adaptive Replacement Cache) ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์†Œ๊ฐœํ• ๊ฒŒ!


typedef struct {
    LRUCache recent;
    LRUCache frequent;
    HashSet ghost_recent;
    HashSet ghost_frequent;
    int target;
} ARCache;

ARCache arc_cache;

void init_arc_cache(int capacity) {
    // ARC ์บ์‹œ ์ดˆ๊ธฐํ™” ๋กœ์ง
    // ...
}

void arc_cache_access(const char* key) {
    // ARC ์ ‘๊ทผ ๋กœ์ง
    // 1. ์ตœ๊ทผ ์‚ฌ์šฉ ๋ฆฌ์ŠคํŠธ์—์„œ ์ฐพ๊ธฐ
    // 2. ์ž์ฃผ ์‚ฌ์šฉ ๋ฆฌ์ŠคํŠธ์—์„œ ์ฐพ๊ธฐ
    // 3. ๊ณ ์ŠคํŠธ ๋ฆฌ์ŠคํŠธ ํ™•์ธ ๋ฐ ์กฐ์ •
    // ...
}

ARC๋Š” LRU๋ณด๋‹ค ๋” ๋˜‘๋˜‘ํ•ด! ์ตœ๊ทผ์— ์‚ฌ์šฉ๋œ ํ•ญ๋ชฉ๊ณผ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ•ญ๋ชฉ์„ ๋ชจ๋‘ ๊ณ ๋ คํ•˜์ง€. ๋งˆ์น˜ ๋„ˆ๊ฐ€ ์˜ท์žฅ์„ ์ •๋ฆฌํ•  ๋•Œ, ์ตœ๊ทผ์— ์ž…์€ ์˜ท๊ณผ ์ž์ฃผ ์ž…๋Š” ์˜ท์„ ๋ชจ๋‘ ์•ž์ชฝ์— ๋‘๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ด!

๐Ÿง  ์‹ฌํ™” ํ•™์Šต: ARC ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ IBM์—์„œ ๊ฐœ๋ฐœํ–ˆ์–ด. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์‹ค์ œ๋กœ ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์ง€! ์žฌ๋Šฅ๋„ท ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ๋„ ์ด๋Ÿฐ ๊ณ ๊ธ‰ ์บ์‹ฑ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ํฌ๊ฒŒ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์–ด.

2. ์••์ถ• ๊ธฐ์ˆ  ๋„์ž…ํ•˜๊ธฐ

์บ์‹œ์— ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? ์••์ถ• ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด๋ณด๋Š” ๊ฑด ์–ด๋•Œ? ์ด๊ฑด ๋งˆ์น˜ ์ง„๊ณต ํฌ์žฅ๊ธฐ๋กœ ์˜ท์„ ์••์ถ•ํ•ด์„œ ๋” ๋งŽ์ด ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„!


#include <zlib.h>

typedef struct {
    char* compressed_data;
    uLong compressed_size;
    uLong original_size;
} CompressedCacheEntry;

CompressedCacheEntry* compress_data(const char* data, size_t size) {
    CompressedCacheEntry* entry = malloc(sizeof(CompressedCacheEntry));
    entry->original_size = size;
    entry->compressed_size = compressBound(size);
    entry->compressed_data = malloc(entry->compressed_size);
    
    if (compress2((Bytef*)entry->compressed_data, &entry->compressed_size, 
                  (const Bytef*)data, size, Z_BEST_COMPRESSION) != Z_OK) {
        free(entry->compressed_data);
        free(entry);
        return NULL;
    }
    return entry;
}

char* decompress_data(CompressedCacheEntry* entry) {
    char* decompressed = malloc(entry->original_size);
    uLong decompressed_size = entry->original_size;
    
    if (uncompress((Bytef*)decompressed, &decompressed_size, 
                   (const Bytef*)entry->compressed_data, entry->compressed_size) != Z_OK) {
        free(decompressed);
        return NULL;
    }
    return decompressed;
}
</zlib.h>

์ด๋ ‡๊ฒŒ ์••์ถ• ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด. ๋ฌผ๋ก  ์••์ถ•๊ณผ ํ•ด์ œ์— ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ์ง€!

โš–๏ธ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„: ์••์ถ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ €์žฅ ๊ณต๊ฐ„์€ ์ ˆ์•ฝ๋˜์ง€๋งŒ, CPU ์‚ฌ์šฉ๋Ÿ‰์€ ์ฆ๊ฐ€ํ•ด. ํ•ญ์ƒ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์ ˆํ•œ ๊ท ํ˜•์„ ์ฐพ๋Š” ๊ฒŒ ์ค‘์š”ํ•ด!

3. ๋ถ„์‚ฐ ์บ์‹œ ์‹œ์Šคํ…œ ๊ตฌํ˜„ํ•˜๊ธฐ

ํ•˜๋‚˜์˜ ์ปดํ“จํ„ฐ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค๊ณ ? ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๋Ÿฌ ๋Œ€์˜ ์ปดํ“จํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ„์‚ฐ ์บ์‹œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณด์ž! ์ด๊ฑด ๋งˆ์น˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฐฝ๊ณ ๋ฅผ ์—ฐ๊ฒฐํ•ด์„œ ํ•˜๋‚˜์˜ ํฐ ์ฐฝ๊ณ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑฐ์•ผ.


#include <sys>
#include <netinet>
#include <arpa>

typedef struct {
    char ip[16];
    int port;
} CacheNode;

typedef struct {
    CacheNode nodes[MAX_NODES];
    int node_count;
} DistributedCache;

DistributedCache dist_cache;

int hash_key(const char* key) {
    // ๊ฐ„๋‹จํ•œ ํ•ด์‹œ ํ•จ์ˆ˜
    unsigned long hash = 5381;
    int c;
    while ((c = *key++))
        hash = ((hash << 5) + hash) + c;
    return hash % dist_cache.node_count;
}

void add_to_distributed_cache(const char* key, const char* value) {
    int node_index = hash_key(key);
    CacheNode* node = &dist_cache.nodes[node_index];
    
    // ์—ฌ๊ธฐ์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋…ธ๋“œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก
    // (์‹ค์ œ ๊ตฌํ˜„์€ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ)
    // ...
}

char* get_from_distributed_cache(const char* key) {
    int node_index = hash_key(key);
    CacheNode* node = &dist_cache.nodes[node_index];
    
    // ์—ฌ๊ธฐ์„œ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ด
    // ...
}
</arpa></netinet></sys>

์ด๋Ÿฐ ๋ถ„์‚ฐ ์บ์‹œ ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋ฉด ์—„์ฒญ๋‚œ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์—ฌ๋Ÿฌ ๋ช…์˜ ์นœ๊ตฌ๋“ค๊ณผ ํ•จ๊ป˜ ํฐ ํผ์ฆ์„ ๋งž์ถ”๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ๊ฐ€ ํ˜‘๋ ฅํ•ด์„œ ์ผํ•˜๋Š” ๊ฑฐ์ง€!