Java NIO學習筆記之基本概念

2021-09-07 20:44:03 字數 1931 閱讀 3543

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

程序使用 read( )系統呼叫,要求其緩衝區被填滿。核心隨即向磁碟控制硬體發出命令,要求其從磁碟讀取資料。磁碟控制器把資料直接寫入核心記憶體緩衝區,這一步通過 dma 完成,無需主 cpu 協助。一旦磁碟控制器把緩衝區裝滿,核心即把資料從核心空間的臨時緩衝區拷貝到程序執行 read( )呼叫時指定的緩衝區。

圖 1-1. i/o 緩衝區操作簡圖

為什麼不直接讓磁碟控制器把資料送到使用者空間的緩衝區呢?這樣做有幾個問題。首先,硬體通常不能直接訪問使用者空間。其次,像磁碟這樣基於塊儲存的硬體裝置操作的是固定大小的資料塊,而使用者程序請求的可能是任意大小的或非對齊的資料塊。在資料往來於使用者空間與儲存裝置的過程中,核心負責資料的分解、再組合工作,因此充當著中間人的角色。

虛擬記憶體意為使用虛假(或虛擬)位址取代物理(硬體ram)記憶體位址。總結起來可分為兩大類:

1. 乙個以上的虛擬位址可指向同乙個物理記憶體位址。

2. 虛擬記憶體空間可大於實際可用的硬體記憶體。

前一節提到,裝置控制器不能通過 dma 直接儲存到使用者空間,把核心空間位址與使用者空間的虛擬位址對映到同乙個實體地址,這樣,dma 硬體(只能訪問物理記憶體位址)就可以填充對核心與使用者空間程序同時可見的緩衝區(見圖1-3)。

圖 1-3. 記憶體空間多重對映

檔案 i/o 屬檔案系統範疇,檔案系統與磁碟迥然不同。檔案系統是更高層次的抽象,是安排、解釋磁碟(或其他隨機訪問塊裝置)資料的一種獨特方式。所有 i/o 都是通過請求頁面排程完成的。頁面排程是非常底層的操作,僅發生於磁碟扇區與記憶體頁之間的直接傳輸。而檔案 i/o 則可以任意大小、任意定位。

那麼,底層的頁面排程是如何轉換為檔案 i/o 的?檔案系統把一連串大小一致的資料塊組織到一起。有些塊儲存元資訊,如空閒塊、目錄、索引等的對映,有些包含檔案資料。單個檔案的元資訊描述了哪些塊包含檔案資料、資料在**結束、最後一次更新是什麼時候,等等。當使用者程序請求讀取檔案資料時,檔案系統需要確定資料具體在磁碟什麼位置,然後著手把相關磁碟扇區讀進記憶體。採用分頁技術的現代作業系統利用請求頁面排程取得所需資料。

採用分頁技術的作業系統執行 i/o 的全過程可總結為以下幾步:

記憶體對映檔案

傳統的檔案 i/o 是通過使用者程序發布 read( )和 write( )系統呼叫來傳輸資料的。為了在核心空間的檔案系統頁與使用者空間的記憶體區之間移動資料,一次以上的拷貝操作幾乎總是免不了的。這是因為,在檔案系統頁與使用者緩衝區之間往往沒有一一對應關係。但是,還有一種大多數作業系統都支援的特殊型別的 i/o 操作,允許使用者程序最大限度地利用面向頁的系統 i/o 特性,並完全摒棄緩衝區拷貝。這就是記憶體對映 i/o,如圖 1-6 所示。

圖 1-6. 使用者記憶體到檔案系統頁的對映

檔案鎖定機制允許乙個程序阻止其他程序訪問某檔案,或限制其訪問方式。通常的用途是控制共享資訊的更新方式,或用於事務隔離。在控制多個實體並行訪問共同資源方面,檔案鎖定是必不可少的。資料庫等複雜應用嚴重信賴於檔案鎖定。

共享鎖和獨佔鎖的經典應用,是控制最初用於讀取的共享檔案的更新。某個程序要讀取檔案,會先取得該檔案或該檔案部分區域的共享鎖。第二個希望讀取相同檔案區域的程序也會請求共享鎖。兩個程序可以並行讀取,互不影響。但是,假如有第三個程序要更新該檔案,它會請求獨佔鎖。該程序會處於阻滯狀態,直到既有鎖定(共享的、獨佔的)全部解除。一旦給予獨佔鎖,其他共享鎖的讀取程序會處於阻滯狀態,直到獨佔鎖解除。這樣,更新程序可以更改檔案,而其他讀取程序不會因為檔案的更改得到前後不一致的結果。圖 1-7 和圖 1-8 描述了這一過程。

圖 1-7. 共享鎖阻斷獨佔鎖請求

圖 1-8. 獨佔鎖阻斷共享鎖請求

並非所有 i/o 都像前幾節講的是面向塊的,也有流 i/o,其原理模仿了通道。i/o 位元組流必須順序訪問,常見的例子有 tty(控制台)裝置、印表機埠和網路連線。

Java NIO學習筆記之基本概念

緩衝區,以及緩衝區如何工作,是所有 i o 的基礎。所謂 輸入 輸出 講的無非就是把資料移進或移出緩衝區。程序使用 read 系統呼叫,要求其緩衝區被填滿。核心隨即向磁碟控制硬體發出命令,要求其從磁碟讀取資料。磁碟控制器把資料直接寫入核心記憶體緩衝區,這一步通過 dma 完成,無需主 cpu 協助。...

docker學習筆記 一 docker 基本概念

作為一種新興的虛擬化方式,docker 跟傳統的虛擬化方式相比具有眾多的優勢。首先,docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機器方式要快得多。其次,docker 對系統資 源的利用率很高,一台主機上可以同時執行數千個 docker 容器。容器除了執行其中應用外,基本不消耗額外的系統資...

javaNIO學習筆記之緩衝區Buffer

buffer有四個屬性 1 capacit 容量 2 limit 上界 3 position 位置 4 mark 標記 絕對儲存不會影響緩衝區的位置屬性 存和取的方法 public abstract byte get public abstract byte get int index public...