日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何實現(xiàn)IO的底層原理問題

如何實現(xiàn)IO的底層原理問題

作者:new_chaos 2017-10-23 10:13:18

存儲

存儲設備

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

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網(wǎng)站設計制作、成都網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的包頭網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!

 最近在看 JAVA NIO 的相關知識,了解一下IO的底層實現(xiàn)原理。

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

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

一,虛擬存儲器

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

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

虛擬內(nèi)存的兩大好處:① 一個以上的虛擬地址可指向同一個物理內(nèi)存地址。② 虛擬內(nèi)存空間可大于實際可用的硬件內(nèi)存。

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

設虛擬地址為32位,那么虛擬地址空間的范圍為0~4G。操作系統(tǒng)將這4G分為二部分,將***的1G字節(jié)(虛擬地址范圍為:0xC0000000-0xFFFFFFFF)供內(nèi)核使用,稱為內(nèi)核空間。而將較低的3G字節(jié)供各個進程使用,稱為用戶空間。

每個進程可以通過系統(tǒng)調用進入內(nèi)核,因為內(nèi)核是由所有的進程共享的。對于每一個具體的進程,它看到的都是4G大小的虛擬地址空間,即相當于每個進程都擁有一個4G大小的虛擬地址空間。

三,IO操作

一般IO緩沖區(qū)操作:

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

2) 內(nèi)核向磁盤控制器硬件發(fā)命令,要求從磁盤讀入數(shù)據(jù)。

3) 磁盤控制器以DMA方式(數(shù)據(jù)不經(jīng)過CPU)把數(shù)據(jù)復制到內(nèi)核緩沖區(qū)。

4) 內(nèi)核將數(shù)據(jù)從內(nèi)核緩沖區(qū)復制到用戶進程發(fā)起read()調用時指定的用戶緩沖區(qū)。

從上圖可以看出:磁盤中的數(shù)據(jù)是先讀取到內(nèi)核的緩沖區(qū)中。然后再從內(nèi)核的緩沖區(qū)復制到用戶的緩沖區(qū)。為什么會這樣呢?

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

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

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

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

四,JAVA中的IO,本質上是把數(shù)據(jù)移進或者移出緩沖區(qū)。

read()和write()系統(tǒng)調用完成的作用是:把內(nèi)核緩沖區(qū)映射的物理內(nèi)存空間中的數(shù)據(jù) 拷貝到 用戶緩沖區(qū)映射的物理內(nèi)存空間中。

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

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

總之,從根本上講數(shù)據(jù)從磁盤裝入內(nèi)存是以頁為單位通過分頁技術裝入內(nèi)存的。

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

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

根據(jù)上面第三點,將直接緩存中的數(shù)據(jù)寫入通道的速度要快于非直接緩存。因為,連接到通道的另一端是文件(磁盤,F(xiàn)ileChannel)或者網(wǎng)絡(Socket通道),這些都是某種形式上的硬件。那么,對于非直接緩存而言,數(shù)據(jù)從緩沖區(qū)傳遞到硬件,要經(jīng)過內(nèi)核緩沖區(qū)中轉。而對于直接緩存而言,就不需要了,因為直接緩存已經(jīng)直接映射到內(nèi)核緩沖區(qū)了。


網(wǎng)頁名稱:如何實現(xiàn)IO的底層原理問題
鏈接URL:http://www.5511xx.com/article/dhdgiep.html