【NIO】之IO和NIO的區別

在Java1.4之前的版本,Java對I/O的支持并不完善,開發人員在開發高性能I/O程序的時候,會面臨以下幾個問題:

1、沒有數據緩存區,I/O性能存在問題

2、沒有C/C++通道的概念,輸入和輸出流是相互獨立的不能復用

3、同步阻塞式I/O通信(BIO),造成線程資源被長時間阻塞(致命缺陷)

4、硬件可移植性差,支持的字符集編碼有限

根據UNIX網絡編程的概念,I/O模型有五種

詳情請查看這篇文章

UNIX五種網絡I/O模型

在沒有JavaNIO之前呢,基于Java的所有的所有的Socket通信都采用了同步阻塞式模型(BIO)這種請求<->應答的通信模式降低了開發難度,但是在性能和可靠性方面存在巨大缺陷,因此大型應用服務器都是C/C++語言開發,因為他們可以直接操作系統提供的異步的I/O或者是AIO能力。當并發訪問量增大,響應時間延遲增大之后,采用JavaBIO開發的服務器只能通過硬件擴容來滿足高并發和低延時,極大增加了企業成本。

正是由于JavaBIO的不足,Java1.4版本之后提供了新的NIO庫,支持非阻塞式I/O操作。

JavaNIO提供了很多的異步I/O開發和API類庫,主要的類和接口如下:

進行異步I/O操作的緩存區ByteBuffer

進行異步I/O操作的管道Pipe

進行各種I/O操作(異步或者同步)的Channel,包括ServerSocketChannel和SocketChannel

多種字符集編碼能力和解碼能力

實現非阻塞I/O操作的選擇器Selector

基于流行Perl實現的正則表達式庫

?

?了解NIO必須先了解幾個概念

什么是同步
什么是異步
什么是阻塞
什么是非阻塞
什么是同步阻塞
什么是同步非阻塞
什么是異步阻塞
什么是異步非阻塞

?

?

?

?

?

?

?

?

技術語言解釋:

?同步:當一個進程去訪問另一個進程時,必須得到一個結果(指的是用戶進程觸發IO操作并等待或者輪詢的去查看IO操作是否就緒)

異步:當一個進行訪問另一個進程時時,不用立刻給結果,我會告訴你一個信息,你把結果放在這里,通知我即可(異步I/O就是Java將I/O讀寫操作委托給操作系統,告訴操作系統將數據放到哪個緩存區,數據大小)

阻塞:當一個進程去操作某個資源時發現這個資源不在或者暫時不可操作,那么這個進程就一直等,等可以操作

非阻塞:當進程發現沒有資源可操作的時候立刻返回讀寫函數,而不會等待

生活中的例子:

同步:比如電話好友,那么無論打通還是打不通,都會得到回應,(用戶接通了,用戶正在通話,用戶已關機等信息)

異步:比如叫餐,我們APP下單之后就可以做其他的事情,你只需要告訴地址,電話,食物到了送餐員會打電話通知你

阻塞:比如收費站堵車,這個就最能代表阻塞,你只能等著啥干不了

非阻塞:比如到銀行排隊辦理業務,那么我們會拿一張排號小票,就可以去做其他事情,到號就會叫你!

網上有一個例子

同步阻塞:到飯店吃飯點餐,在那里等著不停的問,菜好了嗎?菜好了嗎?

同步非阻塞:點完餐,直接去打球,不過你需要隔一段時間來問一次,菜好了嗎?

異步阻塞:菜做好飯店打電話給你讓你親自去拿。

異步非阻塞:菜做好,飯店直接送到球場

所以我們歸納:

同步和異步是針對應用程序和內核的交互而言的,

1、同步指的是用戶進程觸發I/O操作并等待或者輪詢的去查看I/O操作是否就緒,

2、異步是指用戶進程觸發I/O操作以后便開始做自己的事情,而當I/O操作已經完成的時候會得到I/O完成的通知。

阻塞和非阻塞是針對于進程在訪問數據的時候,根據I/O操作的就緒狀態來采取的不同方式,說白了是一種讀取或者寫入操作函數的實現方式,

1、阻塞方式下讀取或者寫入函數將一直等待

2、而非阻塞方式下,讀取或者寫入函數會立即返回一個狀態值。?

所以,I/O操作可以分為3類:同步阻塞(即早期的I/O操作)、同步非阻塞(NIO)、異步(AIO)。?

?

BIO

在JDK1.4之前,用Java編寫網絡請求,都是建立一個ServerSocket,然后,客戶端建立Socket時就會詢問是否有線程可以處理,如果沒有,要么等待,要么被拒絕。即:一個連接,要求Server對應一個處理線程。

NIO

在Java里的由來,在JDK1.4及以后版本中提供了一套API來專門操作非阻塞I/O,我們可以在java.nio包及其子包中找到相關的類和接口。由于這套API是JDK新提供的I/O API,因此,也叫New I/O,這就是包名nio的由來。這套API由三個主要的部分組成:緩沖區(Buffers)、通道(Channels)和非阻塞I/O的核心類組成。在理解NIO的時候,需要區分,說的是New I/O還是非阻塞IO,New I/O是Java的包,NIO是非阻塞IO概念。這里講的是后面一種。

NIO本身是基于事件驅動思想來完成的,其主要想解決的是BIO的大并發問題: 在使用同步I/O的網絡應用中,如果要同時處理多個客戶端請求,或是在客戶端要同時和多個服務器進行通訊,就必須使用多線程來處理。也就是說,將每一個客戶端請求分配給一個線程來單獨處理。這樣做雖然可以達到我們的要求,但同時又會帶來另外一個問題。由于每創建一個線程,就要為這個線程分配一定的內存空間(也叫工作存儲器),而且操作系統本身也對線程的總數有一定的限制。如果客戶端的請求過多,服務端程序可能會因為不堪重負而拒絕客戶端的請求,甚至服務器可能會因此而癱瘓。

NIO基于Reactor,當socket有流可讀或可寫入socket時,操作系統會相應的通知引用程序進行處理,應用再將流讀取到緩沖區或寫入操作系統。
也就是說,這個時候,已經不是一個連接就要對應一個處理線程了,而是有效的請求,對應一個線程,當連接沒有數據時,是沒有工作線程來處理的。

AIO

與NIO不同,當進行讀寫操作時,只須直接調用API的read或write方法即可。這兩種方法均為異步的,對于讀操作而言,當有流可讀取時,操作系統會將可讀的流傳入read方法的緩沖區,并通知應用程序;對于寫操作而言,當操作系統將write方法傳遞的流寫入完畢時,操作系統主動通知應用程序。
即可以理解為,read/write方法都是異步的,完成后會主動調用回調函數。
在JDK1.7中,這部分內容被稱作NIO.2,主要在java.nio.channels包下增加了下面四個異步通道:

AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
AsynchronousDatagramChannel
其中的read/write方法,會返回一個帶回調函數的對象,當執行完讀取/寫入操作后,直接調用回調函數。

?

轉載于:https://www.cnblogs.com/gyjx2016/p/7219983.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371663.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mono環境下訪問SSL

由于MONO沒有CA證書&#xff0c;所以訪問SSL鏈接&#xff08;HTTPS&#xff09;就會出錯&#xff0c;這時候只要強制訪問就可以。 using System.Net.Security;using System.Security.Authentication;using System.Security.Cryptography.X509Certificates; private static bool…

JavaOne 2012:使用HTML5和Java構建移動應用程序

我返回了Parc 55 &#xff08;任務會議室&#xff09;&#xff0c;觀看Max Katz的&#xff08; Exadel開發人員關系&#xff09;“用HTML5和Java構建移動應用程序” Bird-of-Feather&#xff08;BoF&#xff09;演示。 具體來說&#xff0c;Katz在Tiggzi &#xff08;基于云的應…

HDU 2602.Bone Collector-動態規劃0-1背包

Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 85530 Accepted Submission(s): 35381 Problem DescriptionMany years ago , in Teddy’s hometown there was a man who was called “Bone Col…

java線程實現排序_【多線程實現快速排序】

快速排序算法實現文件QuickSort.javapackage quick.sort;import java.util.concurrent.Callable;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class QuickSort implements Callable{private int[] array;private final in…

使用Gitolite搭建Gitserver

Gitolite是一款Perl語言開發的Git服務管理工具。通過公鑰對用戶進行認證。并可以通過配置文件對些操作進行基于分支和路徑的精細控制。Gitolite採用的是SSH協議而且使用SSH公鑰認證。因此不管是管理員還是普通用戶。都須要對SSH有所了解。Gitolite的官網是&#xff1a;https://…

java任務分支和合并_合并/分支戰略

我會給出與Adarsh Shah相同的建議&#xff0c;因為在大多數情況下&#xff0c;2個分支(MAIN&#xff0c;RELEASE)就足夠了&#xff0c;并且使用feature branches用于你不想立即提交到MAIN的東西&#xff0c;因為它需要一段時間才能完全準備好測試 . 通過RELEASE&#xff0c;我指…

Spring安全:防止暴力攻擊

Spring Security可以為您做很多事情。 帳戶被封鎖&#xff0c;密碼鹽。 但是蠻力阻斷劑呢&#xff1f; 那是你必須自己做的。 幸運的是&#xff0c;Spring是一個非常靈活的框架&#xff0c;因此對其進行配置并不是什么大問題。 讓我向您展示一些如何針對Grails應用程序執行…

NopCommerce計劃任務

NopCommerce計劃任務轉載于:https://www.cnblogs.com/chenjz/p/6293210.html

簡單談談js中的MVC

MVC是什么&#xff1f; MVC是一種架構模式&#xff0c;它將應用抽象為3個部分&#xff1a;模型&#xff08;數據&#xff09;、視圖、控制器&#xff08;分發器&#xff09;。 本文將用一個經典的例子todoList來展開&#xff08;代碼在最后&#xff09;。 一個事件發生的過程&a…

BTrace:Java開發人員工具箱中的隱藏寶石

這篇文章是關于BTrace的 &#xff0c;我正在考慮將其作為Java開發人員的隱藏寶藏。 BTrace是用于Java平臺的安全&#xff0c;動態跟蹤工具。 BTrace可用于動態跟蹤正在運行的Java程序&#xff08;類似于DTrace&#xff0c;適用于OpenSolaris應用程序和OS&#xff09;。 不久&am…

python 圖片轉視頻ffmpeg_python圖片轉視頻(opencv),ffmpeg壓縮視頻

要注意&#xff1a;1. 圖片傳視頻要自己設置幀率和分辨率2.讀取圖片后分辨率要resize為和視頻分辨率一樣才可以3.寫完.avi視頻后視頻比較大&#xff0c;用ffmpeg將avi視頻壓縮為mp4import cv2from cv2 import VideoWriter, VideoWriter_fourcc, imread, resizeimport osfrom su…

門面模式

門面模式的定義 門面模式&#xff08;Facade Pattern&#xff09;也叫做外觀模式&#xff0c;是一種比較常用的封裝模式&#xff0c;其定義如 下&#xff1a; Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface tha…

Mysql數據庫申請

前段時間大部門下新成立了一個推廣百度OCR、文字識別、圖像識別等科技能力在金融領域應用的子部門。因為部門剛成立&#xff0c;基礎設施和人力都是欠缺的。當時分到我們部門的任務是抽調一個人做新部門主站前端開發工作。本來說的是只負責頁面的開發工作。當我參加過需求品審會…

Spring–添加SpringMVC –第2部分

在上一部分中&#xff0c;我們為經理和員工實現了控制器。 既然我們知道了解決方法&#xff0c;我們將做很少&#xff08;但僅做很少&#xff09;更復雜的事情–任務和時間表的控制器。 因此&#xff0c;讓我們從org.timesheet.web開始。 TaskController 。 首先創建一個類&…

php 正則分隔_探討PHP函數split()如何使用正則表達式切割字符串

對于初學者來說&#xff0c;掌握PHP中常用函數的用法&#xff0c;是其繼續學習的基礎。今天我們就為大家詳細介紹有關PHP函數split()的一些使用方法&#xff0c;希望大家能通過這篇文章介紹的內容增加自己的知識庫。說明array split ( string $pattern, string $string [, int …

通用的ProtostuffSerializer for Java

以前使用 protobuf或protostuff的時候覺得很麻煩&#xff0c;每個類都要單獨定制&#xff0c;于是封裝了一個類。 同事測試過&#xff0c;性能和壓縮率都很好&#xff0c;尤其是相比json的序列化。 需注意&#xff1a;只支持Pojo類&#xff08;即需要有get/set方法&#xff09;…

SAS筆記(6) PROC MEANS和PROC FREQ

PROC MEANS和PRC FREQ在做描述性分析的時候很常用&#xff0c;用法也比較簡單&#xff0c;不過這兩個過程步的某些選項容易忘記&#xff0c;本文就梳理一下。 在進入正文前&#xff0c;我們先創建所需的數據集TEST_SCORES&#xff1a; DATA TEST_SCORES; INPUT COUNTY : $9. SC…

休眠:保存vs持久并保存或更新

save和saveOrUpdate之間的區別是什么或save和persist之間的區別是任何Hibernate面試中常見的面試問題&#xff0c;就像Hibernate中get和load方法之間的區別一樣。 Hibernate Session類提供了幾種通過save &#xff0c; saveOrUpdate和persist等方法將對象保存到數據庫中的方法。…

php搜索數據庫設計,PHP數據庫搜索功能設計

其實搜索功能的設計很簡單&#xff0c;幾行代碼就可以完成。下面是form表單。從表單發出的數據名為search&#xff0c;然后發送到../admin/article_SearchResult.php這個文件處理。下面講下article_SearchResult.php這個文件如何實現搜索。$searchs $_POST[‘search‘];?>…

2016 Android Top 10 Library

過去的 2016 年&#xff0c;開源社區異常活躍&#xff0c;很多個人與公司爭相開源自己的項目&#xff0c;讓人眼花繚亂&#xff0c;然而有些項目只是曇花一現&#xff0c;有些項目卻持久創造價值&#xff0c;為開發者提供了極大的便利&#xff0c;這些終究由時間來判斷。今天&a…