成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何實現IO的底層原理問題

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

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

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

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

一,虛擬存儲器

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

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

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

[[207226]]

二,用戶空間與內核空間

設虛擬地址為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通道),這些都是某種形式上的硬件。那么,對于非直接緩存而言,數據從緩沖區傳遞到硬件,要經過內核緩沖區中轉。而對于直接緩存而言,就不需要了,因為直接緩存已經直接映射到內核緩沖區了。

責任編輯:武曉燕 來源: oschina博客
相關推薦

2023-01-04 07:54:03

HashMap底層JDK

2021-01-08 08:34:09

Synchronize線程開發技術

2023-07-11 08:00:00

2022-12-19 08:00:00

SpringBootWeb開發

2022-12-26 09:27:48

Java底層monitor

2024-01-29 08:00:00

架構微服務開發

2024-03-14 14:56:22

反射Java數據庫連接

2023-07-17 08:02:44

ZuulIO反應式

2025-05-08 08:45:00

內存IO內存CPU

2024-02-29 16:49:20

volatileJava并發編程

2025-03-27 04:00:00

2024-08-29 16:30:27

2018-11-02 10:46:08

硬盤SQL ServerIO

2022-04-13 14:43:05

JVM同步鎖Monitor 監視

2020-10-13 07:51:03

五種IO模型

2023-02-12 23:23:30

2021-08-29 07:41:48

數據HashMap底層

2020-11-05 11:14:29

Docker底層原理

2024-01-05 09:00:00

SpringMVC軟件

2012-08-20 09:45:18

SQL Server
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最新av在线网址 | 国产激情视频在线观看 | 一级全黄视频 | 91在线导航 | 国产一区二区久久 | 欧洲一区视频 | 国产男女视频 | 二区三区在线观看 | 91一区二区三区在线观看 | 欧美一级淫片免费视频黄 | 日韩欧美三级在线 | 美女张开腿露出尿口 | 一区二区三区在线免费观看 | www.精品一区 | 91成人在线| 国产精品伦一区二区三级视频 | 色网站视频| 国产黄色在线观看 | 精品国产欧美一区二区 | 天天操天天摸天天干 | 亚洲一区不卡 | 久久久久成人精品 | 中文字幕亚洲专区 | 中文字幕韩在线第一页 | 久久久www成人免费精品 | 久久久999精品 | 久久逼逼| 在线视频国产一区 | 国产成人免费视频 | 久久中文字幕电影 | jav成人av免费播放 | 欧美一级高潮片免费的 | 午夜视频在线播放 | 伊人网站 | 夜夜爽99久久国产综合精品女不卡 | 日韩欧美国产精品一区二区三区 | 欧美一级片 | 欧美日韩高清一区 | 免费成人午夜 | 天天影视综合 | 亚洲精品1区 |