JavaIO認識

Unix網絡編程模型

Linux的內核 將所有外部設備都看做一個文件來操作,對一個文件的讀寫操作會調用內核提供的系統命令,返回一個fd。
1、阻塞I/O模型:所有文件操作都是阻塞的,系統調用直到數據包到達且被復制到應用程序的緩沖區或者發送錯誤,才會返回。在此期間一直會等待,進程在調用recvfrom開始到它返回的整段時間都是被阻塞的 。
2、非阻塞I/O模型:recvfrom從應用層到內核的時候,如果該緩沖區沒有數據,就直接返回一個錯誤,然后進行輪訓檢查這個狀態,看內核是否有數據準備好到來。
3、I/O復用模型:Linux提供select/poll,進程通過將一個或多個 fd【文件描述符】傳遞 給select或者poll系統調用,阻塞在select操作上,這樣select/poll可以幫我們偵測多個fd是否處于就緒狀態。select/poll是順序掃描fd是否就緒,而且支持的fd數量有限。而linux另一中系統調用epoll使用基于事件驅動方式代替順序 掃描,因此性能更高。當有fd就緒時,立即回調函數 rollback。
4、信號驅動I/O模型:首先開啟套接口信號驅動I/O功能,并通過系統調用sigaction執行一個信號處理函數(此系統調用立即返回,進程繼續工作,他是非阻塞的 ),當數據準備就緒時,就為改進行生成一個SIGNIO信號,通過信號回調通知應用程序調用recvfrom來讀取數據,并通知主循環函數處理數據。
5、異步I/O:告知內核啟動某個操作,并讓內核在整個操作完成后(包括將數據從內核復制到用戶自己的緩沖區)通知我們。這種模型與信號驅動的區別是:信號驅動I/O由內核通知我們何時開始一個I/O操作,異步I/O模型由內核通知我們I/O操作何時已經完成

Java的I/O演進

在JDK1.4推出JavaNIO之前,基于Java的所有Socket通信都采用了同步阻塞模式(BIO)

偽異步I/O編程

為了解決同步阻塞I/O面臨的一個鏈路需要一個線程處理的問題,使用線程池處理接收I/O請求。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容