首先我們來分清楚同步異步,阻塞非阻塞
同步異步 指的是在客戶端
同步意味着 客戶端提出了一個請求以後,在迴應之前只能等待
異步意味着 客戶端提出一個請求以後,還可以繼續提其他請求
阻塞非阻塞 指的是服務器端
阻塞意味着 服務器接受一個請求後,在返回結果以前不能接受其他請求
非阻塞意味着 服務器接受一個請求後,儘管沒有返回結果,還是可以繼續接受其他請求
BIO: 同步並阻塞,服務器實現模式爲一個連接一個線程
NIO :同步非阻塞,服務器實現模式爲一個請求一個線程
同步IO和異步IO
同步IO:線程啓動一個IO操作然後就立即進入等待狀態,直到IO操作完成後才醒來繼續執行異步IO:線程發送一個IO請求到內核(cpu),然後繼續處理其他的事情,內核完成IO請求後,將會通知線程IO操作完成了。
阻塞IO和非阻塞IO
阻塞IO: 資源不可用時,IO請求一直阻塞,直到反饋結果(有數據或超時)。非阻塞IO:資源不可用時,IO請求離開返回,返回數據標識資源不可用
同步和異步最關鍵的區別:
同步必須等待或者主動的去詢問IO是否完成,而異步是cpu完成後會主動通知應用程序 (BIO) 同步阻塞IO:在此種方式下,用戶進程在發起一個IO操作以後,必須等待IO操作的完成,只有當真正完成了IO操作以後,用戶進程才能運行。JAVA傳統的IO模型屬於此種方式!
異步阻塞IO:此種方式下是指應用發起一個IO操作以後,不等待內核IO操作的完成,IO操作以後會通知應用程序,這其實就是同步和異步最關鍵的區別, 同步必須等待或者主動的去詢問IO是否完成,那麼爲什麼說是阻塞的呢?因爲此時是通過select系統調用來完成的,而select函數本身的實現方式是阻塞的,而採用select函數有個好處就是它可以同時監聽多個文件句柄,從而提高系統的併發性!
(AIO) 異步非阻塞IO:在此種模式下,用戶進程只需要發起一個IO操作然後立即返回,等IO操作真正的完成以後,應用程序會得到IO操作完成的通知,此時用戶進程只需要對數據進行處理就好了,不需要進行實際的IO讀寫操作,因爲真正的IO讀取或者寫入操作已經由內核完成了。