天天看點

I/O 基礎之緩沖區I/O 基礎

I/O 基礎

2條回複

緩沖區操作

緩沖區以及緩沖區是如何工作,是所有I/O的基礎。“輸入/輸出”就是把資料移進或移出緩沖區。

程序執行I/O操作,就是向作業系統送出請求,讓它要麼把緩沖區的資料排幹(寫),要麼用資料把緩沖區填滿(讀)。程序使用這一機制處理所有資料進出操作。

從磁盤讀資料到程序記憶體區:

I/O 基礎之緩沖區I/O 基礎

程序使用

read( )

系統調用,要求其緩沖區被填滿。核心随即向磁盤控制硬體發出指令,要求其從磁盤讀取資料。磁盤控制器把資料直接寫入核心記憶體緩沖區,這一步通過DMA完成,無需主CPU 協助。一旦磁盤控制器把緩沖區裝滿,核心即把資料從核心空間的臨時緩沖區拷貝到程序執行

read( )

調用時指定的緩沖區。

使用者空間與核心空間

  • 使用者空間:使用者空間是正常程序所在區域,是非特權區域,比如該區域的代碼不能直接通路硬體裝置。
  • 核心空間:核心空間是作業系統所在區域,有特别的權利:能與裝置控制器通訊,控制使用者區域程序的運作狀态等等。

所有I/O都直接或間接通過核心空間,通過請求頁面排程完成。

當程序請求I/O操作的時候,它執行一個系統調用将控制權移交給核心。核心随即采取必要步驟,找到程序所需資料,并把資料傳送到使用者空間内指定的緩沖區。如果資料已在核心空間,直接拷貝即可;如果不在核心空間,則程序被挂起,核心着手把資料讀進記憶體。

發散、彙聚

根據發散、彙聚的概念,程序隻需一個系統調用,就能把一連串緩沖區位址傳遞給作業系統,然後核心就潰瘍順序填充或排幹多個緩沖區,讀的時候把資料發散到多個使用者空間緩沖區,寫的時候再從多個緩沖區把資料彙聚起來。

I/O 基礎之緩沖區I/O 基礎

虛拟記憶體

虛拟記憶體意為使用虛假(或虛拟)位址取代實體(硬體RAM)記憶體位址,好處有兩大類:

  • 一個以上的虛拟位址可指向同一個實體記憶體位址。
  • 虛拟記憶體空間可大于實際可用的硬體記憶體。

由于裝置控制器不能通過DMA直接存儲到使用者空間,但通過把核心空間位址和使用者空間的虛拟位址映射到同一個實體位址,這樣,DMA硬體(隻能通路實體記憶體位址)就可以填充對核心與使用者空間程序同時可見的緩沖區。

記憶體空間多重映射:

I/O 基礎之緩沖區I/O 基礎

省去了核心與使用者空間的來往拷貝,前提是,核心與使用者緩沖區必須使用相同的頁對齊,緩沖區的大小還必須是磁盤控制器塊大小的倍數。

作業系統把記憶體位址空間劃分為頁,及固定大小的位元組組。記憶體頁的大小總是磁盤塊大小的倍數,通常是2次幂(可簡化尋址操作)。

記憶體頁:

I/O 基礎之緩沖區I/O 基礎

記憶體頁面排程

為了支援虛拟記憶體尋址空間大于實體記憶體,必須進行虛拟記憶體分頁(一般稱為交換,真正的交換是在程序層面完成,非頁面層面)。對于暫時不用的記憶體頁放到外部磁盤存儲,為實體記憶體中的其他虛拟頁騰出空間。本質上,實體記憶體充當了分頁區的高速緩存;分頁區就是從實體記憶體置換出來,存儲在磁盤上的記憶體頁面。

現代CPU包含一個記憶體管理單元(MMU)的子系統,邏輯上位于 CPU與實體記憶體之間。該裝置包含了虛拟位址向實體記憶體位址轉換時所需映射資訊。當CPU引用某記憶體位址時,MMU負責确定該位址所在頁(通常通過對位址進行移位和屏蔽位操作來實作),并将虛拟頁号轉換為實體頁号(由硬體完成,速度極快)。如果目前不存在與該虛拟頁形成有效映射的實體記憶體頁,MMU向CPU送出一個頁錯誤。

頁錯誤随即産生一個陷阱(類似于系統調用),把控制權移交給核心,附帶導緻錯誤的虛拟位址資訊,然後核心采取步驟驗證頁的有效性。核心會安排頁面調入操作,把缺失的頁内容讀回實體記憶體。這往往導緻别的頁被移出實體記憶體,好給新來的頁讓地方。在這種情況下,如果待移出的頁已經被碰過了(自建立或上次頁面調入以來,内容已發生改變),還必須首先執行頁面調出,把頁内容拷貝到磁盤上的分頁區。

如果所要求的位址不是有效的虛拟記憶體位址(不屬于正在執行的程序的任何一個記憶體段),則該頁不能通過驗證,段錯誤随即産生。于是,控制權轉交給核心的另一部分,通常導緻的結果就是程序被強令關閉。

一旦出錯的頁通過了驗證,MMU 随即更新,建立新的虛拟到實體的映射(如有必要,中斷被移出頁的映射),使用者程序得以繼續。造成頁錯誤的使用者程序對此不會有絲毫察覺,一切都在不知不覺中進行。

檔案I/O

檔案系統把一連串大小一緻的資料塊組織到一起。有些塊存儲元資訊,如空閑塊、目錄、索引等的映射,有些包含檔案資料。單個檔案的元資訊描述了哪些塊包含檔案資料、資料在哪裡結束、最後一次更新是什麼時候,等等。

采用分頁技術的作業系統執行I/O的全過程可總結為如下步驟:

  • 确定請求的資料分布在檔案系統的哪些頁(磁盤扇區組)。磁盤上的檔案内容和中繼資料可能跨越多個檔案系統頁,而且這些頁可能也不連續。
  • 在核心空間配置設定足夠數量的記憶體頁,以容納得到确定的檔案系統頁。
  • 在記憶體頁與磁盤上的檔案系統頁之間建立映射。
  • 為每一個記憶體頁産生頁錯誤。
  • 虛拟記憶體系統俘獲頁錯誤,安排頁面調入,從磁盤上讀取頁内容,使頁有效。
  • 一旦頁面調入操作完成,檔案系統即對原始資料進行解析,取得所需檔案内容或屬性資訊。

檔案系統資料也會進行高速緩存,大多數作業系統假設程序會繼續讀取檔案剩餘部分,因而會預讀額外的檔案系統頁。

類似的步驟在寫檔案資料時也會采用。這時,檔案内容的改變(通過write( ))将導緻檔案系統頁變髒,随後通過頁面調出,與磁盤上的檔案内容保持同步。檔案的建立方式是,先把檔案映射到空閑檔案系統頁,在随後的寫操作中,再将檔案系統頁重新整理到磁盤。

記憶體映射檔案

I/O 基礎之緩沖區I/O 基礎

記憶體映射 I/O 使用檔案系統建立從使用者空間直到可用檔案系統頁的虛拟記憶體映射。好處有:

  • 使用者程序把檔案資料當作記憶體,是以無需釋出 read( ) 或write( ) 系統調用。
  • 當使用者程序碰觸到映射記憶體空間,頁錯誤會自動産生,進而将檔案資料從磁盤讀進記憶體。如果使用者修改了映射記憶體空間,相關頁會自動标記為髒,随後重新整理到磁盤,檔案得到更新。
  • 作業系統的虛拟記憶體子系統會對頁進行智能高速緩存,自動根據系統負載進行記憶體管理。
  • 資料總是按頁對齊的,無需執行緩沖區拷貝。
  • 大型檔案使用映射,無需耗費大量記憶體,即可進行資料拷貝。

如果資料緩沖區是按頁對齊的,且大小是内建頁大小的倍數,那麼,對大多數作業系統而言,其處理效率會大幅提升。

檔案鎖定

檔案鎖定機制允許一個程序阻止其他程序存取某檔案,或限制其存取方式。通常的用途是控制共享資訊的更新方式,或用于事務隔離。在控制多個實體并行通路共同資源方面,檔案鎖定是必不可少的。

檔案鎖定可以細緻到單個位元組。鎖定與特定檔案相關,開始于檔案的某個特定位元組位址,包含特定數量的連續位元組。這對于協調多個程序互不影響地通路檔案不同區域,是至關重要的。

檔案鎖定有兩種方式:共享的和獨占的。多個共享鎖可同時對同一檔案區域發生作用;獨占鎖則不同,它要求相關區域不能有其他鎖定在起作用。

流I/O

流I/O模仿了通道,必須順序存取。

非塊模式:多數作業系統允許把流置于非塊模式,這樣,程序可以檢視流上是否有輸入,這使得程序可以在有輸入的時候進行處理,輸入流閑置時執行其他功能。

就緒性選擇:就緒性選擇與非塊模式類似,但是把檢視流是否就緒的任務交給了作業系統。作業系統受命檢視一序列流,并提醒程序哪些流已經就緒。憑借作業系統傳回的就緒資訊,程序就可以使用相同代碼和單一線程,實作多活動流的多路傳輸。

本條目釋出于 2013 年 12 月 23 日。屬于 I/O分類,被貼了 IO 标簽。

文章導航

← JUC 源碼分析 四 wait notify notifyAll 與 條件對象 JUC ArrayBlockingQueue →

《I/O 基礎》上有2條評論

I/O 基礎之緩沖區I/O 基礎

jptiancai 2014 年 1 月 2 日下午 2:34

hi,碼蜂

講解I/O很清晰,從底層出發,有幾個小問題不是很清楚?

1、研究I/O的目的展現在哪裡,展現在項目中?還是隻是為了研究恩。

2、對于I/O這一塊内容,是從本書或者資料上看到?

謝謝。

回複 ↓

I/O 基礎之緩沖區I/O 基礎

coderbee 文章作者 2014 年 1 月 2 日下午 8:10

1、目前隻是研究,做的web項目并不直接應用到。

2、這東西是看《Java NIO》一書的筆記。

回複 ↓