BIO/NIO/AIO編程
- BIO 編程
Blocking IO: 同步阻塞的編程方式。
BIO 編程方式通常是在 JDK1.4 版本之前常用的編程方式。編程實現過程為:首先在服務端啟動一個 ServerSocket 來監聽網絡請求,客戶端啟動 Socket 發起網絡請求,默認情況下ServerSocket 回建立一個線程來處理此請求,如果服務端沒有線程可用,客戶端則會阻塞等待或遭到拒絕。
且建立好的連接,在通訊過程中,是同步的。在并發處理效率上比較低。
同步并阻塞,服務器實現模式為一個連接一個線程,即客戶端有連接請求時服務器端就需要啟動一個線程進行處理,如果這個連接不做任何事情會造成不必要的線程開銷,當然可以通過線程池機制改善。
BIO 方式適用于連接數目比較小且固定的架構,這種方式對服務器資源要求比較高,并發局限于應用中,JDK1.4 以前的唯一選擇,但程序直觀簡單易理解。
使用線程池機制改善后的 BIO 模型圖如下:
- NIO編程
Unblocking IO(New IO): 同步非阻塞的編程方式。
NIO 本身是基于事件驅動思想來完成的,其主要想解決的是 BIO 的大并發問題,NIO 基于 Reactor,當 socket 有流可讀或可寫入 socket 時,操作系統會相應的通知引用程序進行處理,應用再將流讀取到緩沖區或寫入操作系統。也就是說,這個時候,已經不是一個連接就要對應一個處理線程了,而是有效的請求,對應一個線程,當連接沒有數據時,是沒有工作
線程來處理的。
NIO 的最重要的地方是當一個連接創建后,不需要對應一個線程,這個連接會被注冊到多路復用器上面,所以所有的連接只需要一個線程就可以搞定,當這個線程中的多路復用器進行輪詢的時候,發現連接上有請求的話,才開啟一個線程進行處理,也就是一個請求一個線程模式。
在 NIO 的處理方式中,當一個請求來的話,開啟線程進行處理,可能會等待后端應用的資源(JDBC 連接等),其實這個線程就被阻塞了,當并發上來的話,還是會有 BIO 一樣的問題。
同步非阻塞,服務器實現模式為一個請求一個通道,即客戶端發送的連接請求都會注冊到多路復用器上,多路復用器輪詢到連接有 I/O 請求時才啟動一個線程進行處理。
NIO 方式適用于連接數目多且連接比較短(輕操作)的架構,比如聊天服務器,并發局限于應用中,編程復雜,JDK1.4 開始支持。
Buffer:ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloatBuffer,DoubleBuffer 。
Channel:SocketChannel,ServerSocketChannel 。
Selector:Selector,AbstractSelector
SelectionKey:OP_READ,OP_WRITE,OP_CONNECT,OP_ACCEPT
- AIO編程
Asynchronous IO: 異步非阻塞的編程方式
與 NIO 不同,當進行讀寫操作時,只須直接調用 API 的 read 或 write 方法即可。這兩種方法均為異步的,對于讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入 read 方法的緩沖區,并通知應用程序;對于寫操作而言,當操作系統將 write 方法傳遞的流寫入完畢時,操作系統主動通知應用程序。即可以理解為,read/write 方法都是異步的,完成后會主動調用回調函數。在 JDK1.7 中,這部分內容被稱作 NIO.2,主要在Java.nio.channels 包下增加了下面四個異步通道:
AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
AsynchronousDatagramChannel
異步非阻塞,服務器實現模式為一個有效請求一個線程,客戶端的 I/O 請求都是由 OS先完成了再通知服務器應用去啟動線程進行處理。
AIO 方式使用于連接數目多且連接比較長(重操作)的架構,比如相冊服務器,充分調用 OS 參與并發操作,編程比較復雜,JDK7 開始支持
智能推薦
BIO/NIO/AIO
BIO/NIO/AIO 幾個概念 阻塞IO 和非阻塞IO 這兩個概念是程序級別的。主要描述的是程序請求操作系統IO操作后,如果IO資源沒有準備好,那么程序該如何處理的問題:前者等待;后者繼續執行(但是使用線程一直輪詢,直到有 IO資源準備好了)。 同步IO 和 異步IO,這兩個概念是操作系統級別的。主要描述的是操作系統在收到程序請求IO操作后,如果IO資源沒有準備好,該如何響應程序的問題:前者不響...
BIO & NIO & AIO
目錄 1 BIO 2 NIO 3 AIO 1 BIO BIO是同步阻塞模型,其核心是一個客戶端連接對應一個處理線程。實現起來簡單但是吞吐量低,而且客戶端不做讀寫操作的話,服務端會被阻塞(可以做多線程處理)。 BIO的示例代碼如下: 2 NIO NIO是同步非阻塞模型,服務器實現模式為一個線程可以處理多個請求連接,客戶端發送的連接請求都會注冊到多路復用器selector上,多路復用器輪詢到連接有IO...
BIO、NIO、AIO
IO模型 IO模型就是說用什么樣的通道進行數據的發送和接收,Java共支持3種網絡編程IO模式:BIO,NIO,AIO BIO(Blocking IO) 同步阻塞模型,一個客戶端連接對應一個處理線程(可以通過線程池緩解,但不治本) 缺點: 1、IO代碼里read操作是阻塞操作,如果連接不做數據讀寫操作會導致線程阻塞,浪費資源 2、如果線程很多,會導致服務器線程太多,壓力太大。 應用場...
BIO、NIO、AIO
I/O socket 服務端 客戶端 同步 阻塞IO server.accept() socket.getInputStream() 非阻塞IO I/O復用(同步非阻塞) FD(文件描述符) 常見的IO多路復用方式有select、poll、epoll。 BIO(Blocking IO,同步阻塞IO) 傳統的BIO模型 NIO(New IO / Non-blocking IO)同步非阻塞 NIO2 ...
BIO、NIO、AIO
0 同步異步 阻塞非阻塞 同步異步 同步 兩個任務相互依賴,一個任務依賴于另一個任務某種方式執行。 異步 兩個任務完全獨立,一方的執行不需要等待另一方執行 阻塞非阻塞 阻塞 發送一個請求,調用者必須等待結果返回。當前線程被掛起,當條件就緒后繼續 2.非阻塞 發送一個請求,調用者不用等待結果返回,可以做其他事 1 BIO(Blocking IO) 同步阻塞IO模式,數據的讀寫阻塞在一個線程內等待其完...
猜你喜歡
BIO, NIO,AIO
BIO、NIO、AIO概述 1.BIO、NIO與AIO概述 1).BIO:Block(阻塞的) IO——。 【同步、阻塞】 2).NIO:Non-Block(非阻塞的(同步)IO——JDK1.4開始的。 【同步、非阻塞】 3).AIO:Asynchronous(異步-非阻塞)IO——JDK1.7開始 【異步、非阻塞】 2.阻塞...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...