메모리 청크를 이렇게 구성함
struct Chunk {
size_t ref_count;
size_t capacity;
size_t size;
struct Chunk* next;
uint8_t payload[0];
};
그리고 메모리 풀을 구성함
struct Pool {
struct Chunk* using;
struct Chunk* unused;
};
메모리 할당을 요청하면.
처음에는 unused에 있는 청크에서 할당을 시도함.
unsed에서 size + (요청받은 메모리 크기) < capacity인 청크가 없으면 다음에는 using에서 찾음.
그리고 using에서도 찾지 못하면 새로이 메모리 청크를 생성함.
할당에 성공하면 size와 ref_count가 증가하고 payload에서 포인터를 반환함. (이때 해당 위치 앞에 struct Chunk*값을 집어넣음)
메모리 해제를 요청하면
주어진 포인터에서 sizeof(uinptr_t)만큼 빼서 struct Chunk*값을 얻음.
그리고 ref_count만 줄임.
ref_count가 0이 되면 size를 0으로 지정하고 using에서 unused로 이동시킴.
이러면 괜찮은 메모리 풀이 될 것같았음.
근데 spinlock이나 mutex없이 아토믹 연산으로 하려니까 머리 아프더라. 그래서 포기함
이거 vector 원리 아니냐 - dc App
청크 하나는 비슷하게 동작함
ㅇㅇ - dc App