【什麼時候用多執行緒——IO篇】io多執行緒真的會降低磁碟效能麼?
阿新 • • 發佈:2019-01-01
什麼叫做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>
- open()
- read() #讀取x位元組,返回0表示讀完或-1表示出錯,則退出。
- 判斷是否包含'\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對映統一編址方式)
- open呼叫,從檔案系統中讀取檔案屬性和磁碟地址表,並裝入記憶體中
- 將檔案的地址寫入暫存器
- CPU讀到IN/OUT指令。啟動中斷,下發指令到控制器中要讀取該地址的資料,CPU就幹其他事情了。
- 磁碟控制器從磁碟驅動器中序列地一位一位讀一個塊,直到整個塊放入控制器內部的快取區。
- 磁碟控制器產生一箇中斷。等待CPU響應中斷繼續服務。
- 中斷控制器看匯流排情況是否繁忙,以及中斷優先順序,來做中斷標誌位。
- CPU看到中斷標誌位資訊OK,就下發指令拷貝到記憶體中。
- 磁碟控制器將資料傳達記憶體。