一:NIO

CPU不是瓶頸,I/O操做成爲系統瓶頸,緩存

因爲操做系統和JVM的I/O模型不匹配,(操做系統基於塊,分頁,JAVA 的I/O模型是基於流的方式處理,)所以JVM封裝的不少高效I/O並不支持框架

所以在jdk1.4的時候提出了新的I/O模型NIO操作系統

NIO提供了新的抽象channel和selector,這套新類提供了強大的框架涵蓋了普通系統提供的高效的I/O,設計

首先看一下操做系統如何做I/O操做的進程

1:虛擬內存分頁內存

    比較早些的時候,PC的內存比較小,好比只有254k,可是一個進程須要使用的內存是20m,那麼實際上系統內存就不夠用了,所以操做系統提供了虛擬內存機制。那麼如何把虛擬內存對應到實際的物理內存呢,這就是內存分頁技術。爲此虛擬內存和物理內存被分爲單位大小相同的頁幀,而後爲了知道虛擬內存如何映射到物理內存設計了頁表(根據虛擬地址查找實際地址),CPU和物理內存之間有一個叫作MMU的組件,用來查找頁表,轉換爲物理內存地址,若是當前不存在一個物理地址對應了入參的虛擬機地址,那麼就會向CPU提交一個頁錯誤,而後CPU將控制權交給內核執行頁面調度,把數據存儲在物理內存中,同時刷新頁表和MMU,MMU會返回正確的物理地址給用戶進程,對用戶基本無感知。同步

基於虛擬內存,看一下實際上操做系統層面的I/O的情形,注意下面所說的內存都是虛擬內存:虛擬機

1:緩衝區,it

    用戶發其I/O操做,先在內存中爲用戶I/O進程開一片緩衝區,而後發送操做系統命令把本身的緩衝區填滿,或者清空,內核隨即開始查找數據,對內存緩衝區進行高速緩存或者預讀取,而後在把內存緩衝區中的數據拷貝到用戶的緩衝區中。內存管理

不直接拷貝數據的緣由是在磁盤上是整塊,可是在緩衝區中可能不是連續的,在內核緩衝區能夠進行分解整合的操做。

一些增長效率的方法:

   發散/匯聚

    1:許多操做系統把分解/整合的操做進行的很高校,只須要一次系統調用,就會返回內存中一連串的緩衝區地址給操做系統,操做系統會順序的填滿或者晴空,而後在同步到用戶的緩衝區中,這樣較少系統調用次數;

    虛擬內存:

       1: 經過多塊虛擬內存地址映射到同一塊內存,能夠解決設備控制器不能直接存儲到用戶空間的問題。

        2:當尋址空間大與物理內存的時候,採用分頁的機制

            一個很恰當的比喻就是,你不須要很長的軌道讓火車能夠從山東開到成都,你只須要足夠長的鐵軌就ok,採起的方法就是把後面的鐵軌迅速撲倒火車前面,只要你的操做足夠塊,並能知足要求,列車就能像在一條足夠長的鐵軌上運行,這就是虛擬內存管理須要完成的任務。

    具體的文件系統是一個邏輯概念,組織了一組磁盤上不連續的數據。全部的文件I/O都是基於頁面調度完成。

    執行文件系統I/O全過程,文件系統也有頁的概念,一般是內存頁的整數倍,從文件系統得知數據具體放在那些文件系統頁上,在內核空間分配足夠的內存以容納文件系統頁,而後對內存和文件系統頁之間作映射,爲每一個內存產生的頁錯誤,虛擬內存系統捕獲頁錯誤,安排頁面調入,從硬盤讀取頁內容,使頁有效,一旦頁有效以後,文件系統對原始數據進行解析,取的所需的文件內容和文件名可讀狀態等屬性。

    內存映射文件,傳統文件I/O經過用戶進程發佈多個read()和write()系統調用來傳輸數據的,由於文件系統頁和用戶緩衝區頁不是一一對應的關係,因此會發生屢次拷貝,從文件系統頁到內核緩衝區,在到用戶緩衝區,爲此操做系統支持了內存映射I/O。

相關文章
相關標籤/搜索