mallocで取ったメモリ(2)
こんにちは kakapapaです。
안녕하세요 kakapapa입니다.
今日は「mallocで取ったメモリ」の2回目です。
오늘은 "malloc으로 얻은 메모리" 2번째 시간입니다.
(このタイトルで再び投稿する気は無かったんですが、前回の話にmalloc_usable_size()の内部実装の調査依頼がありまいたので…)
(이 제목으로 다시 글을 쓰려고 생각하진 않았습니다만, 지난번 글에 대해 malloc_usable_size()의 내부 구현에 대한 조사 의뢰가 있어서...)
本論に入って、
본론으로 들어가서,
Linux-glibc-のmalloc()は内部的にchunkと言う構造体でメモリを管理します。glibcに定義されたchunkは以下となります。
Linux-glibc-의 malloc()은 내부적으로 chunk라는 구조체로 메모리를 관리합니다. glibc에 정의된 chunk는 아래와 같습니다.
struct malloc_chunk {
INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T size; /* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links -- used only if free. */
struct malloc_chunk* bk;
};
確保された(allocated)chunkは以下の画のように表現できます。
할당된(allocated) chunk는 아래 그림처럼 표시될 수 있습니다.
1. (黒い四角) 確保されたchunk
1. (검은색 테두리) 할당된 chunk
2. (赤い領域) prev_sizeとsizeが保存された領域
2. (붉은색) prev_size와 size가 저장된 영역
3. (青い領域) ユーザが利用可能な領域
3. (파란색) 사용자가 이용 가능한 영역
では、*fdと*bkは何処にあるんでしょうか。構造体のコメントに説明がありますが、解放された(freed)chunkの場合だけその値が保存され、保存先は画の青い領域の最初の部分になります。この理由で(解放された場合*fd、*bkが保存されなければならないので)、chunkは最小のサイズ以上に確保されるようになっています(x86の場合align等の理由で20バイト)
그렇다면 *fd와 *bk는 어디에 있는 것일까요? 구조체의 코멘트에 있습니다만, 해제된(freed) chunk인 경우에만 그 값이 사용되며, 저장되는 위치는 위 그림의 파란색 영역의 시작 부분이 됩니다. 이와 같은 이유로(해제된 경우 *fd, *bk가 저장되어야 하므로), chunk의 크기는 최소한의 크기 이상이 할당되도록 되어 있습니다(x86의 경우 align등의 이유로 20바이트입니다).
で、ユーザが1バイトの確保を要求しても12バイトの領域を利用することができます。
따라서, 사용자가 1byte의 메모리 할당을 시도하더라도 최소한 12바이트의 영역을 사용할 수 있게됩니다.
実際に、chunk構造体のsize変数からユーザが利用可能な領域のサイズは以下のソースの様に得られます。
실제로, chunk 구조체의 size 변수로부터 사용자가 이용 가능한 영역의 크기는 아래의 소스와 같이 계산됩니다.
struct malloc_chunk {
size_t prev_size;
size_t size;
struct malloc_chunk* fd;
struct malloc_chunk* bk;
};
typedef struct malloc_chunk* mchunkptr;
#define mem2chunk(mem) ((mchunkptr)((char*)(mem) - 2*sizeof(size_t)))
#define chunk_is_mmapped(p) ((p)->size & 0x2)
#define chunksize(p) ((p)->size & ~0x7)
#define inuse(p) ((mchunkptr)(((char*)(p)) + ((p)->size & ~0x7)))->size |= 0x1
size_t malloc_usable_size(void *mem)
{
mchunkptr p;
if (!mem) return 0;
p = mem2chunk(mem);
if (chunk_is_mmapped(p))
return chunksize(p) - 2*sizeof(size_t);
else if (my_inuse(p))
return chunksize(p) - sizeof(size_t);
return 0;
}
malloc()/free()でchunkがとう管理されるかについてはまだ勉強中ですのでまた機会があれば説明します。
malloc()/free()에서 chunk가 어떻게 관리되는지에 대해서는 아직 공부중이므로 기회가 있으면 설명하도록 하겠습니다.




コメント