為了能更好理解程式中io的操作,我們首先需要了解一下計算機中關於io的知識。在這篇文章中重點掌握三個知識點:
現代計算機是由硬體、作業系統組成,作業系統通過核心與硬體互動。作業系統可以劃分為:核心與應用兩部分,核心提供程序管理、記憶體管理、網路等底層功能,封裝了與硬體互動的介面,通過系統呼叫提供給上層應用使用。
由於cpu某些指令比較危險,如果錯用會導致系統崩潰,為了保護系統,作業系統將記憶體空間劃分為了兩部分:
當程序執行在核心空間時,它就處於核心態;當程序執行在使用者空間時,它就處於使用者態。
當我們需要進行io操作時,如讀寫硬碟檔案、讀寫網絡卡資料等,程序需要切換到核心態,否則無法進行這樣的操作,無論是從核心態切換到使用者態,還是從使用者態切換到核心態,都需要進行一次上下文的切換。一般情況下,應用不能直接操作核心空間的資料,需要把核心態的資料拷貝到使用者空間才能操作。
假如有乙個網路請求想訪問伺服器上的某個靜態檔案,我們來看一下在這個示例中伺服器的具體io流程。
整個過程如下:
程序發起乙個系統呼叫sys_read,讀取磁碟的檔案;
dma將磁碟檔案資料拷貝到核心空間的read緩衝區;
cpu把核心空間read緩衝區資料拷貝到使用者空間的緩衝區;
程序發起乙個系統呼叫socket_write,向網絡卡寫資料;
cpu把使用者空間緩衝區的資料拷貝到核心空間的socket緩衝區;
最後dma把核心空間的socket緩衝區資料拷貝到網絡卡;
可以看到,在整個過程中進行了四次的資料拷貝,而且也進行了四次的上下文切換。這種io操作的效率是比較低的,因為進行了多次資料拷貝,如果希望提高io效率,可以減少其中的資料拷貝,後面講到的零拷貝技術就是為了減少io操作過程中的資料拷貝次數。
ps:dma即直接儲存器訪問,可以看作cpu的乙個輔助硬體訪問的晶元,在進行記憶體與io裝置資料傳輸時,不需要cpu來控制,直接通過dma進行。
核心空間與使用者空間
1.核心態與使用者態的區別 1 核心態 的 不受任何限制,可以訪問 所有處理器指令集 記憶體位址以及i o空間 2 使用者態的 只能訪問其位址空間的頁表項中規定的虛擬位址。2.使用者態到核心態的切換方式 1 系統呼叫 軟中斷的一種 由使用者程序主動發起 2 異常 當cpu在執行執行在使用者態下的程式...
核心空間與使用者空間
首先,這個概念的由來,我認為跟cpu的發展有很大關係,在目前cpu的保護模式下,系統需要對其賴以執行的資料進行保護,為了保證作業系統核心資料,我們把記憶體空間進行劃分,一部分為作業系統核心執行的空間,另一部分是應用程式執行的空間,所謂空間就是記憶體的位址。因此核心空間和使用者空間的概念就出現了。在3...
核心空間與使用者空間
關於虛擬記憶體有三點需要注意 上圖展示了整個程序位址空間的分布,其中4g的位址空間分為兩部分,在使用者空間內,對應了記憶體分布的五個段 資料段 段 bss段 堆 棧。在上篇文章中有詳細的介紹。這個圖示核心使用者空間的劃分,圖中最重要的就是高階記憶體的對映 其中kmalloc和vmalloc函式申請的...