memlinkのmem

4271 ワード

memlinkは天涯の人によると灰常牛のkey-Listシステムで、Redisより何倍も速く、次はコードを少し見てみましょう.メモリ内のBlockも1つのプールで管理されており、使用されるデータ構造は大体3つのDataBlock、MemItem、MemPoolである.MemPoolの構造は以下の通りである.
typedef struct _mempool{
MemItem *freemem; //
int size;     //
int used;     // MemItem
int blocks;   //
}MemPool;

1つのメモリプールで管理されている様々なサイズのBlockは、同じサイズのBlockが統合されたMemItemに配置されて管理されます.この構造は次のとおりです.
typedef struct _mem_item{
int      memsize;     //
unsigned int block_count; //
unsigned int total;   //
DataBlock    *data;   //
}MemItem;

データを格納するDataBlockの構成は次のとおりです.
ypedef struct _data_block
{
unsigned short data_count;    //
unsigned short visible_count; // visible item count
unsigned short tagdel_count;   // tag delete item count, invisible
struct _data_block *prev;
struct _data_block *next;
char data[0];
}DataBlock;

この構造はメモリに双方向チェーンテーブルで保存され,チェーンテーブルのヘッダはMemItemに保存され,メモリの有無や申請メモリの操作は一般的である.ここでメモリプールを使用するのは、割り当ての解放によるオーバーヘッドを減らすためであることは明らかですが、expendのときにメモリサイズを変更しないシステム呼び出しはなぜですか?これにより、1回の割り当てと1回のコピーと1回の解放が減少する可能性があります.コードは次のとおりです.
int mempool_expand(MemPool *mp){
int newnum = mp->size * 2;
MemItem *newitems = (MemItem*)zz_malloc(sizeof(MemItem) * newnum);
if (NULL == newitems) {
DERROR("malloc error!
");
MEMLINK_EXIT;
return -1;
}
memcpy(newitems, mp->freemem, sizeof(MemItem) * mp->used);
zz_free(mp->freemem);
mp->freemem = newitems;
mp->size = newnum;
return 0;
}

-------------------------------------------
個人的にはレンガを撮ることを歓迎します.