當前位置:編程學習大全網 - 源碼下載 - Java 以下兩個要求 怎麽在Java中以程序的方式實現? (圍繞CORBA和IOR)

Java 以下兩個要求 怎麽在Java中以程序的方式實現? (圍繞CORBA和IOR)

最近在看?JAVA?NIO 的相關知識,了解壹下IO的底層實現原理。

IO涉及到的底層的概念大致如下:

1) 緩沖區操作。2) 內核空間與用戶空間。3) 虛擬內存。4) 分頁技術。

壹,虛擬存儲器

虛擬存儲器是硬件異常(缺頁異常)、硬件地址翻譯、主存、磁盤文件和內核軟件的完美交互,它為每個進程提供了壹個大的、壹致的和私有的地址空間。

虛擬存儲器的三大能力:①將主存看成是壹個存儲在磁盤上的地址空間的高速緩存。②為每個進程提供了壹個壹致的地址空間。③保護每個進程的地址空間不被其他進程破壞。

虛擬內存的兩大好處:① 壹個以上的虛擬地址可指向同壹個物理內存地址。② 虛擬內存空間可大於實際可用的硬件內存。

二,用戶空間與內核空間

設虛擬地址為32位,那麽虛擬地址空間的範圍為0~4G。操作系統將這4G分為二部分,將最高的1G字節(虛擬地址範圍為:0xC0000000-0xFFFFFFFF)供內核使用,稱為內核空間。而將較低的3G字節供各個進程使用,稱為用戶空間。

每個進程可以通過系統調用進入內核,因為內核是由所有的進程***享的。對於每壹個具體的進程,它看到的都是4G大小的虛擬地址空間,即相當於每個進程都擁有壹個4G大小的虛擬地址空間。

三,IO操作

壹般IO緩沖區操作:

1) 用戶進程使用read()系統調用,要求其用戶空間的緩沖區被填滿。

2) 內核向磁盤控制器硬件發命令,要求從磁盤讀入數據。

3) 磁盤控制器以DMA方式(數據不經過CPU)把數據復制到內核緩沖區。

4) 內核將數據從內核緩沖區復制到用戶進程發起read()調用時指定的用戶緩沖區。

從上圖可以看出:磁盤中的數據是先讀取到內核的緩沖區中。然後再從內核的緩沖區復制到用戶的緩沖區。為什麽會這樣呢?

因為用戶空間的進程是不能直接硬件的(操作磁盤控制器)。磁盤是基於塊存儲的硬件設備,它壹次操作固定大小的塊,而用戶請求請求的可能是任意大小的數據塊。因此,將數據從磁盤傳遞到用戶空間,由內核負責數據的分解、再組合。

內存映射IO:就是復用壹個以上的虛擬地址可以指向同壹個物理內存地址。將內核空間的緩沖區地址(內核地址空間)映射到物理內存地址區域,將用戶空間的緩沖區地址(用戶地址空間)也映射到相同的物理內存地址區域。從而數據不需要從內核緩沖區映射的物理內存地址移動到用戶緩沖區映射的物理內存地址了。

要求:①用戶緩沖區與內核緩沖區必須使用相同的頁大小對齊。②緩沖區的大小必須是磁盤控制器塊大小(512字節磁盤扇區)的倍數---因為磁盤是基於塊存儲的硬件設備,壹次只能操作固定大小的數據塊。

用戶緩沖區按頁對齊,會提高IO的效率---這也是為什麽在JAVA中new 壹個字節數組時,指定的大小為2的倍數(4096)的原因吧。

四,JAVA中的IO,本質上是把數據移進或者移出緩沖區。

read()和write()系統調用完成的作用是:把內核緩沖區映射的物理內存空間中的數據 拷貝到 用戶緩沖區映射的物理內存空間中。

因此,當使用內存映射IO時,可視為:用戶進程直接把文件數據當作內存,也就不需要使用read()或write()系統調用了。

當發起壹個read()系統調用時,根據待讀取的數據的位置生成壹個虛擬地址(用戶進程使用的是虛擬地址),由MMU轉換成物理地址,若內核中沒有相應的數據,產生壹個缺頁請求,內核負責頁面調入從而將數據從磁盤讀取到內核緩沖區映射的物理內存中。對用戶程序而言,這壹切都是在不知不覺中進行。

總之,從根本上講數據從磁盤裝入內存是以頁為單位通過分頁技術裝入內存的。

五,JAVA NIO中的直接緩存和非直接緩存

直接緩存:不是分配於堆上的存儲,位於JVM之外,它不受JAVA的GC管理,相當於內核緩沖區。非直接緩存:建立在JAVA堆上的緩存,受JVM管理,相當於用戶緩沖區。

根據上面第三點,將直接緩存中的數據寫入通道的速度要快於非直接緩存。因為,連接到通道的另壹端是文件(磁盤,FileChannel)或者網絡(Socket通道),這些都是某種形式上的硬件。那麽,對於非直接緩存而言,數據從緩沖區傳遞到硬件,要經過內核緩沖區中轉。而對於直接緩存而言,就不需要了,因為直接緩存已經直接映射到內核緩沖區了。

  • 上一篇:解析國家戰神田鵬元帥的職業生涯——第二個月光職業
  • 下一篇:煉鋼廠脫硫站扒渣機大齒圈拆卸方法
  • copyright 2024編程學習大全網