中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
I/O 基礎(chǔ)之緩沖區(qū)
轉(zhuǎn)自:http://m.blog.csdn.net/article/details?id=39078853

緩沖區(qū)操作

  緩沖區(qū)以及緩沖區(qū)是如何工作,是所有I/O的基礎(chǔ)。“輸入/輸出”就是把數(shù)據(jù)移進(jìn)或移出緩沖區(qū)。

  進(jìn)程執(zhí)行I/O操作,就是向操作系統(tǒng)發(fā)出請求,讓它要么把緩沖區(qū)的數(shù)據(jù)排干(寫),要么用數(shù)據(jù)把緩沖區(qū)填滿(讀)。進(jìn)程使用這一機制處理所有數(shù)據(jù)進(jìn)出操作。

  從磁盤讀數(shù)據(jù)到進(jìn)程內(nèi)存區(qū):


  進(jìn)程使用 read( ) 系統(tǒng)調(diào)用,要求其緩沖區(qū)被填滿。內(nèi)核隨即向磁盤控制硬件發(fā)出命令,要求其從磁盤讀取數(shù)據(jù)。磁盤控制器把數(shù)據(jù)直接寫入內(nèi)核內(nèi)存緩沖區(qū),這一步通過DMA完成,無需主CPU 協(xié)助。一旦磁盤控制器把緩沖區(qū)裝滿,內(nèi)核即把數(shù)據(jù)從內(nèi)核空間的臨時緩沖區(qū)拷貝到進(jìn)程執(zhí)行read( ) 調(diào)用時指定的緩沖區(qū)。

  用戶空間與內(nèi)核空間

  用戶空間:用戶空間是常規(guī)進(jìn)程所在區(qū)域,是非特權(quán)區(qū)域,比如該區(qū)域的代碼不能直接訪問硬件設(shè)備。

  內(nèi)核空間:內(nèi)核空間是操作系統(tǒng)所在區(qū)域,有特別的權(quán)利:能與設(shè)備控制器通訊,控制用戶區(qū)域進(jìn)程的運行狀態(tài)等等。

  所有I/O都直接或間接通過內(nèi)核空間,通過請求頁面調(diào)度完成。

  當(dāng)進(jìn)程請求I/O操作的時候,它執(zhí)行一個系統(tǒng)調(diào)用將控制權(quán)移交給內(nèi)核。內(nèi)核隨即采取必要步驟,找到進(jìn)程所需數(shù)據(jù),并把數(shù)據(jù)傳送到用戶空間內(nèi)指定的緩沖區(qū)。如果數(shù)據(jù)已在內(nèi)核空間,直接拷貝即可;如果不在內(nèi)核空間,則進(jìn)程被掛起,內(nèi)核著手把數(shù)據(jù)讀進(jìn)內(nèi)存。

  發(fā)散、匯聚

  根據(jù)發(fā)散、匯聚的概念,進(jìn)程只需一個系統(tǒng)調(diào)用,就能把一連串緩沖區(qū)地址傳遞給操作系統(tǒng),然后內(nèi)核就潰瘍順序填充或排干多個緩沖區(qū),讀的時候把數(shù)據(jù)發(fā)散到多個用戶空間緩沖區(qū),寫的時候再從多個緩沖區(qū)把數(shù)據(jù)匯聚起來。


  虛擬內(nèi)存

  虛擬內(nèi)存意為使用虛假(或虛擬)地址取代物理(硬件RAM)內(nèi)存地址,好處有兩大類:

  一個以上的虛擬地址可指向同一個物理內(nèi)存地址。

  虛擬內(nèi)存空間可大于實際可用的硬件內(nèi)存。

  由于設(shè)備控制器不能通過DMA直接存儲到用戶空間,但通過把內(nèi)核空間地址和用戶空間的虛擬地址映射到同一個物理地址,這樣,DMA硬件(只能訪問物理內(nèi)存地址)就可以填充對內(nèi)核與用戶空間進(jìn)程同時可見的緩沖區(qū)。

  內(nèi)存空間多重映射:


  省去了內(nèi)核與用戶空間的來往拷貝,前提是,內(nèi)核與用戶緩沖區(qū)必須使用相同的頁對齊,緩沖區(qū)的大小還必須是磁盤控制器塊大小的倍數(shù)。

  操作系統(tǒng)把內(nèi)存地址空間劃分為頁,及固定大小的字節(jié)組。內(nèi)存頁的大小總是磁盤塊大小的倍數(shù),通常是2次冪(可簡化尋址操作)。

  內(nèi)存頁:


  內(nèi)存頁面調(diào)度

  為了支持虛擬內(nèi)存尋址空間大于物理內(nèi)存,必須進(jìn)行虛擬內(nèi)存分頁(一般稱為交換,真正的交換是在進(jìn)程層面完成,非頁面層面)。對于暫時不用的內(nèi)存頁放到外部磁盤存儲,為物理內(nèi)存中的其他虛擬頁騰出空間。本質(zhì)上,物理內(nèi)存充當(dāng)了分頁區(qū)的高速緩存;分頁區(qū)就是從物理內(nèi)存置換出來,存儲在磁盤上的內(nèi)存頁面。

  現(xiàn)代CPU包含一個內(nèi)存管理單元(MMU)的子系統(tǒng),邏輯上位于 CPU與物理內(nèi)存之間。該設(shè)備包含了虛擬地址向物理內(nèi)存地址轉(zhuǎn)換時所需映射信息。當(dāng)CPU引用某內(nèi)存地址時,MMU負(fù)責(zé)確定該地址所在頁(通常通過對地址進(jìn)行移位和屏蔽位操作來實現(xiàn)),并將虛擬頁號轉(zhuǎn)換為物理頁號(由硬件完成,速度極快)。如果當(dāng)前不存在與該虛擬頁形成有效映射的物理內(nèi)存頁,MMU向CPU提交一個頁錯誤。

  頁錯誤隨即產(chǎn)生一個陷阱(類似于系統(tǒng)調(diào)用),把控制權(quán)移交給內(nèi)核,附帶導(dǎo)致錯誤的虛擬地址信息,然后內(nèi)核采取步驟驗證頁的有效性。內(nèi)核會安排頁面調(diào)入操作,把缺失的頁內(nèi)容讀回物理內(nèi)存。這往往導(dǎo)致別的頁被移出物理內(nèi)存,好給新來的頁讓地方。在這種情況下,如果待移出的頁已經(jīng)被碰過了(自創(chuàng)建或上次頁面調(diào)入以來,內(nèi)容已發(fā)生改變),還必須首先執(zhí)行頁面調(diào)出,把頁內(nèi)容拷貝到磁盤上的分頁區(qū)。

  如果所要求的地址不是有效的虛擬內(nèi)存地址(不屬于正在執(zhí)行的進(jìn)程的任何一個內(nèi)存段),則該頁不能通過驗證,段錯誤隨即產(chǎn)生。于是,控制權(quán)轉(zhuǎn)交給內(nèi)核的另一部分,通常導(dǎo)致的結(jié)果就是進(jìn)程被強令關(guān)閉。

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

  文件I/O

  文件系統(tǒng)把一連串大小一致的數(shù)據(jù)塊組織到一起。有些塊存儲元信息,如空閑塊、目錄、索引等的映射,有些包含文件數(shù)據(jù)。單個文件的元信息描述了哪些塊包含文件數(shù)據(jù)、數(shù)據(jù)在哪里結(jié)束、最后一次更新是什么時候,等等。

  采用分頁技術(shù)的操作系統(tǒng)執(zhí)行I/O的全過程可總結(jié)為如下步驟:

  確定請求的數(shù)據(jù)分布在文件系統(tǒng)的哪些頁(磁盤扇區(qū)組)。磁盤上的文件內(nèi)容和元數(shù)據(jù)可能跨越多個文件系統(tǒng)頁,而且這些頁可能也不連續(xù)。

  在內(nèi)核空間分配足夠數(shù)量的內(nèi)存頁,以容納得到確定的文件系統(tǒng)頁。

  在內(nèi)存頁與磁盤上的文件系統(tǒng)頁之間建立映射。

  為每一個內(nèi)存頁產(chǎn)生頁錯誤。

  虛擬內(nèi)存系統(tǒng)俘獲頁錯誤,安排頁面調(diào)入,從磁盤上讀取頁內(nèi)容,使頁有效。

  一旦頁面調(diào)入操作完成,文件系統(tǒng)即對原始數(shù)據(jù)進(jìn)行解析,取得所需文件內(nèi)容或?qū)傩孕畔ⅰ?br>
  文件系統(tǒng)數(shù)據(jù)也會進(jìn)行高速緩存,大多數(shù)操作系統(tǒng)假設(shè)進(jìn)程會繼續(xù)讀取文件剩余部分,因而會預(yù)讀額外的文件系統(tǒng)頁。

  類似的步驟在寫文件數(shù)據(jù)時也會采用。這時,文件內(nèi)容的改變(通過write( ))將導(dǎo)致文件系統(tǒng)頁變臟,隨后通過頁面調(diào)出,與磁盤上的文件內(nèi)容保持同步。文件的創(chuàng)建方式是,先把文件映射到空閑文件系統(tǒng)頁,在隨后的寫操作中,再將文件系統(tǒng)頁刷新到磁盤。

  內(nèi)存映射文件


  內(nèi)存映射 I/O 使用文件系統(tǒng)建立從用戶空間直到可用文件系統(tǒng)頁的虛擬內(nèi)存映射。好處有:

  用戶進(jìn)程把文件數(shù)據(jù)當(dāng)作內(nèi)存,所以無需發(fā)布 read( ) 或write( ) 系統(tǒng)調(diào)用。

  當(dāng)用戶進(jìn)程碰觸到映射內(nèi)存空間,頁錯誤會自動產(chǎn)生,從而將文件數(shù)據(jù)從磁盤讀進(jìn)內(nèi)存。如果用戶修改了映射內(nèi)存空間,相關(guān)頁會自動標(biāo)記為臟,隨后刷新到磁盤,文件得到更新。

  操作系統(tǒng)的虛擬內(nèi)存子系統(tǒng)會對頁進(jìn)行智能高速緩存,自動根據(jù)系統(tǒng)負(fù)載進(jìn)行內(nèi)存管理。

  數(shù)據(jù)總是按頁對齊的,無需執(zhí)行緩沖區(qū)拷貝。

  大型文件使用映射,無需耗費大量內(nèi)存,即可進(jìn)行數(shù)據(jù)拷貝。

  如果數(shù)據(jù)緩沖區(qū)是按頁對齊的,且大小是內(nèi)建頁大小的倍數(shù),那么,對大多數(shù)操作系統(tǒng)而言,其處理效率會大幅提升。

  文件鎖定

  文件鎖定機制允許一個進(jìn)程阻止其他進(jìn)程存取某文件,或限制其存取方式。通常的用途是控制共享信息的更新方式,或用于事務(wù)隔離。在控制多個實體并行訪問共同資源方面,文件鎖定是必不可少的。

  文件鎖定可以細(xì)致到單個字節(jié)。鎖定與特定文件相關(guān),開始于文件的某個特定字節(jié)地址,包含特定數(shù)量的連續(xù)字節(jié)。這對于協(xié)調(diào)多個進(jìn)程互不影響地訪問文件不同區(qū)域,是至關(guān)重要的。

  文件鎖定有兩種方式:共享的和獨占的。多個共享鎖可同時對同一文件區(qū)域發(fā)生作用;獨占鎖則不同,它要求相關(guān)區(qū)域不能有其他鎖定在起作用。

  流I/O

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

  非塊模式:多數(shù)操作系統(tǒng)允許把流置于非塊模式,這樣,進(jìn)程可以查看流上是否有輸入,這使得進(jìn)程可以在有輸入的時候進(jìn)行處理,輸入流閑置時執(zhí)行其他功能。

  就緒性選擇:就緒性選擇與非塊模式類似,但是把查看流是否就緒的任務(wù)交給了操作系統(tǒng)。操作系統(tǒng)受命查看一序列流,并提醒進(jìn)程哪些流已經(jīng)就緒。憑借操作系統(tǒng)返回的就緒信息,進(jìn)程就可以使用相同代碼和單一線程,實現(xiàn)多活動流的多路傳輸。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java I/O底層是如何工作的?
mmap()
支撐百萬并發(fā)的“零拷貝”技術(shù),你了解嗎?
從內(nèi)核文件系統(tǒng)看文件讀寫過程
騰訊游戲工程師:LinuxI/O底層原理全面揭秘
【底層原理】網(wǎng)絡(luò)數(shù)據(jù)傳輸時經(jīng)歷了哪些buffer
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服