第十二章學習筆記

2022-09-10 03:06:09 字數 3569 閱讀 6676

塊裝置將資訊儲存在固定大小的塊中,每個塊都有自己的位址。對作業系統來說,塊裝置是以字元裝置的外觀展現的,雖然對這種字元裝置可以按照位元組為單位進行訪問,但是實際上到塊裝置上卻是以塊為單位(最小512byte,既乙個扇區)。這之間的轉換是由作業系統來完成的。

扇區:磁碟碟片上的扇形區域,邏輯化資料,方便管理磁碟空間,是硬體裝置資料傳輸的基本單位,一般為512byte。

塊:塊是vfs(虛擬檔案系統)和檔案系統資料傳輸的基本單位,必須是扇區的整數倍,格式化檔案系統時,可以指定塊大小。

bio:bio是通用塊層i/o請求的資料結構,表示上層提交的i/o求情。乙個bio包含多個page(既page cache 核心緩衝頁 在記憶體上),這些page對應磁碟上的一段連續的空間。由於檔案在磁碟上並不連續存放,檔案i/o提交到塊這杯之前,極有可能被拆分成多個bio結構。

request:表示塊裝置驅動層i/o請求,經由i/o排程層轉換後(既電梯演算法合併)的i/o請求,將會被傳送到塊裝置驅動層進行處理。

request_queue: 維護塊裝置驅動層i/o請求的佇列,所有的request都插入到該佇列,每個磁碟裝置都只有乙個queue(多個分割槽也只有乙個)。

這三個結構的關係如下圖所示,乙個request_queue中包含多個request,每個request可能包含多個bio,請求的合併就是根據各種演算法(1.noop 2.deadline 3.cfq)將多個bio加入到同乙個request中。

物理塊裝置1/o:每個裝置都有乙個i/o 佇列,其中包含等待 i/o 操作的緩衝區。緩衝區上的 start io0 操作如下:

start_io(buffer *bp)

當 i/o 操作完成後,裝置中斷處理程式會完成當前緩衝區上的 i/o 操作,並啟動i/o佇列中的下乙個緩衝區的i/o(如果佇列不為空)。裝置中斷處理程式的演算法如下:

interrupthandler()

(1)i/o 緩衝區:核心中的一系列 nbuf 緩衝區用作緩衝區快取。每個緩衝區用乙個結構體表示。

typdef struct bufbuffer:

buffer buf[nbufl,*freelist; // nbuf buffers and free buffer list

緩衝區結構體由兩部分組成:用於緩衝區管理的緩衝頭部分和用於資料塊的資料部分。為了保護核心記憶體,狀態字段可以定義為乙個位向量,其中每個位表示乙個唯一的狀態條件。為了便於討論,這裡將它們定義為inte

(2)裝置表:每個塊裝置用乙個裝置表結構表示。

struct devtabdevtab[ndev];
每個裝置表都有乙個dev list,包含當前分配給該裝置的i/o緩衝區,還有乙個io qucue,包含裝置上等待 i/o操作的緩衝區。i/o 佇列的組織方式應確保最佳 i/o 操作。例如,它可以實現各種磁碟排程演算法,如電梯演算法或線性掃瞄演算法等。為了簡單起見,unix 使用 fifo i/o 佇列。

(3)緩衝區初始化:當系統啟動時,所有 i/o緩衝區都在空閒列表中,所有裝置列表和 i/o 佇列均為空。

(4)緩衝區列表:當緩衝區分配給(dev,blk)時,它會被插入裝置表的dev_list 中。如果緩衝區當前正在使用,則會將其標記為 busy(繁忙)並從空閒列表中刪除。繁忙緩衝區也可能會在裝置表的i/o 佇列中。由於乙個緩衝區不能同時處於空閒狀態和繁忙狀態,所以可通過使用相同的 next free 指標來維護裝置 1/o 佇列。當緩衝區不再繁忙時,它會被釋放回空閒列表,但仍保留在dev list中,以便可能重用。只有在重新分配時,緩衝區才可能從乙個dev list更改到另乙個dev list中。如前文所述,讀/寫磁碟塊可以表示為 bread bwrite 和 dwrite,它們都要依賴於 getblk 和 brelse。因此,getblk 和 brelse 構成了 unix 緩衝區管理方案的核心。getblk 和 brelse 演算法如下。

(5)unix getblk/brelse 演算法((lion 1996;(bach 1990)第3章)。

1)效率低下

2)快取效果不可預知

3)可能會出現飢餓

4)該演算法只適用於單處理系統的休眠/喚醒操作

假設有乙個單處理器核心(一次執行乙個程序)。使用計數訊號量上的 p/v 來設計滿足以下要求的新的緩衝區管理演算法:

注意,僅通過訊號量上的p/v來替換 unix 演算法中的休眠/喚醒並不可取,因為這樣會保留所有的重試迴圈。我們必須重新設計演算法來滿足所有上述要求,並證明新演算法的確優於 unix 演算法。首先,我們定義以下訊號量。

buffer buf[nbuf]; // nbuf i/o buffers 

semaphore free = nbuf; // counting semaphore for free buffers

semaphore buf[i].sem = 1; // each buffer has a lock sem=1;

為了簡化符號,我們將用緩衝區本身來表示每個緩衝區的訊號量。與unix 演算法一樣,最開始,所有緩衝區都在空閒列表中,所有裝置列表和 1/0 佇列均為空。下面展示乙個使用訊號量的簡單緩衝區管理演算法。pv演算法,參考哲學家進餐問題。

#include #include #include #include #define total 20

void *father(void *);

void *mather(void *);

void *son(void *);

void *daughter(void *);

void print_sem();

int main()

void *father(void *arg)

}void *mather(void *arg)

}void *son(void *arg)

}void *daughter(void *arg)

}void print_sem()

執行結果:

1、為什麼要有輸入輸出緩衝區?

答:有輸入輸出緩衝區用以暫時存放讀寫期間的檔案資料而在記憶體區預留的一定空間。即利用主存的儲存空間來暫存從磁碟中輸入輸出的資訊。目的是緩和cpu 與 i/o 裝置間速度不匹配的矛盾。減少對 cpu 的中斷頻率,放寬對 cpu 中斷響應時間的限制。提高 cpu和 i/o 裝置之間的並行性。

2、日常較為常見的計算機緩衝區有哪幾種型別?

答:日常較為常見的緩衝區,根據緩衝的應用層次不同,分別可以分為以下幾種型別:主機板與cpu的快取,這兩者是基於計算機硬體層次的緩衝區,能夠有效地提高計算機的資料處理能力;作業系統與網路協議層的緩衝區,這則是在系統軟體層的分類,為了提高訪問速度,**門戶常常會基於緩衝原理使用一些元件,以實現資訊的快速互動;在應用程式這一次層,緩衝區又可分為應用程式、資料庫系統的緩衝區等等,一般來說,開發較為完善的大型軟體會自己配備記憶體管理程式,在執行軟體執行時自動進行對緩衝區的管理。

第十二章 學習筆記

檔案系統使用一系列i o緩衝區作為塊裝置的快取記憶體。當程序試圖讀取 dev,blk 標識的磁碟塊時,他首先在緩衝區快取中搜尋分配給磁碟塊的緩衝區。如果緩衝區中存在並且包含有效資料,那麼它只需要從緩衝區中讀取資料,而無需再次從磁碟中讀取資料塊。如果該緩衝區不存在,他會為磁碟塊分配乙個緩衝區,將資料從...

C Primer Plus 第十二章筆記

1.呼叫複製建構函式 當函式按值傳遞物件或函式返回物件時,都將使用複製建構函式。2.如果類中包含了使用new初始化的指標成員,應當定義乙個複製建構函式,以複製指向的資料,而不是指標,稱為深度賦值。複製的另一種形式只是複製指標值,僅淺淺地複製指標資訊,稱為淺複製。3.將已有的物件賦給另乙個物件時,將使...

Objective C學習筆記第十二章類別

第十二章類別 利用objective c的動態執行時分配機制,可以為現有的類新增新方法,這種為現有的類新增新方法的方式稱為類別catagory,他可以為任何類新增新的方法,包括那些沒有源 的類 類別使得無需建立物件類的子類就能完成同樣的工作 一 建立類別 1 宣告類別 宣告類別與宣告類的形式很相似 ...