1. 程式人生 > >OIO與NIO區別

OIO與NIO區別

1、OIO中,每個執行緒只能處理一個channel(同步的,該執行緒和該channel繫結)。
執行緒發起IO請求,不管核心是否準備好IO操作,從發起請求起,執行緒一直阻塞,直到操作完成,如圖:
這裡寫圖片描述

NIO中,每個執行緒可以處理多個channel(非同步)。

執行緒發起IO請求,立即返回;核心在做好IO操作的準備之後,通過呼叫註冊的回撥函式通知執行緒做IO操作,執行緒開始阻塞,直到操作完成
這裡寫圖片描述

AIO中,執行緒發起IO請求,立即返回;記憶體做好IO操作的準備之後,做IO操作,直到操作完成或者失敗,通過呼叫註冊的回撥函式通知執行緒做IO操作完成或者失敗
這裡寫圖片描述

那麼OIO如何處理海量連線請求呢?


是對每個請求封裝成一個request,然後從執行緒池中挑一個worker執行緒專門為此請求服務,如果執行緒池中的執行緒用完了,就對請求進行排隊。請求中如果有讀寫資料,是會阻塞執行緒的

2、NIO中channel肯定是非阻塞模式的,否則丟擲異常。為什麼呢?因為前面selector非同步通知程式的時候,通道中的資料肯定是有的。

3、同步與阻塞是不同的概念,非同步與非阻塞也是不同的概念。

4、阻塞式iO會浪費大量的cup進行無意義的上下文切換,因為還是可能讀/寫不到任何資料。

5、同步阻塞:通常給人的印象。把通知應用程式和讀/寫訊息結合在了一起,因為有了資料才能通知,
同步非阻塞:

非同步阻塞:

非同步非阻塞:通常給人的印象。因為如果是非同步通知的話,肯定是能拿到資料的。有效減少執行緒切換。目前java的nio的非同步看起來是阻塞的,因為阻塞在select.select()操作上了。但是其實可以通過select.wakeUp()方法,不用一直阻塞。但要想獲得通道狀態,還是必須等待select.select返回才行的。

綜上所述,同步和阻塞給人的概念是一樣的。而非同步和非阻塞跟給人的概念是一樣的

6、同步非同步指的是通訊模式,而阻塞和非阻塞指的是在接收和傳送時是否等待動作完成才返回所以不能混淆這四個詞。

首先是通訊的同步,主要是指客戶端在傳送請求後,必須得在服務端有迴應後才傳送下一個請求。所以這個時候的所有請求將會在服務端得到同步
其次是通訊的非同步,指客戶端在傳送請求後,不必等待服務端的迴應就可以傳送下一個請求,這樣對於所有的請求動作來說將會在服務端得到非同步,這條請求的鏈路就象是一個請求佇列,所有的動作在這裡不會得到同步的。

阻塞和非阻塞只是應用在請求的讀取和傳送。
在實現過程中,如果服務端是非同步的話,客戶端也是非同步的話,通訊效率會很高,但如果服務端在請求的返回時也是返回給請求的鏈路時,客戶端是可以同步的,這種情況下,服務端是相容同步和非同步的。相反,如果客戶端是非同步而服務端是同步的也不會有問題,只是處理效率低了些。

同步=阻塞式,非同步=非阻塞式
同步和非同步都只針對於本機SOCKET而言的
同步模式下,比如RECIEV和SEND,都要確保收到或傳送完才返回,繼續執行下面的程式碼不然就阻塞在哪裡,所以,同步模式下,一般要用到執行緒來處理。

非同步模式就不同了,不管有沒有收到或傳送出去,他都馬上返回,繼續執行下面的程式碼,結果由訊息通知。

相關推薦

OIONIO區別

1、OIO中,每個執行緒只能處理一個channel(同步的,該執行緒和該channel繫結)。 執行緒發起IO請求,不管核心是否準備好IO操作,從發起請求起,執行緒一直阻塞,直到操作完成,如圖: NIO中,每個執行緒可以處理多個cha

【圖靈學院15】極致優化-高性能網絡編程之BIONIO區別

ice redis let bject 模型 vao 傳輸 示例 ava 一、Java IO概念 1. 一個http請求節點   數據傳輸 1)網絡傳輸   TCP、UDP 2)通信模型   BIO、NIO、AIO   數據處理 3)應用協議   HTTP、RMI、WEB

BIONIO區別

IO 網路IO、本地IO 網路間的資料傳輸,稱為網路IO 本地磁碟間的資料傳輸,稱為本地IO BIO Blocking IO 阻塞IO 實現原理 伺服器,當每一個請求進來 要接收傳來的資料,都會開啟一個Socket 開啟一個執行緒,來

1、OIONIO程式碼示例比較

傳統socket服務端,程式碼示例 package OIO; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import ja

BIO NIO 區別比較

NIO相較於BIO  有個複用路由器。當NIO建立一個新的連結之後,不會直接連線一個執行緒,而是先連線到複用路由器上。該複用路由器可以連線多個執行緒。而BIO是建立一個新的連線之後,該連線直接連到執行緒之上。這樣BIO客戶端請求越大,伺服器就需要更多的執行緒,伺服器會因此而癱

BIONIO、AIO的區別(轉)

特定 應用 api 請求 對數 bind 成才 io模式 事件分發 IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 一、BIO 在JDK1.4出來之前,我們建立網絡連接的時候采用BIO模式,需要先在服務端啟動一個ServerS

Java NIO:IONIO區別

文件 目的 讀取數據 簡單的 什麽 毫無 log 再處理 很多 一、概念 NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在Java API中提供了

IONIO區別

rom tool div 線程 靈活性 計算 何事 一個 不知道 一、概念 NIO即New IO,這個庫是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但實現方式不同,NIO主要用到的是塊,所以NIO的效率要比IO高很多。在Java API中提供了兩套

BIONIO、AIO的區別

繼續 主動 基於 網絡連接 創建 局限 出現 nio mar IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 一、BIO 在 JDK1.4出來之前,我們建立網絡連接的時候采用BIO模式,需要先在服務端啟動一個ServerSock

IO方式的認知“BIONIO、AIO的區別

同步和異步 返回 對數 阻塞io 簡單 borde ng- 一定的 兩種 轉自:http://blog.csdn.net/skiof007/article/details/52873421 ------------------------------------------

BIONIO、AIO的區別 【轉載】

不堪 ext 開啟 單獨 選擇 調用 visible 解決 react IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、異步非阻塞的AIO。 一、BIO 在JDK1.4出來之前,我們建立網絡連接的時候采用BIO模式,需要先在服務端啟動一個Server

Java中IONIO區別和使用場景

這幾天主要學習了NIO,因為之前對IO使用的也比較多,所以有一個簡單的對比,並且把學習的成果記錄下來。   java.NIO包裡包括三個基本的元件 l buffer:因為NIO是基於緩衝的,所以buffer是最底層的必要類,這也是IO和NIO的根本不同,雖然strea

NIO引入】BIO、AIONIO區別

同步非同步與阻塞非阻塞的區別 1.同步 例:買飯:自己親自去飯館買飯,這就是同步(自己處理IO讀寫) 2.非同步 例:買飯:叫外賣送到家,這就是非同步(IO讀寫委託給OS處理,需要將資料緩衝區地址和大小傳給OS(飯名和地址),OS需要支援非同步IO操作A

JAVA NIO 同步非同步區別

什麼是非阻塞?(為什麼我沒有說什麼是IO,既然你都學到NIO了,,,要是不知道什麼是IO的話我也沒辦法咯..) 這篇文章也是簡單介紹NIO,想要看各類原始碼的同學可以繞道了- - 1 ) 非同步非阻塞例子:(網上看到的比較短小精悍的好例子,直接拿過來了) 老張愛喝茶,廢話

JAVA BIONIO、AIO的區別(這個容易理解)

  IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、非同步非阻塞的AIO。 一、BIO 在JDK1.4出來之前,我們建立網路連線的時候採用BIO模式,需要先在服務端啟動一個ServerSocket,然後在客戶端啟動Socket來對服務端進行通訊,預設情況

JAVA BIONIO、AIO的區別

IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、非同步非阻塞的AIO。 一、BIO      在JDK1.4出來之前,我們建立網路連線的時候採用BIO模式,需要先在服務端啟動一個ServerSocket,然後在客戶端啟動Socket來對服務端進行通訊

IONIO區別,阻塞非阻塞的區別

阻塞概念:應用程式在獲取網路資料的時候,如果網路傳輸資料很慢,那麼程式就一直等著,知道傳輸完畢為止。 非阻塞概念:應用程式直接可以獲取到已經轉備好的資料,無需等待。 IO為同步阻塞形式,NIO為同步非阻塞形式、NIO並沒有實現非同步,在JDK1.7之後,升級

BIONIO、AIO的區別(這個容易理解)

http://blog.csdn.net/skiof007/article/details/52873421  IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、非同步非阻塞的AIO。 一、BIO 在JDK1.4出來之前,我們建立網路連線的時候採用BIO

OIONIO區別

1、OIO中,每個執行緒只能處理一個channel(同步的,該執行緒和該channel繫結,)。 NIO中,每個執行緒可以處理多個channel(非同步)。 那麼OIO如何處理海量連線請求呢?是對每個請求封裝成一個request,然後從執行緒池中挑一個worker執行

BIONIO、AIO的區別(一)

以下內容都是從網上總結而來 java中的IO主要源自於網路和本地檔案   IO的方式通常分為幾種,同步阻塞的BIO、同步非阻塞的NIO、非同步非阻塞的AIO      在JDK1.4出來之前,我們建立網路連線的時候採用BIO模式,需要先在服務端啟動一個Server