日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

IO中的阻塞、非阻塞、同步、异步概念分析详解

發(fā)布時(shí)間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IO中的阻塞、非阻塞、同步、异步概念分析详解 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

?

1.什么是I/O編程

2.阻塞、非阻塞、同步、異步分析

2.1 什么是同步、異步

2.2 什么是阻塞和非阻塞

2.3 阻塞、非阻塞和同步、異步的區(qū)別

2.4 編程實(shí)現(xiàn)

3.參考文獻(xiàn)


1.什么是I/O編程

IO在計(jì)算機(jī)中指Input/Output,也就是輸入和輸出。由于程序和運(yùn)行時(shí)數(shù)據(jù)是在內(nèi)存中駐留,由CPU這個(gè)超快的計(jì)算核心來(lái)執(zhí)行,涉及到數(shù)據(jù)交換的地方,通常是磁盤(pán)、網(wǎng)絡(luò)等,就需要IO接口。

比如你打開(kāi)瀏覽器,訪(fǎng)問(wèn)新浪首頁(yè),瀏覽器這個(gè)程序就需要通過(guò)網(wǎng)絡(luò)IO獲取新浪的網(wǎng)頁(yè)。瀏覽器首先會(huì)發(fā)送數(shù)據(jù)給新浪服務(wù)器,告訴它我想要首頁(yè)的HTML,這個(gè)動(dòng)作是往外發(fā)數(shù)據(jù),叫Output,隨后新浪服務(wù)器把網(wǎng)頁(yè)發(fā)過(guò)來(lái),這個(gè)動(dòng)作是從外面接收數(shù)據(jù),叫Input。所以,通常,程序完成IO操作會(huì)有Input和Output兩個(gè)數(shù)據(jù)流。當(dāng)然也有只用一個(gè)的情況,比如,從磁盤(pán)讀取文件到內(nèi)存,就只有Input操作,反過(guò)來(lái),把數(shù)據(jù)寫(xiě)到磁盤(pán)文件里,就只是一個(gè)Output操作。

IO編程中,Stream(流)是一個(gè)很重要的概念,可以把流想象成一個(gè)水管,數(shù)據(jù)就是水管里的水,但是只能單向流動(dòng)。Input Stream就是數(shù)據(jù)從外面(磁盤(pán)、網(wǎng)絡(luò))流進(jìn)內(nèi)存,Output Stream就是數(shù)據(jù)從內(nèi)存流到外面去。對(duì)于瀏覽網(wǎng)頁(yè)來(lái)說(shuō),瀏覽器和新浪服務(wù)器之間至少需要建立兩根水管,才可以既能發(fā)數(shù)據(jù),又能收數(shù)據(jù)。

小結(jié)一下,程序運(yùn)行是依靠cpu和內(nèi)存來(lái)進(jìn)行的,I/O操作是相對(duì)于內(nèi)存而言的,從外部設(shè)備進(jìn)入內(nèi)存就叫Input,反之從內(nèi)存輸出到外部設(shè)備就叫Output.?
I/O按照設(shè)備來(lái)分的話(huà),分為兩種,其一是網(wǎng)絡(luò)I/O,也就是通過(guò)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)的拉取和輸出。還有一種是磁盤(pán)I/O,主要是對(duì)磁盤(pán)進(jìn)行讀寫(xiě)工作。?

2.阻塞、非阻塞、同步、異步分析

由于CPU和內(nèi)存的速度遠(yuǎn)遠(yuǎn)高于外設(shè)的速度,所以,在IO編程中,就存在速度嚴(yán)重不匹配的問(wèn)題。舉個(gè)例子來(lái)說(shuō),比如要把100M的數(shù)據(jù)寫(xiě)入磁盤(pán),CPU輸出100M的數(shù)據(jù)只需要0.01秒,可是磁盤(pán)要接收這100M數(shù)據(jù)可能需要10秒,怎么辦呢??
這就牽扯出來(lái)了同步、異步、阻塞與非阻塞這些概念。

舉一個(gè)燒水的例子來(lái)具體解釋這幾個(gè)概念。?
說(shuō)到燒水,我們都是通過(guò)熱水壺來(lái)燒水的。在很久之前,科技還沒(méi)有這么發(fā)達(dá)的時(shí)候,如果我們要燒水,需要把水壺放到火爐上,我們通過(guò)觀察水壺內(nèi)的水的沸騰程度來(lái)判斷水有沒(méi)有燒開(kāi)。

隨著科技的發(fā)展,現(xiàn)在市面上的水壺都有了提醒功能,當(dāng)我們把水壺插電之后,水壺水燒開(kāi)之后會(huì)通過(guò)聲音提醒我們水開(kāi)了。

2.1 什么是同步、異步

對(duì)于燒水這件事兒來(lái)說(shuō),傳統(tǒng)水壺的燒水就是同步的,高科技水壺的燒水就是異步的。

同步請(qǐng)求,A調(diào)用B,B的處理是同步的,在處理完之前他不會(huì)通知A,只有處理完之后才會(huì)明確的通知A。

異步請(qǐng)求,A調(diào)用B,B的處理是異步的,B在接到請(qǐng)求后先告訴A我已經(jīng)接到請(qǐng)求了,然后異步去處理,處理完之后通過(guò)回調(diào)等方式再通知A。

所以說(shuō),同步和異步最大的區(qū)別就是被調(diào)用方的執(zhí)行方式和返回時(shí)機(jī)。同步指的是被調(diào)用方做完事情之后再返回,異步指的是被調(diào)用方先返回,然后再做事情,做完之后再想辦法通知調(diào)用方。

2.2 什么是阻塞和非阻塞

還是那個(gè)燒水的例子,當(dāng)你把水放到水壺里面,按下開(kāi)關(guān)后,你可以坐在水壺前面,別的事情什么都不做,一直等著水燒好。你還可以先去客廳看電視,等著水開(kāi)就好了。

對(duì)于你來(lái)說(shuō),坐在水壺前面等就是阻塞的,去客廳看電視等著水開(kāi)就是非阻塞的。

阻塞請(qǐng)求,A調(diào)用B,A一直等著B(niǎo)的返回,別的事情什么也不干。

非阻塞請(qǐng)求,A調(diào)用B,A不用一直等著B(niǎo)的返回,先去忙別的事情了。

所以說(shuō),同步和異步最大的區(qū)別就是在被調(diào)用方返回結(jié)果之前的這段時(shí)間內(nèi),調(diào)用方是否一直等待。阻塞指的是調(diào)用方一直等待別的事情什么都不做。非阻塞指的是調(diào)用方先去忙別的事情。

2.3 阻塞、非阻塞和同步、異步的區(qū)別

有人認(rèn)為阻塞和同步是一回事兒,非阻塞和異步是一回事。但是這是不對(duì)的。

首先,前面已經(jīng)提到過(guò),阻塞、非阻塞和同步、異步其實(shí)針對(duì)的對(duì)象是不一樣的。阻塞、非阻塞說(shuō)的是調(diào)用者,同步、異步說(shuō)的是被調(diào)用者。

針對(duì)于上文所說(shuō)的燒水的案例來(lái)說(shuō),阻塞與非阻塞是形容調(diào)用者人的,而同步和異步是形容被調(diào)用者燒水這件事兒。?
同步里面可以有阻塞的情形,也可以有非阻塞的性情。異步也可以有阻塞的情形和非阻塞的情形。?

先來(lái)看同步場(chǎng)景中是如何包含阻塞和非阻塞情況的

我們是用傳統(tǒng)的水壺?zé)T谒疅_(kāi)之前我們一直做在水壺前面,等著水開(kāi)。這就是阻塞的。
我們是用傳統(tǒng)的水壺?zé)T谒疅_(kāi)之前我們先去客廳看電視了,但是水壺不會(huì)主動(dòng)通知我們,需要我們時(shí)不時(shí)的去廚房看一下水有沒(méi)有燒開(kāi)。這就是非阻塞的。
再來(lái)看異步場(chǎng)景中是如何包含阻塞和非阻塞情況的

我們是用帶有提醒功能的水壺?zé)T谒疅l(fā)出提醒之前我們一直做在水壺前面,等著水開(kāi)。這就是阻塞的。
我們是用帶有提醒功能的水壺?zé)T谒疅l(fā)出提醒之前我們先去客廳看電視了,等水壺發(fā)出聲音提醒我們。這就是非阻塞的。

2.4 編程實(shí)現(xiàn)

在真實(shí)的編程環(huán)境中,阻塞、非阻塞和同步、異步之間的組合并不是都存在的。

在Java語(yǔ)言中,一共提供了三種IO模型,分別是阻塞IO(BIO)、非阻塞IO(NIO)、異步IO(AIO)。

這里面的BIO和NIO都是同步的IO模型,即同步阻塞IO和同步非阻塞IO,異步IO指的是異步非阻塞IO。

BIO (Blocking I/O):同步阻塞I/O模式,數(shù)據(jù)的讀取寫(xiě)入必須阻塞在一個(gè)線(xiàn)程內(nèi)等待其完成。

NIO (New I/O):同時(shí)支持阻塞與非阻塞模式,但主要是使用同步非阻塞IO。

AIO (Asynchronous I/O):異步非阻塞I/O模型。

可以拿燒水的例子來(lái)解釋這三種I/O模型

BIO (Blocking I/O):有一排水壺在燒開(kāi)水,BIO的工作模式就是,叫一個(gè)線(xiàn)程停留在一個(gè)水壺那,直到這個(gè)水壺?zé)_(kāi),才去處理下一個(gè)水壺。但是實(shí)際上線(xiàn)程在等待水壺?zé)_(kāi)的時(shí)間段什么都沒(méi)有做。

NIO (New I/O):NIO的做法是叫一個(gè)線(xiàn)程不斷的輪詢(xún)每個(gè)水壺的狀態(tài),看看是否有水壺的狀態(tài)發(fā)生了改變,從而進(jìn)行下一步的操作。

AIO ( Asynchronous I/O):為每個(gè)水壺上面裝了一個(gè)開(kāi)關(guān),水燒開(kāi)之后,水壺會(huì)自動(dòng)通知我水燒開(kāi)了。

3.參考文獻(xiàn)

廖雪峰官方文檔
微信公眾號(hào):漫話(huà)編程
?

總結(jié)

以上是生活随笔為你收集整理的IO中的阻塞、非阻塞、同步、异步概念分析详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。