九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
百度、騰訊熱門(mén)面試題:聊聊Unix與Java的IO模型?(含詳細(xì)解析)

眾所周知,如果去百度、騰訊等一線大廠面試,一定會(huì)深入考候選人的基礎(chǔ)技術(shù)功底,其中尤為關(guān)鍵和重視的就是IO相關(guān)的技術(shù)和知識(shí)。

而要搞明白IO相關(guān)的概念,首先就得弄清楚同步與異步,阻塞與非阻塞到底是什么意思。

同步與異步

想要搞明白IO模型,就先得搞明白“同步”與“異步”的關(guān)系。

所謂的“同步”,比如說(shuō)調(diào)用者去調(diào)用一個(gè)接口,這個(gè)接口比如要執(zhí)行一些磁盤(pán)文件讀寫(xiě)操作,或者是網(wǎng)絡(luò)通信操作。

假設(shè)是“同步”的模式,調(diào)用者必須要等待這個(gè)接口的磁盤(pán)讀寫(xiě)或者網(wǎng)絡(luò)通信的操作執(zhí)行完畢了,調(diào)用者才能返回,這就是“同步”,如下圖所示:

所謂的“異步”,就是說(shuō)這個(gè)調(diào)用者調(diào)用接口之后,直接就返回了,他去干別的事兒了,也不管那個(gè)接口的磁盤(pán)讀寫(xiě)或者是網(wǎng)絡(luò)通信是否成功。

然后這個(gè)接口后續(xù)如果干完了自己的任務(wù),比如寫(xiě)完了文件或者是什么的,會(huì)反過(guò)來(lái)通知調(diào)用者,之前你的那個(gè)調(diào)用成功了。可以通過(guò)一些內(nèi)部通信機(jī)制來(lái)通知,也可以通過(guò)回調(diào)函數(shù)來(lái)通知,如下圖。

用生活中的例子理解同步與異步

如果給大家舉個(gè)生活中的例子,那么就可以用買(mǎi)煙這個(gè)事兒來(lái)舉個(gè)例子

比如說(shuō)現(xiàn)在你要去一個(gè)柜臺(tái)買(mǎi)很多條香煙,但是現(xiàn)在柜臺(tái)沒(méi)那么多貨,他需要打電話給庫(kù)房來(lái)查一下有沒(méi)有足夠的貨。

這個(gè)時(shí)候,庫(kù)房的工作人員正好去吃飯了,那現(xiàn)在你有兩種選擇:

第一種選擇,你可以在柜臺(tái)等著,一直等待庫(kù)房工作人員回來(lái),柜臺(tái)專員打通電話給他查到了庫(kù)存是否充足,你再走。

這個(gè)就是“同步”,你找柜臺(tái)工作人員買(mǎi)香煙,他要打電話給庫(kù)房工作人員問(wèn)庫(kù)存,如果你選擇“同步”模式,那么你就在柜臺(tái)一直等著,直到成功查詢到庫(kù)存為止。

第二種選擇,你可以先回家干點(diǎn)兒別的,比如說(shuō)洗衣服做飯之類的,然后過(guò)了一會(huì)兒,柜臺(tái)工作人員打通電話給庫(kù)房工作人員,查到香煙庫(kù)存了,就會(huì)打個(gè)電話給你,告訴你這個(gè)事兒。

這就是“異步”,你跟柜臺(tái)工作人員說(shuō)了這個(gè)事兒,就直接走了,干別的去了,柜臺(tái)工作人員后面完成他的任務(wù)之后,就會(huì)反過(guò)來(lái)打電話回調(diào)通知你。

阻塞與非阻塞

實(shí)際上阻塞與非阻塞的概念,通常是針對(duì)底層的IO操作來(lái)說(shuō)的。

比如現(xiàn)在我們的程序想要通過(guò)網(wǎng)絡(luò)讀取數(shù)據(jù),如果是阻塞IO模式,一旦發(fā)起請(qǐng)求到操作系統(tǒng)內(nèi)核去從網(wǎng)絡(luò)中讀取數(shù)據(jù),就會(huì)阻塞在那里,必須要等待網(wǎng)絡(luò)中的數(shù)據(jù)到達(dá)了之后,才能從網(wǎng)絡(luò)讀取數(shù)據(jù)到內(nèi)核,再?gòu)膬?nèi)核返回給程序,如下圖。

非阻塞,指的就是程序發(fā)送請(qǐng)求給內(nèi)核要從網(wǎng)絡(luò)讀取數(shù)據(jù),但是此時(shí)網(wǎng)絡(luò)中的數(shù)據(jù)還沒(méi)到,此時(shí)不會(huì)阻塞住,內(nèi)核會(huì)返回一個(gè)異常消息給程序。

程序就可以干點(diǎn)兒別的,然后過(guò)一會(huì)兒再來(lái)發(fā)起一次請(qǐng)求給內(nèi)核,讓內(nèi)核嘗試從網(wǎng)絡(luò)讀取數(shù)據(jù)。

因?yàn)槿绻W(wǎng)絡(luò)中的數(shù)據(jù)還沒(méi)到位,是不會(huì)阻塞住程序的,需要程序自己不斷的輪詢內(nèi)核去嘗試讀取數(shù)據(jù),所以這種IO就是非阻塞的。如下圖:

大家不要把“同步/異步”概念和“阻塞/非阻塞”概念混淆起來(lái),實(shí)際上他們是兩組不同的概念。

“同步/異步”更多的是針對(duì)比如接口調(diào)用,服務(wù)調(diào)用,API類庫(kù)調(diào)用,類似這樣的場(chǎng)景。

而“阻塞/非阻塞”概念針對(duì)的是底層IO操作的場(chǎng)景,比如磁盤(pán)IO,網(wǎng)絡(luò)IO。但是在Java IO模型里,兩種概念之間是有一定的關(guān)聯(lián)關(guān)系的 。

Unix支持的5種IO模型

Unix操作系統(tǒng)支持的IO模型主要就是5種:

  1. 阻塞IO:就是上面圖里的那種阻塞IO模式,程序發(fā)起請(qǐng)求之后會(huì)阻塞,一直到系統(tǒng)內(nèi)核發(fā)現(xiàn)網(wǎng)絡(luò)中有數(shù)據(jù)到達(dá)了,拷貝數(shù)據(jù)給程序進(jìn)程了,才能返回

  2. 非阻塞IO:就是上面圖里的那種非阻塞IO模式,程序發(fā)起請(qǐng)求讀取數(shù)據(jù),系統(tǒng)內(nèi)核發(fā)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)還沒(méi)到,就返回一個(gè)異常信息,程序不會(huì)阻塞在IO操作上,但是過(guò)一會(huì)兒還得再來(lái)發(fā)起請(qǐng)求給內(nèi)核,直到內(nèi)核發(fā)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)到達(dá)了,此時(shí)就會(huì)拷貝數(shù)據(jù)給程序進(jìn)程

  3. IO多路復(fù)用:這個(gè)下面來(lái)講

  4. 信號(hào)驅(qū)動(dòng)式IO:一般很少用到,這里不說(shuō)明

  5. 異步IO:下面來(lái)講

JDK 1.4之前的同步阻塞IO

在JDK 1.4之前,主要就是同步阻塞IO模型,在Java里叫做BIO。

在Java代碼里調(diào)用IO相關(guān)接口,發(fā)起IO操作之后,Java程序就會(huì)同步等待,這個(gè)同步指的是Java程序調(diào)用IO API接口的層面而言。

而IO API在底層的IO操作是基于阻塞IO來(lái)的,向操作系統(tǒng)內(nèi)核發(fā)起IO請(qǐng)求,系統(tǒng)內(nèi)核會(huì)等待數(shù)據(jù)就位之后,才會(huì)執(zhí)行IO操作,執(zhí)行完畢了才會(huì)返回。

JDK 1.4之后的同步非阻塞NIO

在JDK 1.4之后提供了NIO,他的概念是同步非阻塞,也就是說(shuō)如果你調(diào)用NIO接口去執(zhí)行IO操作,其實(shí)還是同步等待的,但是在底層的IO操作上 ,會(huì)對(duì)系統(tǒng)內(nèi)核發(fā)起非阻塞IO請(qǐng)求,以非阻塞的形式來(lái)執(zhí)行IO。

也就是說(shuō),如果底層數(shù)據(jù)沒(méi)到位,那么內(nèi)核返回異常信息,不會(huì)阻塞住,但是NIO接口內(nèi)部會(huì)采用非阻塞方式過(guò)一會(huì)兒再次調(diào)用內(nèi)核發(fā)起IO請(qǐng)求,直到成功為止。

但是之所以說(shuō)是同步非阻塞,這里的“同步”指的就是因?yàn)樵谀愕腏ava代碼調(diào)用NIO接口層面是同步的,你還是要同步等待底層IO操作真正完成了才可以返回,只不過(guò)在執(zhí)行底層IO的時(shí)候采用了非阻塞的方式來(lái)執(zhí)行罷了。

NIO網(wǎng)絡(luò)通信與IO多路復(fù)用模型

實(shí)際上,如果基于NIO進(jìn)行網(wǎng)絡(luò)通信,采取的就是多路復(fù)用的IO模型,這個(gè)多路復(fù)用IO模型針對(duì)的是網(wǎng)絡(luò)通信中的IO場(chǎng)景來(lái)說(shuō)的。

簡(jiǎn)單來(lái)說(shuō),就是在基于Socket進(jìn)行網(wǎng)絡(luò)通信的時(shí)候,如果有多個(gè)客戶端跟你的服務(wù)端建立了Socket連接,那你就需要維護(hù)多個(gè)Socket連接。

而所謂的多路復(fù)用IO模型,就是說(shuō)你的Java代碼直接通過(guò)一個(gè)select函數(shù)調(diào)用,直接會(huì)進(jìn)入一個(gè)同步等待的狀態(tài)。

這也是為什么說(shuō)NIO一定是“同步”的,因?yàn)槟惚仨氃谶@里同步等待某個(gè)Socket連接有請(qǐng)求到來(lái)。

接著你就要同步等著select函數(shù)去對(duì)底層的多個(gè) Socket 連接進(jìn)行輪詢,不斷的查看各個(gè) Socket 連接誰(shuí)有請(qǐng)求到達(dá),就可以讓select函數(shù)返回,交給我們的Java程序來(lái)處理。

select函數(shù)在底層會(huì)通過(guò)非阻塞的方式輪詢各個(gè)Socket,任何一個(gè)Socket如果沒(méi)有數(shù)據(jù)到達(dá),那么非阻塞的特性會(huì)立即返回一個(gè)信息。

然后select函數(shù)可以輪詢下一個(gè)Socket,不會(huì)阻塞在某個(gè)Socket上,所以底層是基于這種非阻塞的模式來(lái)“監(jiān)視”各個(gè)Socket誰(shuí)有數(shù)據(jù)到達(dá)的。

這就是所謂的“同步非阻塞”,但是因?yàn)椴僮飨到y(tǒng)把上述工作都封裝在一個(gè)select函數(shù)調(diào)用里了,可以對(duì)多路Socket連接同時(shí)進(jìn)行監(jiān)視,所以就把這種模型稱之為“IO多路復(fù)用”模型。

通過(guò)這種IO多路復(fù)用的模型,就可以用一個(gè)線程,調(diào)用一個(gè)select函數(shù),然后監(jiān)視大量的客戶端連接了,如下圖。

AIO以及異步IO模型

最后就是JDK 1.7之后,又支持了AIO,也叫做NIO 2.0,他就支持異步IO模型了。

我們先說(shuō)一下異步IO模型是什么意思。

簡(jiǎn)單來(lái)說(shuō),就是你的Java程序可以基于AIO API發(fā)起一個(gè)請(qǐng)求,比如說(shuō)接收網(wǎng)絡(luò)數(shù)據(jù),AIO API底層會(huì)基于異步IO模型來(lái)調(diào)用操作系統(tǒng)內(nèi)核。

此時(shí)不需要去管這個(gè)IO是否成功了,AIO接口會(huì)直接返回,你的Java程序也會(huì)直接返回。

然后,你的Java程序就可以去干別的事兒了。大家聯(lián)想一下上面說(shuō)的那個(gè)異步的例子,就可以理解這里為什么叫做異步了。

因?yàn)锽IO、NIO都是同步的,你發(fā)起IO請(qǐng)求,都必須同步等待IO操作完成。

但是這里你發(fā)起一個(gè)IO請(qǐng)求,直接AIO接口就返回了,你就可以干別的事兒了,純異步的方式。

不過(guò)你需要提供一個(gè)回調(diào)函數(shù)給AIO接口,一旦底層系統(tǒng)內(nèi)核完成了具體的IO請(qǐng)求,比如網(wǎng)絡(luò)讀寫(xiě)之類的,就會(huì)回調(diào)你提供的回調(diào)函數(shù)。

比如說(shuō)你要是通過(guò)網(wǎng)絡(luò)讀取數(shù)據(jù),那么此時(shí)AIO接口就會(huì)把操作系統(tǒng)異步讀取到的數(shù)據(jù)交給你的回調(diào)函數(shù)。

整個(gè)過(guò)程如下圖:

End

 作者簡(jiǎn)介:

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
IO的概念和5種IO模型
阻塞、非阻塞、多路復(fù)用、同步、異步、BIO、NIO、AIO 一鍋端
JAVA 中BIO,NIO,AIO的理解
Java NIO:淺析I/O模型
【系統(tǒng)編程】五種IO模型分析
Java NIO淺析
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服