學習筆記10

2022-09-07 13:06:12 字數 1749 閱讀 3487

2.塊裝置i/o棧

2.1基本概念

介紹塊裝置的i/o棧之前,我們先來了解一下塊i/o棧的幾個基本概念。

1)bio:bio是通用塊層i/o請求的資料結構,表示上層提交的i/o請求,乙個bio包含多個page,這些page必須對應磁碟上一段連續的空間。由於檔案在磁碟上並不連續存放,檔案i/o提交到塊裝置之前,極有可能被拆成多個bio結構;

2)request:表示塊裝置驅動層i/o請求,經由i/o排程層轉換後的i/o請求,將會發到塊裝置驅動層進行處理;

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

這3個結構的關係如下圖示:乙個request_queue中包含多個request,每個request可能包含多個bio,請求的合併就是根據各種原則將多個bio加入到同乙個requesst中。

一、緩衝區的概念和作用

緩衝區是乙個儲存區域,可以由專門的硬體暫存器組成,也可利用記憶體作為緩衝區。

使用硬體作為緩衝區的成本較高,容量也較小,一般僅用在對速度要求非常高的場合(如儲存器管理中所用的相聯暫存器,由於對頁表的訪問頻率極高,因此使用速度很快的相聯暫存器來存放頁表項的副本)

一般情況下,更多的是利用記憶體作為緩衝區,「裝置獨立性軟體」的緩衝區管理就是要組織管理好這些緩衝區

緩衝區的作用如下:

1.實現選單顯示及相應處理

顯示選單實現函式:

void show_menu()

main函式:

int main(void)

}

return 0;

}

如上程式若鍵入數字可以正確執行,但是鍵入非數字的字元,程式便陷入迴圈列印中。

scanf()和getchar()函式都是從標準輸入中去獲取資料,前者獲取成功返回獲取到的資料個數,失敗返回0;後者獲取乙個字元,獲取成功返回該字元,失敗返回-1。程式之所以會陷入迴圈列印中,是因為標準輸入緩衝區的緣故:scanf函式會先從輸入快取區獲取資料,假設輸入快取區資料為空就會去終端陷入阻塞獲取,反之就去讀快取區上的資料。在這它要獲取的是int型的資料,假設程式使用者鍵入的是非數字的字元,那麼scanf獲取資料失敗,快取區上的非數字資料會一直遺留(若是數字資料會被讀取,快取區就不存在該資料),程式會往下執行。下次呼叫scanf時候,同理會先去判斷緩衝區上的資料,緩衝區有資料,所以不會使得終端阻塞等待輸入,但該資料又不是int型資料,依次獲取失敗,程式又會接下往下執行…因此便陷入迴圈了。解決辦法就是不管scanf()函式獲取成功與否,都把輸入快取區的資料清空。

在linux啟動時候會啟動bash程序,該程序會預設開啟著3個裝置檔案。由於linux上最小的檔案描述符是從0開始,且開啟檔案時 返回最小可用檔案描述符,所以它們的檔案描述符分別為0、1、2。

既然知道了檔案的描述符,那麼自然可以呼叫系統呼叫open、write來讀寫檔案了:

int main(void)

; //往標準輸出緩衝區寫入資料

write(1, "hello\n", 6); //在終端列印"hello\n"

//讀取標準輸入快取區的資料

ret = read(0, buf, 1024); //阻塞獲取終端輸入

for (i = 0; i < 1024; i++)

printf("%c", buf[i]);

return 0;

}

**練習.cpp

學習筆記10

類與物件 物件 屬性 方法 用class定義python類,然後接類的名稱和冒號。python的self相當於c 的this指標。self是類中乙個額外的第乙個引數名稱 在呼叫方法時 無需明確提供與引數self相對應的引數。魔法方法 init self param1,param2 這個方法在類例項化...

python numpy 學習筆記 10

1.矩陣的相關操作 求逆,求解線性方程組,求解特徵值,求解特徵向量,奇異值分解 coding utf 8 from numpy import a mat 0 1 2 1 0 3 4 3 8 inverse linalg.inv a print inverse print a.i print a in...

linux學習筆記10

find搜尋命令 which 查詢可執行檔案的絕對路徑。它只是用來查詢path環境變數中出現的路徑下的可執行檔案,比如我們不知道某個命令的絕對路徑which一下就知道了。whereis b 只找binary檔案 m 只找在說明檔案manual路徑下的檔案。u 沒有說明檔的檔案。find搜尋檔案 fi...