1. 程式人生 > >IO 與 NIO

IO 與 NIO

回調函數 tail 網絡數 epo 技術 判斷 比較 模型 article

阻塞概念:應用程序在獲取網絡數據的時候,如果網絡傳輸數據很慢,那麽程序就一直等著,知道傳輸完畢為止。

非阻塞概念:應用程序直接可以獲取到已經轉備好的數據,無需等待。

IO為同步阻塞形式,NIO為同步非阻塞形式、NIO並沒有實現異步,在JDK1.7之後,升級了NIO庫包,支持異步阻塞通信模型即NIO2.0(AIO)

同步與異步: 同步與異步一般是面向操作系統和應用程序對IO操作的層面上來區別的。

同步時:應用程序(代碼)會直接參與IO讀寫操作,並且我們的應用程序會直接阻塞到某一個方法上,直到數據準備就緒;或者采用輪詢的策略實時檢查數據的就緒狀態,如果就緒則獲取數據。

已不是,則所有的IO讀寫操作交給操作系統處理,與我們的應用程序沒有直接關系,我們的程序不需要關系IO讀寫,當操作系統完成IO讀寫操作時,會給我們應用程序發送通知,我們的應用程序直接拿走數據即可。

同步說的是server服務器的執行方式;阻塞說的是具體的技術,接受數據方式、狀態(IO、NIO)

阻塞 / 非阻塞描述的是函數,指訪問某個函數時是否會阻塞線程(block,線程進入阻塞狀態)。

同步 /異步描述的是執行IO操作的主體是誰,同步是由用戶進程自己去執行最終的IO操作。異步是用戶進程自己不關系實際IO操作的過程,只需要由內核在IO完成後通知它既可,由內核進程來執行最終的IO操作。

這兩組概念交集在一起參生的非阻塞同步IO和非阻塞異步IO的概念就不難理解。

非阻塞同步IO指的是用戶調用讀寫方法是不阻塞的,立刻返回的,而且需要用戶線程來檢查IO狀態。需要註意的是,如果發現有可以操作的IO,那麽實際用戶進程還是會阻塞等待內核復制數據到用戶進程,它與同步阻塞IO的區別是後者全程等待。

非阻塞異步IO指的是用戶調用讀寫方法是不阻塞的,立刻返回,而且用戶不需要關註讀寫,只需要提供回調操作,內核線程在完成讀寫後回調用戶提供的callback。

這兩個概念的不同造成了編程模型的不同。

非阻塞同步IO由於讀寫方法非阻塞,並且需要用戶自己來進行讀寫,所以每次調用讀寫方法實際讀寫的字節數是不確定的,所以需要一個Buffer來保存每次讀寫的字節狀態。更重要的是用戶不知道什麽時候完成了讀寫,一般需要用while循環判斷Buffer的狀態來跟蹤讀寫。

非阻塞異步IO由於是內核線程進行讀寫,並且在IO完成後會回調用戶提供的callback,編程模型就比較簡單,用戶只需要調用讀寫,提供回調就可以了,比如 read(filename, callback)

select / poll / epoll 從本質上說都是非阻塞同步IO,select會收到IO就緒的狀態,然後通知用戶去處理IO,實際的IO操作還需要用戶等待內核復制操作。

要理解IO就緒和完成的區別。就緒指的是還需要用戶自己去處理,完成指的是內核幫助完成了,用戶不用關心IO過程,只需要提供回調函數。

理解了非阻塞同步IO和非阻塞異步IO的區別之後,就不難理解Java NIO的設計了。NIO是圍繞ByteBuffer來進行讀寫的,ByteBuffer是一個緩沖區,用來記錄讀寫的狀態,通過多次檢查ByteBuffer的狀態來確定IO是否完成。

Java 1.7的NIO2.0 引入了非阻塞異步IO的概念,編程模型大大簡化了。用戶只需要關註回調函數即可。
---------------------
作者:趙盡朝
來源:CSDN
原文:https://blog.csdn.net/z15732621582/article/details/78939122
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

IO 與 NIO