memory poo l是實現客制化的allocator的常見手法,尤其是對快速的alloc/free有很高要求的環境。之所以可以有較快速的alloc/free,是因為memory pool的特性 - 每個pool中的基本block的大小是一樣的,而alloc時,所要求的memory也都是一個block。 怎麼利用這個特性來實作快速的alloc/free呢?以 Linux kernel為例 ,我們可以看到: 18 static void add_element ( mempool_t * pool , void * element ) 19 { 20 BUG_ON ( pool -> curr_nr >= pool -> min_nr ); 21 pool -> elements [ pool -> curr_nr ++] = element ; 22 } 23 24 static void * remove_element ( mempool_t * pool ) 25 { 26 BUG_ON ( pool -> curr_nr <= 0); 27 return pool -> elements [-- pool -> curr_nr ]; 28 } pool->elments[]是在使用者呼叫 mempool_create(...) 時所動態建立,存放的是一組void *,指向實際可被使用的memory block。當呼叫 mempool_alloc(...) 時,經過一些檢查與處理,就會呼叫到remove_element(...),回傳指到的memory block的位址,然後將下一次要給出的block位址由pool->curr_nr去索引。很簡單又快速的便完成alloc,free則是類似的反向動作而已。 太簡單了吧?你這麼想著。沒錯,但有人寫出類似如下的實作(當然,是簡化的版本,不過意思到了 :P): static struct block *remove_element(mempool *pool) { struct block *blk= NULL; ...