從Linux BITMAP到索引池的實現

2021-09-08 23:44:06 字數 1703 閱讀 5200

linux**中很多地方為了對某個資源進行標記使用了bitmap方式,每個標記位只占用乙個bit,如cpumask,它的定義在:

include\linux\bitops.h

#define bits_per_type(type) (sizeof(type) * bits_per_byte)

#define bits_to_longs(nr) div_round_up(nr, bits_per_type(long)) //(nr, 4 * 8 = 32)

#include

#define declare_bitmap(name,bits) unsigned long name[bits_to_longs(bits)] // bits個位需要多少個long

typedef struct cpumask cpumask_t;

//定義乙個結構體,成員位乙個long陣列,其包含的bit數大於nr_cpus

static inline void cpumask_clear_cpu(int cpu, struct cpumask *dstp)

通過這些巨集可以看出,所有的bit都是儲存在乙個陣列中,通過bits_to_longs計算出陣列的大小,隨後通過一系列的巨集和函式提供bit位的設定,檢查和清除操作;如:

在實際的工作中,可能需要乙個資料結構,它可以分配在乙個連續範圍內不重複的索引,要可以方便的進行分配、釋放,快速檢查某個索引是否被占用,這裡我們可以借用linux上面這段**中的方法,定義如下資料結構:

索引池的管理結構:

typedef struct tagindex_pool_s

index_pool_t;

索引池初始化:

int index_pool_init(int count, index_pool_t* pstindexpoolctr)

通常索引池需要提供以下操作,分配、釋放和檢查操作:

// 索引的分配

int indx_pool_alloc_index(unsigned int *index, index_pool_t* pstindexpoolctr)

} if (i == < pstindexpoolctr->nr)

for (int b = 0; b < sizeof(unsigned long) * 8; ++b) }

return -1;

}// 索引的釋放

int indx_pool_free_index(unsigned int index, index_pool_t* pstindexpoolctr)

// 索引的檢查

int indx_pool_test_index(unsigned int index, index_pool_t* pstindexpoolctr)

還可以這個索引池做進一步優化,如為了提高分配速度,可以加乙個標記,標記最近釋放的或者未分配的bit索引,這樣就不需從pstindexpoolctr->bits的第乙個開始遍歷;還有如:要求索引池分配的索引不是從0開始,可以在控制字段中加乙個字段表示偏移,如:

typedef struct tagindex_pool_s

index_pool_t;

上面分配操作函式頁需要做相應的修改,對入參index做相應的修正。

搜尋引擎從入門到精通

搜尋引擎從入門到精通之一 基礎篇 妮妮,今天給我講講google吧?聽說它是目前最好用的搜尋引擎之一。好。google的確是非常好用的搜尋引擎。我記得google由兩個史丹福大學博士生larry page和sergey brin設計,於1998年9月發布測試版,一年後正式開始商業運營。google發...

雲計算 從基礎到應用架構系列索引

由於最近收集了比較多的雲計算方面相關的內容,一方面是由於個人的興趣及愛好的原因,另外是參加了一些大會,看到了未來企業發展的方向,並且結合目前自身工作的部分需要,特對目前的一些知識進行總結,當然本系列中的討論的可能不會是只針對微軟雲進行討論,我可能更多的對比這些 不同的雲提供商之前進行對比和講解,詳細...

Solr配置從Mysql匯入資料到索引庫

1.在solr的解壓縮檔案中solr 4.10.4 dist下面,找到solr dataimporthandler 4.10.4.jar與 還有mysql的驅動的jar放在solrhome下的collection1下的lib中,沒有lib資料夾可以新建 例如我的home在 g solr servic...