linux0.11緩衝處理過程及一點塊設備的基礎知識

關於linux緩衝處理過程及一點塊設備的基礎知識

 

: 塊設備硬盤的基礎知識:

硬盤存儲信息的格式是按柱面、磁頭號和扇區來存儲的,硬磁盤每個存儲表面被劃分成若干個磁道,每道劃分成若干個扇區。

存儲容量=磁頭數×柱面數×扇區數×每扇區字節數

磁頭數: 磁頭是硬盤讀取數據的關鍵部件,,在工作狀態時,磁頭懸浮在盤片上方,而不與盤片直接接觸,電源關閉之後,磁頭會自動回到在盤片上的起始位置。硬盤的磁頭數取決於硬盤中的碟片數,盤片正反兩面都存儲着數據,所以一個盤片對應兩個磁頭才能正常工作。比如總容量80GB的硬盤,採用單碟容量80GB的盤片,那只有一張盤片,該盤片正反面都有數據,則對應兩個磁頭;而同樣總容量120GB的硬盤,採用二張盤片,則只有三個磁頭,其中一張盤片的一面沒有磁頭。

扇區: 硬盤內部是金屬盤片,將圓形的盤片劃分成若干個扇形區域,這就是扇區.

磁道: 以盤片中心爲圓心,把盤片分成若干個同心圓,那每一個劃分圓的線條,就稱爲磁道。

柱面: N張盤片中相同位置的磁道組成一個柱面,磁道 v==柱面數

:高速緩衝工作過程及相關基本算法:

緩衝的結構

struct buffer_head {

       char * b_data;                    //每個都指向一個1024字節地址

       unsigned long b_blocknr;  //掛鉤的設備的塊號

       unsigned short b_dev;              // 數據源的設備號

       unsigned char b_uptodate; //更新標誌表示數據已經更新

       unsigned char b_dirt;         //乾淨或者髒頁標誌0乾淨1

       unsigned char b_count;     //經常被用到的引用記數設計模式的計數器

       unsigned char b_lock;              //鎖定標誌1鎖定

       struct task_struct * b_wait; //所有訪問此設備此塊的任務等待隊列

       struct buffer_head * b_prev;

       struct buffer_head * b_next;

       struct buffer_head * b_prev_free;

       struct buffer_head * b_next_free;

};

 

A:初始化過程

    0.11基本思想我們要將內存劃分爲1024字節一塊的N塊緩衝數據區,並且以上面的數據結構來管理這部分緩衝。我們下面看下基本劃分內存的過程:

    0.11中內存主要劃分成內核0~640KB(內核代碼不到640KB),顯存和BOIS信息(640KB~1MB),高速緩衝區(1M~XM),部分虛擬盤,然後是主存儲區。(X的值可以參考設計獲取16M內存則X=4,8M內存則X=2…) .

    管理通過hash表和空閒聯表共同管理。通過設備號和邏輯塊號作爲主鍵進行hash,我們所有操作設備的數據都是通過這段緩衝進行管理。

B:處理過程

    請求數據:我們先根據讀的位置在hash表中映射位置查看對應位置中是否存在已經被請求的緩衝塊,比如是否已經有其他的進程請求過此塊內容,如果匹配到那麼直接返回hash中的節點位置,執行對應操作就可以了。如果沒有hash表中存在,那麼就要到空閒塊中申請一個塊作爲此設備的緩衝,並鏈入hash,並將此塊從空閒隊列中移除放到空閒的最後。找此塊的條件首先需要引用記數爲0標誌其沒有被任何進程佔用,然後需要不髒並且未被鎖定。B_dirty, b_lock可以不爲0(最好都爲0,其次不爲髒)。然後依次等待解鎖,等待同步直到找到一個完全乾淨的塊。當然其間一旦此塊又被佔用又會去掃描hash然後掃描空閒隊列重複開頭操作。

    其中可以看到有個比較特殊的bread_page,其實就是一次操作4個塊,目的爲適應內存管理時的頁面交換等操作。因爲一個頁面是4kb等於4個塊大小。

   

另外有點關於linux使用的LRU算法, 普通直觀的LRU算法,要在塊表中爲每一塊設置一個計數器。被裝入或被替換的塊,其對應的計數器清爲"0",同組中其它所有塊所屬的計數器都加"1"。命中的塊,其對應的計數器清爲"0"。同組中其它所有計數器中,凡是計數器的值小於命中塊所屬計數器原來值的,都加"1",其它計數器不變。需要替換時,在同組的所有計數器中選擇計數值最大(一般爲全1)的計數器,它所對應的塊就是要被替換的塊。

linux採用的是雙向空閒聯表和hash輔助實現了這個算法。值得借鑑。其實看了也只是形式變換了,本質也沒有變只是多組變成了一組,最新被使用的聯表將被鏈入空閒最後的地方表示最不空閒的。其中的引用記數和簡單的hash和鏈表結合使用功能不錯的技術。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章