關於I O模型的一些理解

2021-09-09 07:45:58 字數 1755 閱讀 2235

參照的文章:

i/o模型

在開始nio的學習之前,先對i/o的模型有乙個理解,這對nio的學習是絕對有好處的。我畫一張圖,簡單表示一下資料從外部磁碟向執行中程序的記憶體區域移動的過程:

這張明顯忽略了很多細節,只涉及了基本操作,下面分析一下這張圖。

使用者空間和核心空間

乙個計算機通常有一定大小的記憶體空間,如一台計算機有4gb的位址空間,但是程式並不能完全使用這些位址空間,因為這些位址空間是被劃分為使用者空間和核心空間的。程式只能使用使用者空間的記憶體,這裡所說的使用是指程式能夠申請的記憶體空間,並不是真正訪問的位址空間。下面看下什麼是使用者空間和核心空間:

1、使用者空間

使用者空間是常規程序所在的區域,什麼是常規程序,開啟任務管理器看到的就是常規程序:

jvm就是常規程序,駐守於使用者空間,使用者空間是非特權區域,比如在該區域執行的**不能直接訪問硬體裝置。

2、核心空間

核心空間主要是指作業系統執行時所使用的用於程式排程、虛擬記憶體的使用或者連線硬體資源等的程式邏輯。核心**有特別的權利,比如它能與裝置控制器通訊,控制著整個用於區域程序的執行狀態。和i/o相關的一點是:所有i/o都直接或間接通過核心空間

那麼,為什麼要劃分使用者空間和核心空間呢?這也是為了保證作業系統的穩定性和安全性。使用者程式不可以直接訪問硬體資源,如果使用者程式需要訪問硬體資源,必須呼叫作業系統提供的介面,這個呼叫介面的過程也就是系統呼叫。每一次系統呼叫都會存在兩個記憶體空間之間的相互切換,通常的網路傳輸也是一次系統呼叫,通過網路傳輸的資料先是從核心空間接收到遠端主機的資料,然後再從核心空間複製到使用者空間,供使用者程式使用。這種從核心空間到使用者控制項的資料複製很費時,雖然保住了程式執行的安全性和穩定性,但是犧牲了一部分的效率。

最後,如何分配使用者空間和核心空間的比例也是乙個問題,是更多地分配給使用者空間供使用者程式使用,還是首先保住核心有足夠的空間來執行,還是要平衡一下。在當前的windows 32位作業系統中,預設使用者空間:核心空間的比例是1:1,而在32位linux系統中的預設比例是3:1(3gb使用者空間、1gb核心空間)。

程序執行i/o操作的步驟

緩衝區,以及緩衝區如何工作,是所有i/o的基礎。所謂"輸入/輸出"講的無非也就是把資料移入或移出緩衝區。

程序執行i/o操作,歸結起來,就是向作業系統發出請求,讓它要麼把緩衝區裡的資料排乾淨(寫),要麼用資料把緩衝區填滿(讀)。程序利用這一機制處理所有資料進出操作,作業系統內部處理這一任務的機制,其複雜程度可能超乎想像,但就概念而言,卻非常直白易懂,從上面的圖,可以總結一下程序執行i/o操作的幾步:

1、程序使用底層函式read(),建立和執行適當的系統呼叫,要求其緩衝區被填滿,此時控制權移交給核心

2、核心隨即向磁碟控制硬體發出命令,要求其從磁碟讀取資料

4、一盤磁碟控制器把緩衝區填滿,核心隨即把資料從核心空間的臨時緩衝區拷貝到程序執行read()呼叫時指定的緩衝區

5、程序從使用者空間的緩衝區中拿到資料

當然,如果核心空間裡已經有資料了,那麼該資料只需要簡單地拷貝出來即可。至於為什麼不能直接讓磁碟控制器把資料送到使用者空間的緩衝區呢?最簡單的乙個理由就是,硬體通常不能直接訪問使用者空間。

關於熵的一些理解

對於理工科學生來說,熵 並不是乙個陌生的名詞。在諸如 大學物理 熱力學 和 資訊理論 等課程中都會有所介紹。但同時 熵 又是乙個顯得有點神秘的概念,看不見也摸不著。我最早是在高中物理課中聽說的,大概是在介紹 熱力學第二定律 時提到的。熱力學第二定律的內容是 熱力學過程是不可逆的 孤立系統自發地朝著熱...

關於float的一些理解

float是否脫離文件流,乙個父元素不設定overflow的話,子元素float,就不會把父元素撐開,換句話說,他就不會有高度,但是做個demo 父元素overflow hidden 子元素前兩個float,第三個不float,結果是第三個沒有clear浮動的元素,跟float的元素出現在同乙個位置...

關於android layout的一些理解

1 wrap content view的尺寸根據它的內容確定 match parent view的尺寸盡量和它的parent view group一樣大 2 獲得view的位置 position getleft gettop getright getleft getwidth getwidth 3 ...