1. 程式人生 > >【什麼時候用多執行緒——IO篇】io多執行緒真的會降低磁碟效能麼?

【什麼時候用多執行緒——IO篇】io多執行緒真的會降低磁碟效能麼?

什麼叫做IO?

  • IO是在主存與外部裝置(磁碟驅動器、終端和網路)之間的資料拷貝的過程
  • 站在主存的角度去看,I表示輸入到主存;O從主存輸出。

什麼叫做IO密集型?

  • 就是IO很多唄。比如大量的“資料寫入磁碟,資料上傳到遠端伺服器,從磁碟讀取檔案”等操作。

2.磁碟IO

  • 指標(外設拖了主存的後腿)
磁碟 耗時
Main memory reference 100ns
Disk seek 8~10ms
Read 1MB sequentially from disk 20~25ms
機械磁碟吞吐量 120MB

3. 從cpu下發指令到IO整個流程(計算某一個檔案的行數)

<b>3.1 程式可能是這樣寫的</b>

  1. open()
  2. read() #讀取x位元組,返回0表示讀完或-1表示出錯,則退出。
  3. 判斷是否包含'\n','\r','\r\n',如果是則count++; 否則回到2繼續讀 取。

<b>3.2 面對上面的程式,機器部件都怎麼運作的呢?</b>

 

Paste_Image.png

 

磁碟IO棧

 

注:

  • VFS: 對ext3/ext4/ZFS檔案系統的虛擬介面(一層抽象,不管你底層是什麼檔案系統,對於上層來說都是統一的介面)
  • 卷管理器:檔案系統可以建立在多塊磁碟上。卷把多塊磁碟組合成一個虛擬磁碟(一層抽象)
  • 塊裝置介面:通用的塊層介面(一層抽象,磁碟、usb、CD-ROM都是塊裝置,對於上層來說都是統一的介面)
  • IO驅動:向裝置發出命令、讀出裝置的狀態。每一個連線到計算機上的IO裝置都需要特定的程式碼來對其進行控制。這樣的程式碼叫做裝置驅動程式。每一個作業系統都有自己的驅動程式,屬於核心一部分。如果每一次出現一個新的裝置,都必須為新裝置更改作業系統的話,那就完蛋了。所以,作業系統定義的統一的裝置驅動程式介面,不同廠商按照介面來實現即可。
  • 匯流排介面卡驅動(控制器驅動):將IO匯流排連線到控制器。控制傳輸的驅動程式。
  • 磁碟裝置
  • 磁碟控制器:從磁碟中按照序列位流方式讀取資料。在自己內部快取區中組裝成一個位元組塊,校驗資料沒有錯誤後,再將複製到記憶體。(反向同理)
  • 磁碟驅動器:接收IO請求,排隊,尋道,返回IO資料。

大概步驟如下:(CPU只負責發指令,然後幹其他事情——採用程式中斷+IO埠獨立編址。還有其他DMA、記憶體IO對映統一編址方式)

  1. open呼叫,從檔案系統中讀取檔案屬性和磁碟地址表,並裝入記憶體中
  2. 將檔案的地址寫入暫存器
  3. CPU讀到IN/OUT指令。啟動中斷,下發指令到控制器中要讀取該地址的資料,CPU就幹其他事情了。
  4. 磁碟控制器從磁碟驅動器中序列地一位一位讀一個塊,直到整個塊放入控制器內部的快取區。
  5. 磁碟控制器產生一箇中斷。等待CPU響應中斷繼續服務。
  6. 中斷控制器看匯流排情況是否繁忙,以及中斷優先順序,來做中斷標誌位。
  7. CPU看到中斷標誌位資訊OK,就下發指令拷貝到記憶體中。
  8. 磁碟控制器將資料傳達記憶體。