I O 基礎之緩衝區

2021-07-09 09:25:16 字數 2851 閱讀 1336

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

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

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

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

使用者空間與核心空間

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

當程序請求i/o操作的時候,它執行乙個系統呼叫將控制權移交給核心。核心隨即採取必要步驟,找到程序所需資料,並把資料傳送到使用者空間內指定的緩衝區。如果資料已在核心空間,直接拷貝即可;如果不在核心空間,則程序被掛起,核心著手把資料讀進記憶體。

發散、匯聚

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

虛擬記憶體意為使用虛假(或虛擬)位址取代物理(硬體ram)記憶體位址,好處有兩大類:

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

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

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

記憶體頁:

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

現代cpu包含乙個記憶體管理單元(mmu)的子系統,邏輯上位於 cpu與物理記憶體之間。該裝置包含了虛擬位址向物理記憶體位址轉換時所需對映資訊。當cpu引用某記憶體位址時,mmu負責確定該位址所在頁(通常通過對位址進行移位和遮蔽位操作來實現),並將虛擬頁號轉換為物理頁號(由硬體完成,速度極快)。如果當前不存在與該虛擬頁形成有效對映的物理記憶體頁,mmu向cpu提交乙個頁錯誤。

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

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

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

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

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

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

類似的步驟在寫檔案資料時也會採用。這時,檔案內容的改變(通過write( ))將導致檔案系統頁變髒,隨後通過頁面調出,與磁碟上的檔案內容保持同步。檔案的建立方式是,先把檔案對映到空閒檔案系統頁,在隨後的寫操作中,再將檔案系統頁重新整理到磁碟。

記憶體對映檔案

記憶體對映 i/o 使用檔案系統建立從使用者空間直到可用檔案系統頁的虛擬記憶體對映。好處有:

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

檔案鎖定

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

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

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

流i/o模仿了通道,必須順序訪問。

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

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

10029 I O 基礎之緩衝區

原文 緩衝區以及緩衝區是如何工作,是所有i o的基礎。輸入 輸出 就是把資料移進或移出緩衝區。程序執行i o操作,就是向作業系統發出請求,讓它要麼把緩衝區的資料排乾 寫 要麼用資料把緩衝區填滿 讀 程序使用這一機制處理所有資料進出操作。從磁碟讀資料到程序記憶體區 程序使用read 系統呼叫,要求其緩...

後台開發之IO緩衝區管理

linux系統io中write原型為 ssize t write int filedes,const void buff,size t nbytes 當呼叫write寫資料的時候,呼叫完成後write直接返回,但是磁碟是個慢速裝置,作業系統會將資料儲存在核心中的緩衝區中,並負責非同步地將資料寫至磁碟...

後台開發之IO緩衝區管理

linux系統io中write原型為 ssize t write int filedes,const void buff,size t nbytes 當呼叫write寫資料的時候,呼叫完成後write直接返回,但是磁碟是個慢速裝置,作業系統會將資料儲存在核心中的緩衝區中,並負責非同步地將資料寫至磁碟...