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

NIO需要了解的一些概念

開發(fā) 后端
本文主要介紹了Java NIO需要了解的一些概念。

幾個(gè)概念:

緩沖區(qū)(Buffers)

新的 Buffer 類是常規(guī) Java 類和通道之間的紐帶。原始數(shù)據(jù)元素組成的固定長(zhǎng)度數(shù)組,封裝在包含狀態(tài)信息的對(duì)象中,存入緩沖區(qū)。緩沖區(qū)提供了一個(gè)會(huì)合點(diǎn):通道既可提取放在緩沖區(qū)中的數(shù)據(jù)(寫),也可向緩沖區(qū)存入數(shù)據(jù)供讀取(讀)。此外,還有一種特殊類型的緩沖區(qū),用于內(nèi)存映射文件。

通道(Channels)

NIO 新引入的最重要的抽象是通道的概念。Channel 對(duì)象模擬了通信連接,管道既可以是單向的(進(jìn)或出),也可以是雙向的(進(jìn)和出)。可以把通道想象成連接緩沖區(qū)和 I/O 服務(wù)的捷徑

文件鎖定和內(nèi)存映射文件(File locking and memory-mapped files)

新的 FileChannel 對(duì)象包含在 java.nio.channels 軟件包內(nèi),提供許多面向文件的新特 性,其中最有趣的兩個(gè)是文件鎖定和內(nèi)存映射文件。
在多個(gè)進(jìn)程協(xié)同工作的情況下,要協(xié)調(diào)各個(gè)進(jìn)程對(duì)共享數(shù)據(jù)的訪問,文件鎖定是必不可少的工具。

將文件映射到內(nèi)存,這樣在您看來,磁盤上的文件數(shù)據(jù)就像是在內(nèi)存中一樣。這利用了操作系統(tǒng)的虛擬內(nèi)存功能,無需在內(nèi)存中實(shí)際保留一份文件的拷貝,就可實(shí)現(xiàn)文件內(nèi)容的動(dòng)態(tài)高速緩存。

套接字(Sockets)

套接字通道類為使用網(wǎng)絡(luò)套接字實(shí)現(xiàn)交互提供了新方法。套接字通道可工作于非塊模式,并可與選擇器一同使用。因此,多個(gè)套接字可實(shí)現(xiàn)多路傳輸,管理效率也比 java.net 提供的傳統(tǒng)套接字更高。三個(gè)新套接字通道,即 ServerSocketChannel、SocketChannel 和 DatagramChannel

選擇器(Selectors)

選擇器可實(shí)現(xiàn)就緒性選擇。Selector 類提供了確定一或多個(gè)通道當(dāng)前狀態(tài)的機(jī)制。使用選擇 器,借助單一線程,就可對(duì)數(shù)量龐大的活動(dòng) I/O 通道實(shí)施監(jiān)控和維護(hù)。

正則表達(dá)式(Regular expressions)

新增的 java.util.regex 軟件包將類似 Perl 語言的正則表達(dá)式處理機(jī)制引入 Java。這一人 們期盼已久的特性有著廣泛用途。

新的正則表達(dá)式 API 之所以被看成是 NIO 的組成部分,是因 JSR 51 把它與其他 NIO 特性放在一起作了詳細(xì)說明。雖然它在許多方面與 NIO 的其他組成部分缺乏平行關(guān)系,但它在文件處理等眾多領(lǐng)域都是極其有用的。

字符集(Character sets)
java.nio.charsets 提供了新類用于處理字符與字節(jié)流之間的映射關(guān)系。您可以對(duì)字符轉(zhuǎn)換映射方式進(jìn)行選擇,也可以自己創(chuàng)建映射。

磁盤I/O的示例

圖中明顯忽略了很多細(xì)節(jié),僅顯示了涉及到的基本步驟。

如圖

注意圖中用戶空間和內(nèi)核空間的概念。用戶空間是常規(guī)進(jìn)程所在區(qū)域。JVM 就是常規(guī)進(jìn)程,駐守于用戶空間。用戶空間是非特權(quán)區(qū)域:比如,在該區(qū)域執(zhí)行的代碼就不能直接訪問硬件設(shè)備。內(nèi)核空間是操作系統(tǒng)所在區(qū)域。內(nèi)核代碼有特別的權(quán)力:它能與設(shè)備控制器通訊,控制著用戶區(qū)域進(jìn)程的運(yùn)行狀態(tài),等等。最重要的是,所有 I/O 都直接(如這里所述)或間接(見 1.4.2 小節(jié))通過內(nèi)核空間。

當(dāng)進(jìn)程請(qǐng)求 I/O 操作的時(shí)候,它執(zhí)行一個(gè)系統(tǒng)調(diào)用(有時(shí)稱為陷阱)將控制權(quán)移交給內(nèi)核。C/C++程序員所熟知的底層函數(shù) open( )、read( )、write( )和 close( )要做的無非就是建立和執(zhí)行適當(dāng) 的系統(tǒng)調(diào)用。當(dāng)內(nèi)核以這種方式被調(diào)用,它隨即采取任何必要步驟,找到進(jìn)程所需數(shù)據(jù),并把數(shù)據(jù)傳送到用戶空間內(nèi)的指定緩沖區(qū)。內(nèi)核試圖對(duì)數(shù)據(jù)進(jìn)行高速緩存或預(yù)讀取,因此進(jìn)程所需數(shù)據(jù)可能已經(jīng)在內(nèi)核空間里了。如果是這樣,該數(shù)據(jù)只需簡(jiǎn)單地拷貝出來即可。如果數(shù)據(jù)不在內(nèi)核空間,則進(jìn)程被掛起,內(nèi)核著手把數(shù)據(jù)讀進(jìn)內(nèi)存。

看了圖 1-1,您可能會(huì)覺得,把數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間似乎有些多余。為什么不直接讓磁盤控制器把數(shù)據(jù)送到用戶空間的緩沖區(qū)呢?這樣做有幾個(gè)問題。首先,硬件通常不能直接訪問用戶空間 1。其次,像磁盤這樣基于塊存儲(chǔ)的硬件設(shè)備操作的是固定大小的數(shù)據(jù)塊,而用戶進(jìn)程請(qǐng)求的可能是任意大小的或非對(duì)齊的數(shù)據(jù)塊。在數(shù)據(jù)往來于用戶空間與存儲(chǔ)設(shè)備的過程中,內(nèi)核負(fù)責(zé)數(shù)據(jù)的分解、再組合工作,因此充當(dāng)著中間人的角色。

發(fā)散/匯聚

許多操作系統(tǒng)能把組裝/分解過程進(jìn)行得更加高效。根據(jù)發(fā)散/匯聚的概念,進(jìn)程只需一個(gè)系統(tǒng)調(diào)用,就能把一連串緩沖區(qū)地址傳遞給操作系統(tǒng)。然后,內(nèi)核就可以順序填充或排干多個(gè)緩沖區(qū),讀的時(shí)候就把數(shù)據(jù)發(fā)散到多個(gè)用戶空間緩沖區(qū),寫的時(shí)候再從多個(gè)緩沖區(qū)把數(shù)據(jù)匯聚起來這樣用戶進(jìn)程就不必多次執(zhí)行系統(tǒng)調(diào)用(那樣做可能代價(jià)不菲),內(nèi)核也可以優(yōu)化數(shù)據(jù)的處理過程,因?yàn)樗颜莆沾齻鬏敂?shù)據(jù)的全部信息。如果系統(tǒng)配有多個(gè) CPU,甚至可以同時(shí)填充或排干多個(gè)緩沖區(qū)。

虛擬內(nèi)存

所有現(xiàn)代操作系統(tǒng)都使用虛擬內(nèi)存。虛擬內(nèi)存意為使用虛假(或虛擬)地址取代物理(硬件RAM)內(nèi)存地址。這樣做好處頗多,總結(jié)起來可分為兩大類:

1. 一個(gè)以上的虛擬地址可指向同一個(gè)物理內(nèi)存地址。

2. 虛擬內(nèi)存空間可大于實(shí)際可用的硬件內(nèi)存。

設(shè)備控制器不能通過 DMA 直接存儲(chǔ)到用戶空間,但通過利用上面提到的***項(xiàng),則可以達(dá)到相同效果。把內(nèi)核空間地址與用戶空間的虛擬地址映射到同一個(gè)物理地址,這樣,DMA 硬件(只能訪問物理內(nèi)存地址)就可以填充對(duì)內(nèi)核與用戶空間進(jìn)程同時(shí)可見的緩沖區(qū)

如圖,進(jìn)程虛擬內(nèi)存和內(nèi)核虛擬內(nèi)存映射到的物理地址都一樣,這樣DMA寫到實(shí)際的物理內(nèi)存后,兩個(gè)緩沖區(qū)指向的物理地址都一樣,那么他們就同時(shí)能訪問到數(shù)據(jù)了。

但前提條件是,內(nèi)核與用戶緩沖區(qū)必須使用相同的頁對(duì)齊,緩沖區(qū)的大小還必須是磁盤控制器塊大小(通常為 512 字節(jié)磁盤扇區(qū))的倍數(shù)。操作系統(tǒng)把內(nèi)存地址空間劃分為頁,即固定大小的字節(jié)組。內(nèi)存頁的大小總是磁盤塊大小的倍數(shù),通常為 2 次冪(這樣可簡(jiǎn)化尋址操作)。典型的內(nèi)存頁為 1,024、2,048 和 4,096 字節(jié)。虛擬和物理內(nèi)存頁的大小總是相同的。

如上圖顯示了來自多個(gè)虛擬地址的虛擬內(nèi)存頁是如何映射到物理內(nèi)。

內(nèi)存頁面調(diào)度

為了支持虛擬內(nèi)存的第二個(gè)特性(尋址空間大于物理內(nèi)存),就必須進(jìn)行虛擬內(nèi)存分頁(經(jīng)常稱為交換,雖然真正的交換是在進(jìn)程層面完成,而非頁層面)。依照該方案,虛擬內(nèi)存空間的頁面能夠繼續(xù)存在于外部磁盤存儲(chǔ),這樣就為物理內(nèi)存中的其他虛擬頁面騰出了空間。從本質(zhì)上說,物理內(nèi)存充當(dāng)了分頁區(qū)的高速緩存;而所謂分頁區(qū),即從物理內(nèi)存置換出來,轉(zhuǎn)而存儲(chǔ)于磁盤上的內(nèi)存頁面。

原文鏈接:http://liyixing1.iteye.com/blog/1011451

【編輯推薦】

  1. NIO 通道和緩沖區(qū)
  2. Java的標(biāo)準(zhǔn)數(shù)據(jù)流
  3. 全面解讀Java NIO工作原理
  4. Java NIO 異步讀取網(wǎng)絡(luò)數(shù)據(jù)
  5. Java的NIO以及線程并發(fā)
責(zé)任編輯:林師授 來源: liyixing1的博客
相關(guān)推薦

2022-06-08 08:03:51

React.jsReactJS 庫

2021-09-30 15:32:45

網(wǎng)絡(luò)安全數(shù)據(jù)漏洞

2012-04-01 09:10:17

WEB設(shè)計(jì)師前端

2015-10-23 15:22:16

AsyncTask基礎(chǔ)Android

2023-07-18 15:04:21

數(shù)據(jù)中心IT

2022-02-28 15:05:17

ArkUIHarmonyOS鴻蒙

2016-11-14 15:30:49

阿里百川HotFix

2016-12-19 16:47:13

阿里百川HotFix

2020-07-15 07:45:51

Python開發(fā)工具

2021-11-16 19:12:16

網(wǎng)絡(luò)安全概念信息安全

2009-06-18 14:54:52

Spring AOP

2020-04-22 14:41:17

JVM參數(shù)函數(shù)

2022-11-04 10:21:57

IT領(lǐng)導(dǎo)者首席信息官

2009-06-14 17:08:11

ibmdw云計(jì)算

2021-09-15 09:51:36

數(shù)據(jù)庫架構(gòu)技術(shù)

2012-06-27 09:11:47

2024-06-14 16:07:41

2012-06-26 10:13:55

2011-04-01 11:16:06

hessian

2021-08-09 14:40:02

物聯(lián)網(wǎng)IOT智能家居
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产黄色免费网站 | 欧美一级大片 | 日韩三级在线 | 日韩一区二区三区视频在线播放 | 国产一区2区 | 狠狠爱免费视频 | 黑人精品xxx一区一二区 | 欧美日韩一区二区三区在线观看 | 日韩在线资源 | 国产亚洲一区二区在线观看 | 欧美日韩在线高清 | 欧美日韩久久久 | 中文字幕精品一区二区三区精品 | 精品一区国产 | 国产一区二区日韩 | www.日本在线播放 | www亚洲精品 | 中文av在线播放 | 在线观看视频一区 | 中文成人在线 | 麻豆久久久9性大片 | 午夜精品久久久久久久99黑人 | 不卡一区二区三区四区 | 国产一级在线视频 | 天堂综合 | 欧美中文字幕一区二区三区 | 日韩一区av | 久久久妇女国产精品影视 | 岛国视频 | 久久四虎| 国产专区免费 | 亚洲一区精品在线 | 久久69精品久久久久久国产越南 | 国产在线一区二区三区 | 亚洲天堂精品久久 | 欧美国产精品一区二区 | 依人成人 | 国产99小视频 | 一区二区精品 | 欧美aⅴ在线观看 | 一区二区在线免费观看 |