塊裝置之三

2021-06-20 13:56:37 字數 2852 閱讀 8777

在將請求提交給塊裝置時,核心提供了各種排程策略,這些排程器用於重排和排程i/o請求以獲得最優的效能。i/o排程器在核心中被稱為elevator。核心使用了如下資料結構來實現和管理i/o排程器:

struct elevator_type

;

i/o排程器的操作函式集定義如下:

struct elevator_ops

;

在初始化請求佇列時,核心會用elevator_init來初始化排程器及其關聯的排程佇列。隨後該

核心實現了四種i/o排程器,分別為:

該排程器是預設的排程器。該排程器圍繞排程佇列進行,核心使用乙個輪轉演算法來處理各個佇列,這確保了i/o頻寬以公平的方式在各個佇列之間進行分配。

該排程器適用於兩個目地:

盡可能保證請求在一定的時間內完成:如果要用於該目地,就要使用定時機制保證請求的到期時間

該排程器就是乙個fifo形式的排程器。請求被以先來先服務的形式入隊。請求可以合併但是無法重排。

它會對應用程式的讀寫進行**以獲得最優性能。它假設應用程式的讀寫請求不是孤立的,簡單的說如果應用程式提交了乙個讀請求,則它認為下乙個請求也是讀,從而進行優化(當然這只是乙個簡單的說明,實際的**要複雜的多)。

如果要修改系統預設的排程器,可以通過設定啟動引數elevator=排程器名字來修改。如果只是要臨時修改某個裝置的排程器,可以通過sys檔案系統下該裝置目錄中的queue目錄中的

scheduler檔案來實現,把自己希望使用的排程器的名字寫入該檔案即可。比如:

root@rover-optiplex-780:/sys/block/sda/queue# cat scheduler 

noop [deadline] cfq 

root@rover-optiplex-780:/sys/block/sda/queue# echo cfq >  /sys/block/sda/queue/scheduler

root@rover-optiplex-780:/sys/block/sda/queue# cat /sys/block/sda/queue/scheduler

noop deadline [cfq] 

請求佇列的管理對於塊層是很重要的,其中涉及到很多管理請求佇列的api。做一下簡單的總結。

struct request_queue *blk_init_queue(request_fn_proc *rfn, spinlock_t *lock)

void blk_cleanup_queue(struct request_queue *q)

這兩個api分別用來建立和刪除請求佇列

struct request *blk_fetch_request(struct request_queue *q);
用於獲取請求

void blk_complete_request(struct request *);
用於在處理完乙個請求時呼叫。

void blk_abort_request(struct request *);
取消乙個請求

void blk_requeue_request(struct request_queue *, struct request *);
重新將乙個請求新增到請求佇列中

void blk_start_queue(struct request_queue *q);

void blk_stop_queue(struct request_queue *q);

void blk_run_queue(struct request_queue *);

這三個api分別用於啟動請求佇列,停止請求佇列,執行乙個請求佇列。

void blk_queue_segment_boundary(struct request_queue *q, unsigned long mask);

如果乙個裝置無法處理跨越某個邊界的段,就用該函式設定其邊界,mask是個邊界掩碼,比如0xffffffff表示無法跨越4m邊界。

在linux中一切皆檔案,linux將所有裝置也都當做乙個檔案來處理。這裡簡單梳理下二者的關係

linux檔案系統使用索引節點來記錄檔案資訊,索引節點是乙個資料結構,它包含了乙個檔案的檔名,位置,大小,建立或修改時間,訪問許可權,所屬關係等檔案控制資訊,乙個檔案系統維護了乙個索引節點的陣列,每個檔案或目錄都與索引結點陣列中的唯一乙個元素對應,系統為每個索引結點分配了乙個號碼,也就是該結點在陣列中的索引號,稱為索引結點號。

linux檔案系統將檔案索引結點號和檔名同時儲存在目錄中,所以目錄只是將檔案的名稱和它的索引結點號結合在一起的一張表。

在linux中磁碟塊由四個部分組成,分別為引導塊 、專用塊 、 i節點表塊 和資料儲存塊。

linux系統中的每個檔案都被賦予乙個唯一的數值,這個數值稱做索引節點。索引節點儲存在乙個稱作索引節點表< inode table>中,該錶在磁碟格式化時被分配。每個實際的磁碟或分割槽都有其自己的索引節點表。乙個索引節點包含檔案的所有資訊,包括磁碟上資料的位址和檔案型別。檔案型別包括如普通檔案、目錄和特殊檔案這樣的資訊。

linux硬碟組織方式為:引導區、超級塊(superblock),索引結點(inode),資料塊(datablock),目錄塊(diredtory block)。其中超級塊中包含了關於該硬碟或分割槽上的檔案系統的整體資訊,如檔案系統的大小等;超級塊後面的資料結構是索引結點,它包含了針對某乙個具體檔案的幾乎全部資訊,如檔案的訪問許可權、所有者、大小、建立時間以及對應的目錄塊和資料塊等;資料塊是真正儲存檔案內容的位置。但是索引結點中不包括檔案的名字,檔名是放在目錄塊裡的。目錄塊裡包含有檔案的名字以及此檔案的索引結點編號。

Linux塊裝置驅動(三)程式設計

本節我們利用前兩節所總結的內容設計乙個簡單的塊裝置驅動程式,分配一塊記憶體作為磁碟實現塊裝置的功能。首先是一些巨集定義和全域性變數 define ramdisk size 1024 1024 define sector size 512 static int major struct ramdisk...

塊裝置簡介

裝置分為塊裝置和字元裝置 ll rw blk.c是其他程式呼叫裝置所用到的程式。對硬碟和軟盤裝置上資料的讀寫是通過中斷處理程式進行 核心每次讀寫的資料量是邏輯塊 1024位元組 而裝置的儲存是扇區 512位元組 當程式讀取裝置資料時,首先向緩衝區管理程式提出申請,程式的程序進入睡眠狀態,緩衝區管理程...

塊裝置驅動

若塊裝置驅動程式也按以下字元裝置驅動程式的簡單思想來寫 1.硬碟 磁碟的讀寫其實非常快,慢在機械結構讀寫裝置的定位上面,從乙個 磁頭 的某 柱面 某 扇區 讀到資料後 步驟 r0 跳到另乙個 磁頭 的某 柱面 的某 扇區 去寫 步驟 w 接著再跳回原 磁頭 相同柱面的下乙個 扇區 去讀 步驟r1 慢...