真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

JAVA中BIO,NIO,AIO的理解是怎樣的

今天就跟大家聊聊有關(guān)JAVA中BIO,NIO,AIO的理解是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

十余年專注成都網(wǎng)站制作,成都定制網(wǎng)站,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)站,高端網(wǎng)頁(yè)制作,對(duì)陽(yáng)光房等多個(gè)領(lǐng)域,擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)。

在高性能的IO體系設(shè)計(jì)中,有幾個(gè)名詞概念常常會(huì)使我們感到迷惑不解。具體如下: 

編號(hào)名詞解釋舉例
1同步指的是用戶進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否就緒自己上街買衣服,自己親自干這件事,別的事干不了。
2異步異步是指用戶進(jìn)程觸發(fā)IO操作以后便開(kāi)始做自己的事情,而當(dāng)IO操作已經(jīng)完成的時(shí)候會(huì)得到IO完成的通知(異步的特點(diǎn)就是通知)告訴朋友自己合適衣服的尺寸,大小,顏色,讓朋友委托去賣,然后自己可以去干別的事。(使用異步IO時(shí),Java將IO讀寫(xiě)委托給OS處理,需要將數(shù)據(jù)緩沖區(qū)地址和大小傳給OS)
3阻塞所謂阻塞方式的意思是指, 當(dāng)試圖對(duì)該文件描述符進(jìn)行讀寫(xiě)時(shí), 如果當(dāng)時(shí)沒(méi)有東西可讀,或者暫時(shí)不可寫(xiě), 程序就進(jìn)入等待 狀態(tài), 直到有東西可讀或者可寫(xiě)為止去公交站充值,發(fā)現(xiàn)這個(gè)時(shí)候,充值員不在(可能上廁所去了),然后我們就在這里等待,一直等到充值員回來(lái)為止。(當(dāng)然現(xiàn)實(shí)社會(huì),可不是這樣,但是在計(jì)算機(jī)里確實(shí)如此。)
4非阻塞非阻塞狀態(tài)下, 如果沒(méi)有東西可讀, 或者不可寫(xiě), 讀寫(xiě)函數(shù)馬上返回, 而不會(huì)等待,銀行里取款辦業(yè)務(wù)時(shí),領(lǐng)取一張小票,領(lǐng)取完后我們自己可以玩玩手機(jī),或者與別人聊聊天,當(dāng)輪我們時(shí),銀行的喇叭會(huì)通知,這時(shí)候我們就可以去了。


散仙不才,在查了一部分資料后,愿試著以通俗易懂的方式解釋下這幾個(gè)名詞。。 

在弄清楚上面的幾個(gè)問(wèn)題之前,我們首先得明白什么是同步,異步,阻塞,非阻塞,只有這幾個(gè)單個(gè)概念理解清楚了,然后在組合理解起來(lái),就相對(duì)比較容易了。 

1,同步和異步是針對(duì)應(yīng)用程序和內(nèi)核的交互而言的。 

2,阻塞和非阻塞是針對(duì)于進(jìn)程在訪問(wèn)數(shù)據(jù)的時(shí)候,根據(jù)IO操作的就緒狀態(tài)來(lái)采取的不同方式,說(shuō)白了是一種讀取或者寫(xiě)入操作函數(shù)的實(shí)現(xiàn)方式,阻塞方式下讀取或者寫(xiě)入函數(shù)將一直等待,而非阻塞方式下,讀取或者寫(xiě)入函數(shù)會(huì)立即返回一個(gè)狀態(tài)值。  

由上描述基本可以總結(jié)一句簡(jiǎn)短的話,同步和異步是目的,阻塞和非阻塞是實(shí)現(xiàn)方式。 

 
下面我們?cè)賮?lái)理解組合方式的IO類型,就好理解多了。 

同步阻塞IO(JAVA BIO): 
    同步并阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程,即客戶端有連接請(qǐng)求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程進(jìn)行處理,如果這個(gè)連接不做任何事情會(huì)造成不必要的線程開(kāi)銷,當(dāng)然可以通過(guò)線程池機(jī)制改善。 

同步非阻塞IO(Java NIO) : 同步非阻塞,服務(wù)器實(shí)現(xiàn)模式為一個(gè)請(qǐng)求一個(gè)線程,即客戶端發(fā)送的連接請(qǐng)求都會(huì)注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢到連接有I/O請(qǐng)求時(shí)才啟動(dòng)一個(gè)線程進(jìn)行處理。用戶進(jìn)程也需要時(shí)不時(shí)的詢問(wèn)IO操作是否就緒,這就要求用戶進(jìn)程不停的去詢問(wèn)。 

異步阻塞IO(Java NIO):  
   此種方式下是指應(yīng)用發(fā)起一個(gè)IO操作以后,不等待內(nèi)核IO操作的完成,等內(nèi)核完成IO操作以后會(huì)通知應(yīng)用程序,這其實(shí)就是同步和異步最關(guān)鍵的區(qū)別,同步必須等待或者主動(dòng)的去詢問(wèn)IO是否完成,那么為什么說(shuō)是阻塞的呢?因?yàn)榇藭r(shí)是通過(guò)select系統(tǒng)調(diào)用來(lái)完成的,而select函數(shù)本身的實(shí)現(xiàn)方式是阻塞的,而采用select函數(shù)有個(gè)好處就是它可以同時(shí)監(jiān)聽(tīng)多個(gè)文件句柄(如果從UNP的角度看,select屬于同步操作。因?yàn)閟elect之后,進(jìn)程還需要讀寫(xiě)數(shù)據(jù)),從而提高系統(tǒng)的并發(fā)性!  


(Java AIO(NIO.2))異步非阻塞IO:  
   在此種模式下,用戶進(jìn)程只需要發(fā)起一個(gè)IO操作然后立即返回,等IO操作真正的完成以后,應(yīng)用程序會(huì)得到IO操作完成的通知,此時(shí)用戶進(jìn)程只需要對(duì)數(shù)據(jù)進(jìn)行處理就好了,不需要進(jìn)行實(shí)際的IO讀寫(xiě)操作,因?yàn)檎嬲腎O讀取或者寫(xiě)入操作已經(jīng)由內(nèi)核完成了。    



BIO、NIO、AIO適用場(chǎng)景分析: 

    BIO方式適用于連接數(shù)目比較小且固定的架構(gòu),這種方式對(duì)服務(wù)器資源要求比較高,并發(fā)局限于應(yīng)用中,JDK1.4以前的唯一選擇,但程序直觀簡(jiǎn)單易理解。 

    NIO方式適用于連接數(shù)目多且連接比較短(輕操作)的架構(gòu),比如聊天服務(wù)器,并發(fā)局限于應(yīng)用中,編程比較復(fù)雜,JDK1.4開(kāi)始支持。 

    AIO方式使用于連接數(shù)目多且連接比較長(zhǎng)(重操作)的架構(gòu),比如相冊(cè)服務(wù)器,充分調(diào)用OS參與并發(fā)操作,編程比較復(fù)雜,JDK7開(kāi)始支持。 
 
搞清楚了以上概念以后,我們?cè)倩剡^(guò)頭來(lái)看看,Reactor模式和Proactor模式。  
  
(其實(shí)阻塞與非阻塞都可以理解為同步范疇下才有的概念,對(duì)于異步,就不會(huì)再去分阻塞非阻塞。對(duì)于用戶進(jìn)程,接到異步通知后,就直接操作進(jìn)程用戶態(tài)空間里的數(shù)據(jù)好了。)  
  
首先來(lái)看看Reactor模式,Reactor模式應(yīng)用于同步I/O的場(chǎng)景。我們分別以讀操作和寫(xiě)操作為例來(lái)看看Reactor中的具體步驟:  
讀取操作:  
1. 應(yīng)用程序注冊(cè)讀就緒事件和相關(guān)聯(lián)的事件處理器  
  
2. 事件分離器等待事件的發(fā)生  
  
3. 當(dāng)發(fā)生讀就緒事件的時(shí)候,事件分離器調(diào)用第一步注冊(cè)的事件處理器  
  
4. 事件處理器首先執(zhí)行實(shí)際的讀取操作,然后根據(jù)讀取到的內(nèi)容進(jìn)行進(jìn)一步的處理  
  
寫(xiě)入操作類似于讀取操作,只不過(guò)第一步注冊(cè)的是寫(xiě)就緒事件。  
   
  
下面我們來(lái)看看Proactor模式中讀取操作和寫(xiě)入操作的過(guò)程:  
讀取操作:  
1. 應(yīng)用程序初始化一個(gè)異步讀取操作,然后注冊(cè)相應(yīng)的事件處理器,此時(shí)事件處理器不關(guān)注讀取就緒事件,而是關(guān)注讀取完成事件,這是區(qū)別于Reactor的關(guān)鍵。  
  
2. 事件分離器等待讀取操作完成事件  
  
3. 在事件分離器等待讀取操作完成的時(shí)候,操作系統(tǒng)調(diào)用內(nèi)核線程完成讀取操作(異步IO都是操作系統(tǒng)負(fù)責(zé)將數(shù)據(jù)讀寫(xiě)到應(yīng)用傳遞進(jìn)來(lái)的緩沖區(qū)供應(yīng)用程序操作,操作系統(tǒng)扮演了重要角色),并將讀取的內(nèi)容放入用戶傳遞過(guò)來(lái)的緩存區(qū)中。這也是區(qū)別于Reactor的一點(diǎn),Proactor中,應(yīng)用程序需要傳遞緩存區(qū)。  
  
4. 事件分離器捕獲到讀取完成事件后,激活應(yīng)用程序注冊(cè)的事件處理器,事件處理器直接從緩存區(qū)讀取數(shù)據(jù),而不需要進(jìn)行實(shí)際的讀取操作。  
  
Proactor中寫(xiě)入操作和讀取操作,只不過(guò)感興趣的事件是寫(xiě)入完成事件。  
  
從上面可以看出,Reactor和Proactor模式的主要區(qū)別就是真正的讀取和寫(xiě)入操作是有誰(shuí)來(lái)完成的,Reactor中需要應(yīng)用程序自己讀取或者寫(xiě)入數(shù)據(jù),而Proactor模式中,應(yīng)用程序不需要進(jìn)行實(shí)際的讀寫(xiě)過(guò)程,它只需要從緩存區(qū)讀取或者寫(xiě)入即可,操作系統(tǒng)會(huì)讀取緩存區(qū)或者寫(xiě)入緩存區(qū)到真正的IO設(shè)備.  
   
          綜上所述,同步和異步是相對(duì)于應(yīng)用和內(nèi)核的交互方式而言的,同步 需要主動(dòng)去詢問(wèn),而異步的時(shí)候內(nèi)核在IO事件發(fā)生的時(shí)候通知應(yīng)用程序,而阻塞和非阻塞僅僅是系統(tǒng)在調(diào)用系統(tǒng)調(diào)用的時(shí)候函數(shù)的實(shí)現(xiàn)方式而已。  
 


如果你想吃一份宮保雞丁蓋飯: 

同步阻塞:你到飯館點(diǎn)餐,然后在那等著,還要一邊喊:好了沒(méi)?。?nbsp;

同步非阻塞:在飯館點(diǎn)完餐,就去遛狗了。不過(guò)溜一會(huì)兒,就回飯館喊一聲:好了沒(méi)??! 

異步阻塞:遛狗的時(shí)候,接到飯館電話,說(shuō)飯做好了,讓您親自去拿。 

異步非阻塞:飯館打電話說(shuō),我們知道您的位置,一會(huì)給你送過(guò)來(lái),安心遛狗就可以了。
 

“一個(gè)IO操作其實(shí)分成了兩個(gè)步驟:發(fā)起IO請(qǐng)求和實(shí)際的IO操作。 
同步IO和異步IO的區(qū)別就在于第二個(gè)步驟是否阻塞,如果實(shí)際的IO讀寫(xiě)阻塞請(qǐng)求進(jìn)程,那么就是同步IO。 
阻塞IO和非阻塞IO的區(qū)別在于第一步,發(fā)起IO請(qǐng)求是否會(huì)被阻塞,如果阻塞直到完成那么就是傳統(tǒng)的阻塞IO,如果不阻塞,那么就是非阻塞IO。 

同步和異步是針對(duì)應(yīng)用程序和內(nèi)核的交互而言的,同步指的是用戶進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否就緒,而異步是指用戶進(jìn)程觸發(fā)IO操作以后便開(kāi)始做自己的事情,而當(dāng)IO操作已經(jīng)完成的時(shí)候會(huì)得到IO完成的通知。而阻塞和非阻塞是針對(duì)于進(jìn)程在訪問(wèn)數(shù)據(jù)的時(shí)候,根據(jù)IO操作的就緒狀態(tài)來(lái)采取的不同方式,說(shuō)白了是一種讀取或者寫(xiě)入操作函數(shù)的實(shí)現(xiàn)方式,阻塞方式下讀取或者寫(xiě)入函數(shù)將一直等待,而非阻塞方式下,讀取或者寫(xiě)入函數(shù)會(huì)立即返回一個(gè)狀態(tài)值。 
所以,IO操作可以分為3類:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、異步(AIO)。 
同步阻塞: 
在此種方式下,用戶進(jìn)程在發(fā)起一個(gè)IO操作以后,必須等待IO操作的完成,只有當(dāng)真正完成了IO操作以后,用戶進(jìn)程才能運(yùn)行。JAVA傳統(tǒng)的IO模型屬于此種方式。 

同步非阻塞: 
在此種方式下,用戶進(jìn)程發(fā)起一個(gè)IO操作以后邊可返回做其它事情,但是用戶進(jìn)程需要時(shí)不時(shí)的詢問(wèn)IO操作是否就緒,這就要求用戶進(jìn)程不停的去詢問(wèn),從而引入不必要的CPU資源浪費(fèi)。其中目前JAVA的NIO就屬于同步非阻塞IO。 
異步: 
此種方式下是指應(yīng)用發(fā)起一個(gè)IO操作以后,不等待內(nèi)核IO操作的完成,等內(nèi)核完成IO操作以后會(huì)通知應(yīng)用程序?!?nbsp;

看完上述內(nèi)容,你們對(duì)JAVA中BIO,NIO,AIO的理解是怎樣的有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


本文標(biāo)題:JAVA中BIO,NIO,AIO的理解是怎樣的
網(wǎng)頁(yè)網(wǎng)址:http://weahome.cn/article/pdedhh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部