自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從操作系統(tǒng)的IO模型入手,全面搞懂Java的IO實(shí)現(xiàn),告別懵圈

系統(tǒng) 其他OS
無論是讀還是寫都需要調(diào)用底層系統(tǒng)的功能,read讀取數(shù)據(jù),并不是把數(shù)據(jù)直接從物理設(shè)備讀到內(nèi)存。write寫入數(shù)據(jù),也不是直接把數(shù)據(jù)寫入到物理設(shè)備。

最近正好不知道寫什么,有粉絲朋友私信說對(duì)IO這塊迷迷糊糊的,面試也說不好,所以決定做一系列的IO內(nèi)容,這是第一篇,先來輸出一波理論,后邊再根據(jù)不同的IO模型使用不同的API實(shí)現(xiàn)一下,看看區(qū)別,再說一說常用的中間件的IO是怎么實(shí)現(xiàn)的,本章主要包含:

  • 什么是IO,只是文件的讀和寫嗎?
  • IO在計(jì)算機(jī)中都是怎么實(shí)現(xiàn)的,原理是什么
  • Java作為一個(gè)跨平臺(tái)語言,提供了哪些IO模型屏蔽對(duì)底層系統(tǒng)細(xì)節(jié)

講道理這篇文章寫完自己也是頗有收獲,建議收藏反復(fù)觀看,不錯(cuò)的話記得【三連】哦

IO是什么

計(jì)算機(jī)的IO可以淺顯的理解為輸入【Input】和輸出【Output】,通過IO描述數(shù)據(jù)的流動(dòng)傳輸,在Java技術(shù)棧中IO更是基礎(chǔ),如硬盤上的文件讀寫需要用到磁盤IO,通過Tomcat處理網(wǎng)絡(luò)請(qǐng)求需要設(shè)計(jì)網(wǎng)絡(luò)IO,真是由于種類繁多的IO,很多小伙伴迷迷糊糊的,剛接觸Java時(shí)我也如此,其實(shí)IO并不僅僅是文件的讀寫,Socket【通信】也存在IO操作

無論是Socket的讀寫還是文件的讀寫,在Java層面的應(yīng)用開發(fā)或者是系統(tǒng)底層開發(fā),都屬于輸入input和輸出output的處理,簡稱為IO讀寫。在原理上和處理流程上,都是一致的。區(qū)別在于參數(shù)的不同。

用戶程序?qū)ξ募M(jìn)行IO的讀寫,基本上會(huì)用到read&write兩大系統(tǒng)調(diào)用??赡懿煌僮飨到y(tǒng)【如windows和Linux系統(tǒng)具體的處理不同】,名稱和實(shí)現(xiàn)方式不同,但是功能是一樣的。

IO實(shí)現(xiàn)原理

無論是讀還是寫都需要調(diào)用底層系統(tǒng)的功能,read讀取數(shù)據(jù),并不是把數(shù)據(jù)直接從物理設(shè)備讀到內(nèi)存。write寫入數(shù)據(jù),也不是直接把數(shù)據(jù)寫入到物理設(shè)備。

read系統(tǒng)調(diào)用:是把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到進(jìn)程緩沖區(qū);

write系統(tǒng)調(diào)用:是把數(shù)據(jù)從進(jìn)程緩沖區(qū)復(fù)制到內(nèi)核緩沖區(qū)。

這個(gè)兩個(gè)系統(tǒng)調(diào)用,都不負(fù)責(zé)數(shù)據(jù)在內(nèi)核緩沖區(qū)和磁盤之間的交換。真正與硬件交互的是由操作系統(tǒng)kernel內(nèi)核完成,需要通過操作系統(tǒng)實(shí)現(xiàn)數(shù)據(jù)的讀寫

內(nèi)核緩沖與進(jìn)程緩沖區(qū)

緩沖區(qū)的目的,是為了減少頻繁的系統(tǒng)IO調(diào)用。系統(tǒng)調(diào)用需要保存之前的進(jìn)程數(shù)據(jù)和狀態(tài)等信息【比如讀文件時(shí)需要知道已經(jīng)讀了多少數(shù)據(jù)啦,不要重復(fù)讀取】,而結(jié)束調(diào)用之后回來還需要恢復(fù)之前的信息,為了減少這種損耗時(shí)間、也損耗性能的系統(tǒng)調(diào)用,于是出現(xiàn)了緩沖區(qū)。

有了緩沖區(qū),操作系統(tǒng)使用read函數(shù)把數(shù)據(jù)從內(nèi)核緩沖區(qū)復(fù)制到進(jìn)程緩沖區(qū),write把數(shù)據(jù)從進(jìn)程緩沖區(qū)復(fù)制到內(nèi)核緩沖區(qū)中。等待緩沖區(qū)達(dá)到一定數(shù)量的時(shí)候,再進(jìn)行IO的調(diào)用,提升性能。至于什么時(shí)候讀取和存儲(chǔ)則由內(nèi)核來決定,用戶程序不需要關(guān)心。

在linux系統(tǒng)中,系統(tǒng)內(nèi)核也有個(gè)緩沖區(qū)叫做內(nèi)核緩沖區(qū)。每個(gè)進(jìn)程有自己獨(dú)立的緩沖區(qū),叫做進(jìn)程緩沖區(qū)。

所以,用戶程序的IO讀寫程序,大多數(shù)情況下,并沒有進(jìn)行實(shí)際的IO操作,而是在讀寫自己的進(jìn)程緩沖區(qū)。

就好比村民需要到村中心水房挑水倒入自家的水缸中滿足正常生活用水需求,如果拿水瓢得一直跑來跑去,效率極低,搞個(gè)水桶當(dāng)做緩沖區(qū),每次用水瓢把水桶盛滿【緩沖區(qū)到達(dá)極限】,再拎著水桶回家將水倒入水缸【系統(tǒng)內(nèi)核】

BIO【Blocking IO】

在linux系統(tǒng)的Java進(jìn)程中,默認(rèn)情況下所有的socket都是blocking IO。是一種阻塞式 I/O 模型,應(yīng)用程序從系統(tǒng)開始執(zhí)行IO,一直到系統(tǒng)結(jié)束調(diào)用返回,這段時(shí)間是阻塞的。返回成功后,應(yīng)用進(jìn)程開始處理用戶空間的緩存數(shù)據(jù)

發(fā)起一個(gè)blocking socket的read讀操作系統(tǒng)調(diào)用,流程大概是這樣:

1、當(dāng)用戶線程調(diào)用read,內(nèi)核(kernel)就開始了IO的第一個(gè)階段:準(zhǔn)備數(shù)據(jù)。很多時(shí)候,數(shù)據(jù)在一開始還沒有到達(dá)(比如,還沒有收到一個(gè)完整的Socket數(shù)據(jù)包),這個(gè)時(shí)候kernel就要等待足夠的數(shù)據(jù)到來;

2、當(dāng)kernel一直等到數(shù)據(jù)準(zhǔn)備好了,它就會(huì)將數(shù)據(jù)從kernel內(nèi)核緩沖區(qū),拷貝到用戶緩沖區(qū)(用戶內(nèi)存),然后kernel返回結(jié)果;

3、從開始IO讀的read系統(tǒng)調(diào)用開始,用戶線程就進(jìn)入阻塞狀態(tài)。一直到kernel返回結(jié)果后,用戶線程才解除block的狀態(tài),重新運(yùn)行起來;

所以,blocking IO的特點(diǎn)就是在內(nèi)核進(jìn)行IO執(zhí)行的兩個(gè)階段,用戶線程都被阻塞。

BIO的優(yōu)點(diǎn):程序簡單,在阻塞等待數(shù)據(jù)期間,用戶線程掛起。用戶線程基本不會(huì)占用 CPU 資源。

BIO的缺點(diǎn):一般情況下,會(huì)為每個(gè)連接配套一條獨(dú)立線程,或者說一條線程維護(hù)一個(gè)連接成功的IO流的讀寫。在并發(fā)量小的情況下沒有什么問題。但是,當(dāng)在高并發(fā)的場(chǎng)景下,需要大量的線程來維護(hù)大量的網(wǎng)絡(luò)連接,內(nèi)存、線程切換開銷會(huì)非常巨大。因此,BIO模型在高并發(fā)場(chǎng)景下基本不可用

NIO【non-blocking IO】

在linux系統(tǒng)下,可以通過設(shè)置socket使其變?yōu)閚on-blocking。NIO模型中應(yīng)用程序一旦開始IO調(diào)用,會(huì)出現(xiàn)以下兩種情況:

1、在內(nèi)核緩沖區(qū)沒有數(shù)據(jù)的情況下,系統(tǒng)調(diào)用會(huì)立即返回,返回一個(gè)調(diào)用失敗的信息。

2、在內(nèi)核緩沖區(qū)有數(shù)據(jù)的情況下,是阻塞的,直到數(shù)據(jù)從內(nèi)核緩沖復(fù)制到用戶進(jìn)程緩沖。復(fù)制完成后,系統(tǒng)調(diào)用返回成功,應(yīng)用進(jìn)程開始處理用戶空間的緩存數(shù)據(jù)。

發(fā)起一個(gè)non-blocking socket的read讀操作系統(tǒng)調(diào)用,流程是這個(gè)樣子:

1、在內(nèi)核數(shù)據(jù)沒有準(zhǔn)備好的階段,用戶線程發(fā)起IO請(qǐng)求時(shí),立即返回。用戶線程需要不斷地發(fā)起IO系統(tǒng)調(diào)用;

2、內(nèi)核數(shù)據(jù)到達(dá)后,用戶線程發(fā)起系統(tǒng)調(diào)用,用戶線程阻塞。內(nèi)核開始復(fù)制數(shù)據(jù)。它就會(huì)將數(shù)據(jù)從kernel內(nèi)核緩沖區(qū),拷貝到用戶緩沖區(qū)(用戶內(nèi)存),然后kernel返回結(jié)果;

3、用戶線程才解除block的狀態(tài),重新運(yùn)行起來。經(jīng)過多次的嘗試,用戶線程終于真正讀取到數(shù)據(jù),繼續(xù)執(zhí)行。

NIO的特點(diǎn):應(yīng)用程序的線程需要不斷的進(jìn)行 I/O 系統(tǒng)調(diào)用,輪詢判斷數(shù)據(jù)是否已經(jīng)準(zhǔn)備好,如果沒有準(zhǔn)備好,繼續(xù)輪詢,直到完成系統(tǒng)調(diào)用為止。

NIO的優(yōu)點(diǎn):每次發(fā)起的 IO 系統(tǒng)調(diào)用,在內(nèi)核的等待數(shù)據(jù)過程中可以立即返回。用戶線程不會(huì)阻塞,實(shí)時(shí)性較好。

NIO的缺點(diǎn):需要不斷的重復(fù)發(fā)起IO系統(tǒng)調(diào)用,這種不斷的輪詢,將會(huì)不斷地詢問內(nèi)核,這將占用大量的 CPU 時(shí)間,系統(tǒng)資源利用率較低。

總之,這種NIO模型在高并發(fā)場(chǎng)景下也是不可用的。一般 Web 服務(wù)器不使用這種 IO 模型。而是在其他IO模型中使用非阻塞IO這一特性。Java的實(shí)際開發(fā)中,也不會(huì)涉及這種IO模型。

注意:Java NIO【New IO】 不是IO模型中的NIO模型,而是另外的一種模型,叫做IO多路復(fù)用模型【IO multiplexing 】。

IO多路復(fù)用模型【I/O multiplexing】

如何避免同步非阻塞NIO模型中輪詢等待的問題呢?這就是IO多路復(fù)用模型。也就是Java NIO的實(shí)現(xiàn)模型

IO多路復(fù)用模型,就是一個(gè)進(jìn)程可以監(jiān)視多個(gè)文件描述符,一旦某個(gè)描述符就緒【一般是內(nèi)核緩沖區(qū)可讀/可寫】,內(nèi)核kernel能夠通知程序進(jìn)行相應(yīng)的IO系統(tǒng)調(diào)用。

目前支持IO多路復(fù)用的系統(tǒng)調(diào)用,有 select,epoll等等。select系統(tǒng)調(diào)用,是目前幾乎在所有的操作系統(tǒng)上都有支持,具有良好跨平臺(tái)特性。epoll是在linux 2.6內(nèi)核中提出的,是select系統(tǒng)調(diào)用的linux增強(qiáng)版本。

IO多路復(fù)用模型的基本原理就是select/epoll系統(tǒng)調(diào)用,單個(gè)線程不斷的輪詢select/epoll系統(tǒng)調(diào)用所負(fù)責(zé)的成百上千的socket連接,當(dāng)某個(gè)或者某些socket網(wǎng)絡(luò)連接有數(shù)據(jù)到達(dá)了,就返回這些可以讀寫的連接。因此,好處就是通過一次select/epoll系統(tǒng)調(diào)用,就查詢到到可以讀寫的一個(gè)甚至是成百上千的網(wǎng)絡(luò)連接。

發(fā)起一個(gè)多路復(fù)用IO的的read讀操作系統(tǒng)調(diào)用,流程是這個(gè)樣子:

在這種模式中,首先不是進(jìn)行read系統(tǒng)調(diào)動(dòng),而是進(jìn)行select/epoll系統(tǒng)調(diào)用。當(dāng)然,這里有一個(gè)前提,需要將目標(biāo)網(wǎng)絡(luò)連接,提前注冊(cè)到select/epoll的可查詢socket列表中。然后,才可以開啟整個(gè)的IO多路復(fù)用模型的讀流程。

1、進(jìn)行select/epoll系統(tǒng)調(diào)用,查詢可以讀的連接。kernel會(huì)查詢所有select的可查詢socket列表,當(dāng)任何一個(gè)socket中的數(shù)據(jù)準(zhǔn)備好了,select就會(huì)返回。當(dāng)用戶進(jìn)程調(diào)用了select,那么整個(gè)線程會(huì)被阻塞掉;

2、用戶線程獲得了目標(biāo)連接后,發(fā)起read系統(tǒng)調(diào)用,用戶線程阻塞,內(nèi)核開始復(fù)制數(shù)據(jù),它就會(huì)將數(shù)據(jù)從kernel內(nèi)核緩沖區(qū),拷貝到用戶緩沖區(qū)【用戶內(nèi)存】,然后kernel返回結(jié)果;

3、用戶線程解除阻塞狀態(tài),用戶線程終于真正讀取到數(shù)據(jù),繼續(xù)執(zhí)行。

多路復(fù)用IO的特點(diǎn):IO多路復(fù)用模型,建立在操作系統(tǒng)kernel內(nèi)核能夠提供的多路分離系統(tǒng)調(diào)用select/epoll基礎(chǔ)之上的。多路復(fù)用IO需要用到兩個(gè)系統(tǒng)調(diào)用【system call】, 一個(gè)select/epoll查詢調(diào)用,一個(gè)是IO的讀取調(diào)用。

和NIO模型相似,多路復(fù)用IO需要輪詢。負(fù)責(zé)select/epoll查詢調(diào)用的線程,需要不斷的進(jìn)行select/epoll輪詢,查找出可以進(jìn)行IO操作的連接。

另外,多路復(fù)用IO模型與前面的NIO模型,是有關(guān)系的。對(duì)于每一個(gè)可以查詢的socket,一般都設(shè)置成為non-blocking模型。只是這一點(diǎn),對(duì)于用戶程序是透明的。

多路復(fù)用IO的優(yōu)點(diǎn):用select/epoll的優(yōu)勢(shì)在于,它可以同時(shí)處理成千上萬個(gè)連接。與一條線程維護(hù)一個(gè)連接相比,I/O多路復(fù)用技術(shù)的最大優(yōu)勢(shì)是:系統(tǒng)不必創(chuàng)建線程,也不必維護(hù)這些線程,從而大大減小了系統(tǒng)的開銷。

Java的NIO技術(shù),使用的就是IO多路復(fù)用模型。在linux系統(tǒng)上,使用的是epoll系統(tǒng)調(diào)用。

多路復(fù)用IO的缺點(diǎn):本質(zhì)上,select/epoll系統(tǒng)調(diào)用,屬于同步IO,也是阻塞IO。都需要在讀寫事件就緒后,自己負(fù)責(zé)進(jìn)行讀寫,也就是說這個(gè)讀寫過程是阻塞的。

如何充分的解除線程的阻塞呢?那就是異步IO模型。

AIO【Asynchronous IO】

如何進(jìn)一步提升效率,解除最后一點(diǎn)阻塞呢?這就是異步IO模型,全稱asynchronous I/O,簡稱為AIO。

AIO的基本流程是:用戶線程通過系統(tǒng)調(diào)用,告知kernel內(nèi)核啟動(dòng)某個(gè)IO操作,用戶線程返回。kernel內(nèi)核在整個(gè)IO操作【包括數(shù)據(jù)準(zhǔn)備、數(shù)據(jù)復(fù)制】完成后,通知用戶程序,用戶執(zhí)行后續(xù)的業(yè)務(wù)操作。

kernel的數(shù)據(jù)準(zhǔn)備是將數(shù)據(jù)從網(wǎng)絡(luò)物理設(shè)備【網(wǎng)卡】讀取到內(nèi)核緩沖區(qū);kernel的數(shù)據(jù)復(fù)制是將數(shù)據(jù)從內(nèi)核緩沖區(qū)拷貝到用戶程序空間的緩沖區(qū)。

1、當(dāng)用戶線程調(diào)用了read系統(tǒng)調(diào)用,立刻就可以開始去做其它的事,用戶線程不阻塞;

2、kernel內(nèi)核就開始了IO的第一個(gè)階段:準(zhǔn)備數(shù)據(jù)。當(dāng)kernel一直等到數(shù)據(jù)準(zhǔn)備好了,它就會(huì)將數(shù)據(jù)從kernel內(nèi)核緩沖區(qū),拷貝到用戶緩沖區(qū);

3、kernel會(huì)給用戶線程發(fā)送一個(gè)信號(hào)【事件】,或者回調(diào)用戶線程注冊(cè)的回調(diào)接口,告訴用戶線程read操作完成了;

4、用戶線程讀取用戶緩沖區(qū)的數(shù)據(jù),完成后續(xù)的業(yè)務(wù)操作。

異步IO模型的特點(diǎn):在內(nèi)核kernel的等待數(shù)據(jù)和復(fù)制數(shù)據(jù)的兩個(gè)階段,用戶線程都不是阻塞的。用戶線程需要接受kernel的IO操作完成的事件,或者說注冊(cè)IO操作完成的回調(diào)函數(shù),到操作系統(tǒng)的內(nèi)核。所以說,異步IO有的時(shí)候,也叫做信號(hào)驅(qū)動(dòng) IO 。

異步IO模型缺點(diǎn):需要完成事件的注冊(cè)與傳遞,這里邊需要底層操作系統(tǒng)提供大量的支持,去做大量的工作。

目前來說, Windows 系統(tǒng)下通過 IOCP 實(shí)現(xiàn)了真正的異步 I/O。但是,就目前的業(yè)界形式來說,Windows 系統(tǒng)很少作為百萬級(jí)以上或者說高并發(fā)應(yīng)用的服務(wù)器操作系統(tǒng)來使用。

而在 Linux 系統(tǒng)下,異步IO模型在2.6版本才引入,目前并不完善。所以這也是在 Linux 下,實(shí)現(xiàn)高并發(fā)網(wǎng)絡(luò)編程時(shí)都是以 IO 復(fù)用模型模式為主。

這里介紹完了IO的幾種基礎(chǔ)模型,接下來解釋一下同步異步,阻塞非阻塞的概念之后進(jìn)而說明Java中的IO實(shí)現(xiàn)

同步與異步

  • 同步【synchronous】: 同步是一種可靠的有序運(yùn)行機(jī)制,任務(wù)需要一個(gè)一個(gè)執(zhí)行。
  • 異步【asynchronous】: 異步就需要等待上一個(gè)任務(wù)執(zhí)行完畢,可以依靠事件、回調(diào)等機(jī)制執(zhí)行

同步和異步的最大區(qū)別在于:異步不需要等待處理結(jié)果,被調(diào)用者會(huì)通過回調(diào)等機(jī)制來通知調(diào)用者其返回結(jié)果。

阻塞和非阻塞

  • 阻塞【Blocking】: 阻塞就是發(fā)起一個(gè)請(qǐng)求,調(diào)用者一直等待請(qǐng)求結(jié)果返回,也就是當(dāng)前線程會(huì)被掛起,無法從事其他任務(wù),只有當(dāng)條件就緒才能繼續(xù)。
  • 非阻塞:【Non Blocking】 非阻塞就是發(fā)起一個(gè)請(qǐng)求,調(diào)用者不用等著結(jié)果返回,可以先去干其他事情。

通過生活中燒水的例子解釋一下同步阻塞、同步非阻塞、異步阻塞、異步非阻塞代表什么?

燒水需要一個(gè)人【張三】和一個(gè)水壺

同步阻塞:張三用比較落后的水壺在爐子上燒水,因?yàn)榘踩鹨?,燒水過程中張三等待不做其他任何事情【阻塞】,水開之后張三為了不浪費(fèi)燃料,手動(dòng)將火關(guān)掉【同步】;

同步非阻塞:張三發(fā)現(xiàn)水開的時(shí)候有滋滋滋聲,點(diǎn)火之后就去看電視了【非阻塞】,聽到水開之后,回來將火關(guān)掉【同步】;

此處發(fā)現(xiàn):同步就是需要手動(dòng)進(jìn)行下一步操作,阻塞與非阻塞的區(qū)別就在于就是在執(zhí)行任務(wù)時(shí)是否需要等待完成

異步阻塞:張三使用了先進(jìn)的電熱水壺,水開之后會(huì)自動(dòng)關(guān)閉【異步】,但是這哥們不放心科技產(chǎn)品,非要等著水燒好水壺自己斷電才行【阻塞】

異步非阻塞:時(shí)間久了之后張三發(fā)現(xiàn)產(chǎn)品沒有問題,每次都可以正常斷電,他就把電通上之后就去忙其他事情【非阻塞】,水燒開之后,電水壺自動(dòng)跳電【異步】

此處發(fā)現(xiàn):異步是根據(jù)水壺根據(jù)水是否燒開的事件來觸發(fā)斷電這個(gè)流程,而非手動(dòng)調(diào)用斷電

Java中的BIO,NIO,AIO

Java 中的 BIO、NIO和 AIO 理解為是 Java 語言對(duì)上述所介紹的操作系統(tǒng)的各種 IO 模型的封裝。在使用這些 API 的時(shí)候,不需要關(guān)心操作系統(tǒng)層面的知識(shí),也不需要根據(jù)不同操作系統(tǒng)編寫不同的代碼。只需要使用Java的API就可以了。我們首先了解一下Java中各種IO的特點(diǎn)和演進(jìn)之路

IO

I/O是Input和Output的簡寫,Input對(duì)應(yīng)的是輸入,Output對(duì)應(yīng)的是輸出,可以理解為依靠什么模式來完成數(shù)據(jù)的發(fā)送和接收,很大程度上決定了數(shù)據(jù)傳輸?shù)男阅?/p>

對(duì)于計(jì)算機(jī)來說,鍵盤打字屬于將字符輸入到計(jì)算機(jī)內(nèi),點(diǎn)擊鼠標(biāo)將信號(hào)輸入到計(jì)算機(jī)內(nèi),這屬于輸入。顯示器是將文字,圖像顯示出來,音響將聲音播放出來這屬于輸出。

Java具體實(shí)現(xiàn)的IO有三種:BIO、NIO、AIO

BIO

BIO是Java的第一代IO模型,Blocking Input Output的縮寫,是一種同步阻塞型IO,服務(wù)器實(shí)現(xiàn)模式為一個(gè)連接一個(gè)線程,即客戶端有連接請(qǐng)求時(shí)服務(wù)器端就需要啟動(dòng)一個(gè)線程進(jìn)行處理,如果這個(gè)連接不作任何事情會(huì)造成不必要的線程開銷

也就是一次輸入或者輸出操作必須等待它完成之后才會(huì)繼續(xù)向下運(yùn)行其他的操作,如果一個(gè)輸入或者輸出操作需要很長的時(shí)間,比如要上傳一個(gè)5G的文件,需要等待上傳完才能繼續(xù)執(zhí)行其他操作,這會(huì)造成不必要的時(shí)間浪費(fèi)

NIO

Java 1.4中引入了NIO,也就是Java的第二代IO模型,有人稱之為Non-blocking IO,也有的人稱為New IO,它是一種多路復(fù)用的同步非阻塞IO模型,對(duì)應(yīng)上邊的第三種IO模型

多路復(fù)用:指的就是用同一個(gè)線程處理大量連接

多路:指的就是大量連接

復(fù)用:指的就是復(fù)用線程,使用一個(gè)線程來進(jìn)行處理

服務(wù)器實(shí)現(xiàn)模式為一個(gè)線程處理多個(gè)請(qǐng)求(連接),即客戶端發(fā)送的連接請(qǐng)求會(huì)被注冊(cè)到多路復(fù)用器上,多路復(fù)用器輪詢到有 I/O 請(qǐng)求就會(huì)進(jìn)行處理。

AIO

Java 7中引入AIO,是Asynchronous Input Output的縮寫,可以稱之為NIO第二代,是一種異步非阻塞IO模型,異步IO模型是基于事件和回調(diào)機(jī)制實(shí)現(xiàn)的,當(dāng)應(yīng)用發(fā)起調(diào)用請(qǐng)求之后會(huì)直接返回不會(huì)阻塞在那里,當(dāng)后臺(tái)進(jìn)行數(shù)據(jù)處理完成后,操作系統(tǒng)便會(huì)通知對(duì)應(yīng)的線程來進(jìn)行后續(xù)的數(shù)據(jù)處理。

從效率上來看,AIO 無疑是最高的,然而,美中不足的是目前作為廣大服務(wù)器使用的系統(tǒng) linux 對(duì) AIO 的支持還不完善,導(dǎo)致我們還不能愉快的使用 AIO 這項(xiàng)技術(shù),Netty實(shí)際也是使用過AIO技術(shù),但是實(shí)際并沒有帶來很大的性能提升,目前還是基于Java NIO實(shí)現(xiàn)。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2021-06-30 15:25:13

操作系統(tǒng)Java

2021-07-01 11:56:35

操作系統(tǒng)Java IO

2019-12-17 18:04:09

操作系統(tǒng)Linux中央處理器

2022-04-12 08:00:17

socket 編程網(wǎng)絡(luò)編程網(wǎng)絡(luò) IO 模型

2019-12-12 10:57:25

LinuxIOCPU

2023-05-09 11:13:09

IO模型語言

2024-01-09 18:09:43

模型方式DMA

2021-07-07 23:38:05

內(nèi)核IOLinux

2025-03-24 00:11:05

IO模型計(jì)算機(jī)

2020-09-23 12:32:18

網(wǎng)絡(luò)IOMySQL

2023-05-05 09:48:14

LinuxIO模型

2009-06-16 11:44:00

Java IO系統(tǒng)

2011-06-09 11:23:18

JAVAIO

2022-05-09 08:37:43

IO模型Java

2010-04-16 16:25:43

2010-04-23 16:08:24

Aix操作系統(tǒng)

2011-07-10 14:28:49

JAVAIO

2021-06-21 11:11:29

LinuxIO磁盤IO

2019-11-23 17:27:54

IO開源

2024-06-07 00:09:50

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)