1. 程式人生 > >OIO和NIO的區別

OIO和NIO的區別

1、OIO中,每個執行緒只能處理一個channel(同步的,該執行緒和該channel繫結,)。

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

那麼OIO如何處理海量連線請求呢?是對每個請求封裝成一個request,然後從執行緒池中挑一個worker執行緒專門為此請求服務,如果執行緒池中的執行緒用完了,就對請求進行排隊。請求中如果有讀寫資料,是會阻塞執行緒的

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

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

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

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

     同步非阻塞:

     非同步阻塞:

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

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

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

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


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

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


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