同步IO與異步IO的區別


首先要明確一點:不同IO模型之間的差別本質上是CPU的參與方式

這裏重點說一下各自的應用場景

如何選擇同步還是異步呢?
主要有這麼幾個指標供參考
1. 併發數量
2. 接收字節數
3. 處理請求所需CPU時間
我們一個一個來考察

併發數
併發低的時候同步IO與異步IO差別不大
併發高時差別會比較明顯,這要表現在
1. 開啓線程數:如併發1000時,同步IO要開啓1000個線程,1000個線程要佔用很多內存,這是其一,其二1000個線程間切換的時間也是很可觀的;異步IO則可避免這個問題


接收字節數
接收字節越少被阻塞的概率越低,同步IO與異步IO的差別就越小
接收字節越多被阻塞的概率就越大,異步IO的優勢越明顯,能夠同時服務更多的客戶端請求

處理請求所需CPU時間
與同步異步沒什麼關係


同步阻塞IO
服務端在調用read()時,如果網卡緩衝區中沒有數據則程序停止向下執行,直到網卡緩衝區中有數據。僞代碼如下

Java代碼 複製代碼
  1. Before Blocking   
  2. Read(buffer);//讀不到數據則一直等待   
  3. After blocking  
Before Blocking
Read(buffer);//讀不到數據則一直等待
After blocking



同步的非阻塞IO是這樣的
服務端調用read()後,網卡緩衝區中如果沒有數據可讀就返回
服務器採用循環的方式再去讀取 僞代碼如下

Java代碼 複製代碼
  1. Byte[] buffer = new Byte[1024];   
  2. While(read(buffer)==0){ //read()返回讀到的字節數   
  3.     //todo   
  4. }   
  5. processBuffer(); //處理讀取的數據  
Byte[] buffer = new Byte[1024];
While(read(buffer)==0){ //read()返回讀到的字節數
	//todo
}
processBuffer(); //處理讀取的數據



可以看出CPU大部分被浪費了

 

樓主是不是搞錯了,Java NIO是同步非阻塞,在Linux 2.6以上的內核中,JDK6採用的epoll,如果前提條件不滿足,則是select/poll的模式,都屬於同步非阻塞IO。

異步非阻塞IO
服務端調用read()方法,若網卡緩衝區中無數據則返回,程序繼續向下執行。當緩衝區中有數據時,系統會通知應用程序。
Java nio中的selector可設置爲異步非阻塞IO

發佈了20 篇原創文章 · 獲贊 0 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章