緩沖區(qū)操作
?? ?進程執(zhí)行I/O操作辅愿,歸結(jié)起來竿报,也就是向操作系統(tǒng)發(fā)出請求,讓它要么把緩沖區(qū)里的數(shù)據(jù)排干(寫)溉委,要么用數(shù)據(jù)把緩沖區(qū)填滿(讀)鹃唯。進程使用這一機制處理所有數(shù)據(jù)進出操作。
進程使用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ū)拷貝到進程執(zhí)行read()調(diào)用時指定的緩沖區(qū)。
用戶空間:常規(guī)進程所在區(qū)域岖寞。JVM就是常規(guī)進程抡四,駐守于用戶空間。用戶空間是非特權區(qū)域仗谆。
內(nèi)核空間:操作系統(tǒng)所在區(qū)域指巡。內(nèi)核代碼有特別的權力:它能與設備控制器通訊,控制著用戶區(qū)域進程的運行狀態(tài)隶垮,等等藻雪。最重要的是,所有I/O都直接或間接通過內(nèi)核空間狸吞。
當進程請求I/O操作的時候勉耀,它執(zhí)行一個系統(tǒng)調(diào)用將控制權交給內(nèi)核。當內(nèi)核以這種方式被調(diào)用時蹋偏,它隨即采取任何必要步驟便斥,找到進程所需數(shù)據(jù),并把數(shù)據(jù)傳送到用戶空間的指定緩沖區(qū)威始。內(nèi)核試圖對數(shù)據(jù)進行高速緩存或預讀取枢纠,因此進程所需數(shù)據(jù)可能已經(jīng)在內(nèi)核空間里了。如果是這樣黎棠,該數(shù)據(jù)只要簡單的拷貝出來即可晋渺。如果數(shù)據(jù)不再內(nèi)存空間,則進程被掛起脓斩,內(nèi)核著手把數(shù)據(jù)讀進內(nèi)存木西。
為什么不直接讓磁盤控制器把數(shù)據(jù)送到用戶空間的緩沖區(qū)?
1.硬件通常不能直接訪問用戶空間
2.磁盤基于塊存儲操作的是固定大小的數(shù)據(jù)塊随静,而用戶進程請求的可能是任意大小的或非對齊的數(shù)據(jù)塊户魏。在數(shù)據(jù)往來于用戶空間與存儲設備的過程中,內(nèi)核負責數(shù)據(jù)的分解挪挤、再組合工作叼丑,充當著中間人的角色。
發(fā)散/匯聚
根據(jù)發(fā)散/匯聚的概念扛门,進程只需一個系統(tǒng)調(diào)用鸠信,就能把一連串緩沖區(qū)地址傳遞給操作系統(tǒng)。然后內(nèi)核就可以順序填充或排干多個緩沖區(qū)论寨,讀的時候就把數(shù)據(jù)發(fā)散到多個用戶空間緩沖區(qū)星立,寫的時候再從多個緩沖區(qū)把數(shù)據(jù)匯聚起來。
這樣用戶進程就不必多次執(zhí)行系統(tǒng)調(diào)用葬凳,內(nèi)核也可以優(yōu)化數(shù)據(jù)的處理過程绰垂,因為它已掌握待傳輸數(shù)據(jù)的全部信息。如果系統(tǒng)配有多個CPU火焰,甚至可以同時填充或排干多個緩沖區(qū)劲装。
虛擬內(nèi)存
? ? 使用虛擬地址取代物理內(nèi)存地址。
? ? 好處:
? ? ? ? 1.一個以上的虛擬地址可指向同一個物理內(nèi)存地址昌简。
? ? ? ? 2.虛擬內(nèi)存空間可大于實際可用的硬件內(nèi)存占业。
把內(nèi)核空間地址與用戶空間的虛擬地址映射到同一物理地址,這樣纯赎,DMA硬件(只能訪問物理內(nèi)存地址)就可以填充對內(nèi)核與用戶空間進程同時可見的緩沖區(qū)谦疾。
省去了內(nèi)核與用戶空間的往來拷貝已维。
前提條件:內(nèi)核與用戶緩沖區(qū)必須使用相同的頁對齊帚豪,緩沖區(qū)的大小還必須是磁盤控制器塊大小的倍數(shù)
上圖顯示了多個虛擬地址的虛擬內(nèi)存頁是如何映射到物理內(nèi)存的拷泽。
內(nèi)存頁面調(diào)度
為了支持虛擬內(nèi)存尋址空間大于物理內(nèi)存的特性趴俘,就必須進行內(nèi)存分頁哥纫。虛擬內(nèi)存空間的頁面能夠繼續(xù)存在于外部磁盤存儲硼一,這樣就為物理內(nèi)存中的其它虛擬頁面騰出了空間波桩。從本質(zhì)上來說鹅巍,物理內(nèi)存充當了分頁區(qū)的高速緩存音同,而所謂的分頁區(qū)词爬,即從物理內(nèi)存置換出來,轉(zhuǎn)而存儲于磁盤上的內(nèi)存頁面权均。
上圖顯示了分屬于四個進程的虛擬頁面顿膨,其中每個進程都有屬于自己的虛擬內(nèi)存空間,進程A有五個頁面叽赊,其中兩個裝入內(nèi)存恋沃,其余存儲于磁盤。
現(xiàn)代CPU包含一個稱為內(nèi)存管理單元(MMU)的子系統(tǒng)必指,該設備包含虛擬地址向物理內(nèi)存地址轉(zhuǎn)換時所需映射信息囊咏。當CPU引用某內(nèi)存地址時,MMU負責確定該地址所在頁,并將虛擬頁號轉(zhuǎn)換為物理頁號(這一步由硬件完成梅割,速度極快)霜第。如果當前不存在與虛擬頁形成有效映射的物理內(nèi)存頁,MMU會向CPU提交一個頁錯誤户辞。然后把控制權交給內(nèi)核泌类,由內(nèi)核主導從磁盤上將該頁讀入物理內(nèi)存,更新MMU底燎。
文件I/O
文件I/O屬文件系統(tǒng)范疇刃榨,文件系統(tǒng)與磁盤迥然不同。磁盤屬于存儲的硬件設備双仍,文件系統(tǒng)是更高層次的抽象枢希,是安排、解釋磁盤數(shù)據(jù)的一種獨特方式朱沃。
文件系統(tǒng)把一連串大小一致的數(shù)據(jù)塊組織到一起苞轿。當用戶進程請求讀取文件數(shù)據(jù)時,文件系統(tǒng)需要確定數(shù)據(jù)具體在磁盤什么位置为流,然后著手把相關磁盤扇區(qū)讀進內(nèi)存呕屎。
操作系統(tǒng)還有頁的概念,其大小或者與基本內(nèi)存頁一致敬察,或者是其倍數(shù)秀睛。典型的操作系統(tǒng)頁從2048到8192字節(jié)不等,且始終是基本內(nèi)存頁大小的倍數(shù)莲祸。
采用分頁技術的操作系統(tǒng)執(zhí)行I/O的全過程可總結(jié)為以下幾步:
1.確定請求的數(shù)據(jù)分布在文件系統(tǒng)的哪些頁蹂安。
2.在內(nèi)核空間分配足夠數(shù)量的內(nèi)存頁,以容納得到確定的文件系統(tǒng)頁锐帜。
3.在內(nèi)存頁與磁盤上的文件系統(tǒng)頁之間建立映射田盈。
4.為每一個內(nèi)存頁產(chǎn)生錯誤。
5.虛擬內(nèi)存系統(tǒng)俘獲頁錯誤缴阎,安排頁面調(diào)入允瞧,從磁盤上讀取頁內(nèi)容,使頁有效蛮拔。
6.一旦頁面調(diào)入操作完成述暂,文件系統(tǒng)即對原始數(shù)據(jù)進行解析,取得所需文件內(nèi)容或?qū)傩孕畔ⅰ?/p>
內(nèi)存映射文件
內(nèi)存映射I/O使用文件系統(tǒng)建立從用戶空間直到可用文件系統(tǒng)頁的虛擬內(nèi)存映射建炫。好處如下:
1.用戶進程把文件數(shù)據(jù)當成內(nèi)存畦韭,所以無需發(fā)布read()或write()系統(tǒng)調(diào)用。
2.當用戶進程碰觸到映射內(nèi)存空間肛跌,頁錯誤會自動產(chǎn)生從而將文件數(shù)據(jù)從磁盤讀進內(nèi)存艺配。如果用戶修改了內(nèi)存映射空間察郁,相關頁會自動標記為臟隨后刷新到磁盤,文件得到更新转唉。
3.操作系統(tǒng)的虛擬內(nèi)存子系統(tǒng)會對頁進行智能高速緩存皮钠,自動根據(jù)系統(tǒng)負載進行內(nèi)存管理。
4.數(shù)據(jù)總是按頁對齊酝掩,無需執(zhí)行緩沖區(qū)拷貝鳞芙。
5.大型文件使用映射,無需耗費大量內(nèi)存即可進行數(shù)據(jù)拷貝期虾。
流I/O
流的傳輸一般比塊設備慢,經(jīng)常用于間歇性輸入驯嘱。多數(shù)操作系統(tǒng)允許把流置于非塊模式镶苞,這樣,進程可以查看流上是否有輸入鞠评,即便當時沒有也不影響它干別的茂蚓。這樣一種能力使得進程可以在有輸入的時候進行處理,輸入閑置的時候執(zhí)行其他功能剃幌。聋涨。