位圖記憶體管理:
每塊記憶體用一個二進制位表示它的使用狀态,如果該塊記憶體被占用,則把對應位圖中的對應位置1,如果空閑則置0,原理十分簡單。計算機裡面處理的位數最少的變量是位元組(byte),是以也就是8位做為一個整體來對待,8位表示的整數是從0到255。
fastdb中database的allocate實作定義了如下幾個數組。
static byte const firstHoleSize [] = {
8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,
5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0
};
static byte const lastHoleSize [] = {
8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
static byte const maxHoleSize [] = {
8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
5,4,3,3,2,2,2,2,3,2,2,2,2,2,2,2,4,3,2,2,2,2,2,2,3,2,2,2,2,2,2,2,
6,5,4,4,3,3,3,3,3,2,2,2,2,2,2,2,4,3,2,2,2,1,1,1,3,2,1,1,2,1,1,1,
5,4,3,3,2,2,2,2,3,2,1,1,2,1,1,1,4,3,2,2,2,1,1,1,3,2,1,1,2,1,1,1,
7,6,5,5,4,4,4,4,3,3,3,3,3,3,3,3,4,3,2,2,2,2,2,2,3,2,2,2,2,2,2,2,
5,4,3,3,2,2,2,2,3,2,1,1,2,1,1,1,4,3,2,2,2,1,1,1,3,2,1,1,2,1,1,1,
6,5,4,4,3,3,3,3,3,2,2,2,2,2,2,2,4,3,2,2,2,1,1,1,3,2,1,1,2,1,1,1,
5,4,3,3,2,2,2,2,3,2,1,1,2,1,1,1,4,3,2,2,2,1,1,1,3,2,1,1,2,1,1,0
};
static byte const maxHoleOffset [] = {
0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,0,1,5,5,5,5,5,5,0,5,5,5,5,5,5,5,
0,1,2,2,0,3,3,3,0,1,6,6,0,6,6,6,0,1,2,2,0,6,6,6,0,1,6,6,0,6,6,6,
0,1,2,2,3,3,3,3,0,1,4,4,0,4,4,4,0,1,2,2,0,1,0,3,0,1,0,2,0,1,0,5,
0,1,2,2,0,3,3,3,0,1,0,2,0,1,0,4,0,1,2,2,0,1,0,3,0,1,0,2,0,1,0,7,
0,1,2,2,3,3,3,3,0,4,4,4,4,4,4,4,0,1,2,2,0,5,5,5,0,1,5,5,0,5,5,5,
0,1,2,2,0,3,3,3,0,1,0,2,0,1,0,4,0,1,2,2,0,1,0,3,0,1,0,2,0,1,0,6,
0,1,2,2,3,3,3,3,0,1,4,4,0,4,4,4,0,1,2,2,0,1,0,3,0,1,0,2,0,1,0,5,
0,1,2,2,0,3,3,3,0,1,0,2,0,1,0,4,0,1,2,2,0,1,0,3,0,1,0,2,0,1,0,0
};
firstHoleSize[],lastHoleSize[],maxHoleSize[],maxHoleOffset[]四個固定的數組,每個數組都有256個元素,對應從0到255的整數。輸入數組的下标獲得二進制記憶體代表的頁面被占用情況。firstHoleSize數組表示從右向左數該數值的“洞”的個數,遇到占用結束計數;lastHoleSize數組表示從左向右數該數值的“洞”的個數,遇到占用結束計數。
舉例來說: 二進制記憶體B00001010代表十進制的10,記憶體占用如下:

firstHoleSize[]表示上面記憶體占用中,從右到左未被占用的頁面有多少個。如上圖所示,隻要記憶體末位為是1,那麼肯定沒有“洞”,是以奇數全為0。該二進制記憶體通過firstHoleSize獲得記憶體從右到左數,空洞個數為:firstHoleSize[10] = 1。lastHoleSize[]表示從左到右,未被占用的頁面多少個,隻要最左位為1,那是肯定沒有“洞”,是以大于128的全是0,該二進制記憶體通過lastHoleSize獲得從左到右數,空洞個數為:lastHoleSize[10] = 4。maxHoleSize[],表示連續的最大的“洞”是多少個頁面,該二進制記憶體通過maxHoleSize獲得連續的最大的空洞個數為:maxHoleSize[10] = 4。maxHoleOffset[]是和maxHoleSize[]一起使用的,表示從右到左數,最大的“洞”的位置,該二進制記憶體通過maxHoleOffset獲得最大的“洞”的位置為:maxHoleOffset[10] = 4。
依據上述規則,故形成上述表格數組資料。在記憶體空間的配置設定時,從管理位圖記憶體的數組中取出相應位圖數,先看看是不是有以前釋放的滿足要求,沒有的話就從未配置設定記憶體空間中配置設定。
32位作業系統對應fastdb的記憶體配置設定示意圖如下
參考:http://blog.csdn.net/liuxuezong/article/details/8702382