



下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
精選優質文檔-----傾情為你奉上精選優質文檔-----傾情為你奉上專心---專注---專業專心---專注---專業精選優質文檔-----傾情為你奉上專心---專注---專業網易視頻云:從0到1學系統通信——BIO,NIO,AIO的理解(一)網易視頻云是網易公司旗下的視頻云服務產品,以Paas服務模式,向開發者提供音視頻編解碼SDK和開放API,助力APP接入音視頻功能。現在,網易視頻云的技術專家給大家分享一篇技術性文章:從0到1學系統通信——BIO,NIO,AIO的理解。在介紹BIO(BlockingIO),NIO(Non-BlockingIO),AIO(AsynchronousIO)這幾個概念之前,我們先明確這是系統IO的概念,不特定于某種語言。在介紹之前,我們先花點時間弄清楚幾個基本的概念,同步,異步,阻塞,非阻塞。如果已經掌握的可以跳過。編號
名詞
解釋
舉例
1
同步
指的是用戶進程觸發IO操作并等待(阻塞)或者輪詢(非阻塞)的去查看IO操作是否就緒
燒水的時候,一直等待水燒開,別的事情都不做。
2
異步
異步是指用戶進程觸發IO操作以后便開始做自己的事情,而當IO操作已經完成的時候會得到IO完成的通知(異步的特點就是通知)
燒水之后,可以切菜,打掃衛生,等水燒開了發出聲音通知我們再去關火。(使用異步IO時,Java將IO讀寫委托給OS處理,需要將數據緩沖區地址和大小傳給OS)
3
阻塞
所謂阻塞方式的意思是指,當試圖對該文件描述符進行讀寫時,如果當時沒有東西可讀,或者暫時不可寫,程序就進入等待狀態,直到有東西可讀或者可寫為止
去公交站充值,發現這個時候,充值員不在(可能上廁所去了),然后我們就在這里等待,一直等到充值員回來為止。(當然現實社會,可不是這樣,但是在計算機里確實如此。)
4
非阻塞
非阻塞狀態下,如果沒有東西可讀,或者不可寫,讀寫函數馬上返回,而不會等待,
銀行里取款辦業務時,領取一張小票,領取完后我們自己可以玩玩手機,或者與別人聊聊天,當輪我們時,銀行的喇叭會通知,這時候我們就可以去了。
由以上定義可知:1,同步和異步是針對應用程序和內核的交互而言的。2,阻塞和非阻塞是針對于進程在訪問數據的時候,根據IO操作的就緒狀態來采取的不同方式,阻塞方式下讀取或者寫入函數將一直等待,而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。下面我們再來理解組合方式的幾種IO類型BIO同步阻塞IO從程序上來說,就是當發起IO的讀/寫的操作時,均為阻塞方式,只有當讀到了流或將流寫入操作系統后,才會釋放資源。在這個模型中,用戶級別的應用程序執行一個系統調用,這會導致應用程序阻塞。這意味著應用程序會一直阻塞,直到系統調用完成為止(數據傳輸完成或發生錯誤)。調用應用程序處于一種不再消費CPU而只是簡單等待響應的狀態。以read位例,應用程序(application)為了執行這個read操作,會調用相應的一個systemcall,將系統控制權交給kernel,然后就進行等待(這其實就是被阻塞了)。kernel開始執行這個systemcall,執行完畢后會向應用程序返回響應,應用程序得到響應后,就不再阻塞,并進行后面的工作。NIO同步非阻塞IONIO是基于事件驅動思想的,實現上通常采用Reactor模式,從程序角度而言,當發起IO的讀或寫操作時,是非阻塞的;當socket有流可讀或可寫入socket時,操作系統會相應的通知引用程序進行處理,應用再將流讀取到緩沖區或寫入操作系統。對于網絡IO而言,主要有連接建立、流讀取及流寫入三種事件、linux2.6以后的版本使用epoll方式實現NIO。select/epoll的好處就在于單個process就可以同時處理多個網絡連接的IO。然而必須指出的是因為這里需要使用兩個systemcall(select和recvfrom),而blockingIO只調用了一個systemcall(recvfrom),所以某些場景下性能可能還要更差一些。但是,用select/epoll的優勢在于它可以同時處理多個connection。進一步了解select,poll,epoll原理AIO異步IO方式AIO為異步IO方式,同樣基于事件驅動思想,實現上通常采用Proactor模式。從程序的角度而言,與NIO不同,當進行讀寫操作時,只須直接調用API的read或write方法即可。這兩種方法均為異步的,對于讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入read方法的緩沖區,并通知應用程序;對于寫操作而言,當操作系統將write方法傳遞的流寫入完畢時,操作系統主動通知應用程序。較之NIO而言,AIO一方面簡化了程序的編寫,流的讀取和寫入都由操作系統來代替完成;另一方面省去了NIO中程序要遍歷事件通知隊列(selector)的代價。以上幾種通信模型,廣泛應用于各個通信框架中,jdk1.6及之前的版本都只實現BIO和NIO直到jdk1.7開始支持AIO,即NIO2.0。因此目前很多JAVA項目都只停留在NIO,還沒有使用AIO。本章最后再介紹一下JAVAAIO的使用。異步channelAPI提供了兩種方式監控/控制異步操作(connect,accept,read,write等)。1.返回java.util.concurrent.Future對象,檢查Future的狀態可以得到操作是否完成還是失敗,還是進行中,future.get阻塞當前進程。2.為操作提供一個回調參數java.nio.channels.CompletionHandler,這個回調類包含completed,failed兩個方法。channel的每個I/O操作都為這兩種方式提供了相應的方法,你可以根據自己的需要選擇合適的方式編程。下面以一個簡單的例子演示如何使用異步I/O。客戶端連接到服務器后服務器就發送一個當前的時間字符串給客戶端。客戶端毋須發送請求。服務端代碼:importjava.io.IOException;import.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.CharBuffer;importjava.nio.channels.AsynchronousChannelGroup;importjava.nio.channels.AsynchronousServerSocketChannel;importjava.nio.channels.AsynchronousSocketChannel;importjava.nio.channels.CompletionHandler;importjava.nio.charset.Charset;importjava.nio.charset.CharsetEncoder;importjava.util.Date;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.Executors;importjava.util.concurrent.Future;importjava.util.concurrent.TimeUnit;publicclassServer{privatestaticCharsetcharset=Charset.forName("US-ASCII");privatestaticCharsetEncoderencoder=charset.newEncoder();publicstaticvoidmain(String[]args)throwsException{AsynchronousChannelGroupgroup=AsynchronousChannelGroup.withThreadPool(Executors.newFixedThreadPool(4));AsynchronousServerSocketChannelserver=AsynchronousServerSocketChannel.open(group).bind(newInetSocketAddress("",8013));server.accept(null,newCompletionHandler(){@Overridepublicvoidcompleted(AsynchronousSocketChannelresult,Voidattachment){server.accept(null,this);//接受下一個連接try{Stringnow=newDate().toString();ByteBufferbuffer=encoder.encode(CharBuffer.wrap(now+"\r\n"));Futuref=result.write(buffer);//第一種方法f.get();//第一種方法,阻塞住線程System.out.println("senttoclient:"+now);result.close();}catch(IOException|InterruptedException|ExecutionExceptione){e.printStackTrace();}}@Overridepublicvoidfailed(Throwableexc,Voidattachment){exc.printStackTrace();}});group.awaitTermination(Long.MAX_VALUE,TimeUnit.SECONDS);}}客戶端代碼:publicclassClient{publicstaticvoidmain(String[]args)throwsException{AsynchronousSocketChannelclient=AsynchronousSocketChannel.open();Futurefuture=client.connect(newInetSocketAddress("",8013));future.get();ByteBufferbuffer=ByteBuffer.allocate(100);client.read(buffer,null,newCompletionHandler(){//第二種方法,采用回到函數的形式@Overridepublicvoidcompleted(Integerresult,Voidattachment){System.out.println("clientreceived:"+newString(buffer.array()));}@Overridepublicvoidfailed(Throwab
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 參照考試題及答案
- 蹦極運動考試題及答案
- 保安考試題及答案廣州
- 安檢機考試題及答案
- FQC檢驗考試題及答案
- 亞馬遜創業團隊管理制度
- 服務場所衛生管理制度
- 五金廠人員培訓管理制度
- 對司機培訓用車管理制度
- 家庭錄像機設備管理制度
- 醫用耗材采購風險管理工作總結
- 日間手術病房術前宣教
- 高層建筑防火涂料施工標準方案
- 2024年重慶市初中學業水平考試生物試卷含答案
- 胎盤滯留病因介紹
- 機械類中職學業水平考試專業綜合理論考試題庫(含答案)
- 無人機在坦克戰中的火力支援研究-洞察分析
- 四川省樹德中學2025屆高三下學期一模考試數學試題含解析
- 王陽明讀書分享
- 醫院規范腫瘤化療制度
- 2024年銀行考試-銀行間本幣市場交易員資格考試近5年真題集錦(頻考類試題)帶答案
評論
0/150
提交評論