Java NIO之基礎知識篇

緩沖區(qū)操作

?? ?進程執(zhí)行I/O操作辅愿,歸結(jié)起來竿报,也就是向操作系統(tǒng)發(fā)出請求,讓它要么把緩沖區(qū)里的數(shù)據(jù)排干(寫)溉委,要么用數(shù)據(jù)把緩沖區(qū)填滿(讀)鹃唯。進程使用這一機制處理所有數(shù)據(jù)進出操作。

I/O緩沖區(qū)操作簡圖

進程使用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ù)匯聚起來。

三個緩沖區(qū)的發(fā)散讀操作

這樣用戶進程就不必多次執(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)核與用戶空間的往來拷貝已维。

前提條件:內(nèi)核與用戶緩沖區(qū)必須使用相同的頁對齊帚豪,緩沖區(qū)的大小還必須是磁盤控制器塊大小的倍數(shù)


內(nèi)存頁

上圖顯示了多個虛擬地址的虛擬內(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)存頁面权均。


用于分頁區(qū)高速緩存的物理內(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)存到文件系統(tǒng)頁的映射

內(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í)行其他功能剃幌。聋涨。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市负乡,隨后出現(xiàn)的幾起案子牍白,更是在濱河造成了極大的恐慌,老刑警劉巖抖棘,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茂腥,死亡現(xiàn)場離奇詭異,居然都是意外死亡切省,警方通過查閱死者的電腦和手機最岗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朝捆,“玉大人般渡,你說我怎么就攤上這事≤脚蹋” “怎么了驯用?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長何陆。 經(jīng)常有香客問我晨汹,道長,這世上最難降的妖魔是什么贷盲? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任淘这,我火速辦了婚禮剥扣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘铝穷。我一直安慰自己钠怯,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布曙聂。 她就那樣靜靜地躺著晦炊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宁脊。 梳的紋絲不亂的頭發(fā)上断国,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音榆苞,去河邊找鬼稳衬。 笑死,一個胖子當著我的面吹牛坐漏,可吹牛的內(nèi)容都是我干的薄疚。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼赊琳,長吁一口氣:“原來是場噩夢啊……” “哼街夭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起躏筏,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤板丽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后寸士,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檐什,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年弱卡,在試婚紗的時候發(fā)現(xiàn)自己被綠了乃正。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡婶博,死狀恐怖瓮具,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凡人,我是刑警寧澤名党,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站挠轴,受9級特大地震影響传睹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜岸晦,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一欧啤、第九天 我趴在偏房一處隱蔽的房頂上張望睛藻。 院中可真熱鬧,春花似錦邢隧、人聲如沸店印。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽按摘。三九已至,卻和暖如春纫谅,著一層夾襖步出監(jiān)牢的瞬間炫贤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工系宜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留照激,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓盹牧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親励幼。 傳聞我的和親對象是個殘疾皇子汰寓,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容