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...