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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/4/11 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IO中的阻塞、非阻塞、同步、异步概念分析详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

?

1.什么是I/O編程

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

2.1 什么是同步、異步

2.2 什么是阻塞和非阻塞

2.3 阻塞、非阻塞和同步、異步的區別

2.4 編程實現

3.參考文獻


1.什么是I/O編程

IO在計算機中指Input/Output,也就是輸入和輸出。由于程序和運行時數據是在內存中駐留,由CPU這個超快的計算核心來執行,涉及到數據交換的地方,通常是磁盤、網絡等,就需要IO接口。

比如你打開瀏覽器,訪問新浪首頁,瀏覽器這個程序就需要通過網絡IO獲取新浪的網頁。瀏覽器首先會發送數據給新浪服務器,告訴它我想要首頁的HTML,這個動作是往外發數據,叫Output,隨后新浪服務器把網頁發過來,這個動作是從外面接收數據,叫Input。所以,通常,程序完成IO操作會有Input和Output兩個數據流。當然也有只用一個的情況,比如,從磁盤讀取文件到內存,就只有Input操作,反過來,把數據寫到磁盤文件里,就只是一個Output操作。

IO編程中,Stream(流)是一個很重要的概念,可以把流想象成一個水管,數據就是水管里的水,但是只能單向流動。Input Stream就是數據從外面(磁盤、網絡)流進內存,Output Stream就是數據從內存流到外面去。對于瀏覽網頁來說,瀏覽器和新浪服務器之間至少需要建立兩根水管,才可以既能發數據,又能收數據。

小結一下,程序運行是依靠cpu和內存來進行的,I/O操作是相對于內存而言的,從外部設備進入內存就叫Input,反之從內存輸出到外部設備就叫Output.?
I/O按照設備來分的話,分為兩種,其一是網絡I/O,也就是通過網絡進行數據的拉取和輸出。還有一種是磁盤I/O,主要是對磁盤進行讀寫工作。?

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

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

舉一個燒水的例子來具體解釋這幾個概念。?
說到燒水,我們都是通過熱水壺來燒水的。在很久之前,科技還沒有這么發達的時候,如果我們要燒水,需要把水壺放到火爐上,我們通過觀察水壺內的水的沸騰程度來判斷水有沒有燒開。

隨著科技的發展,現在市面上的水壺都有了提醒功能,當我們把水壺插電之后,水壺水燒開之后會通過聲音提醒我們水開了。

2.1 什么是同步、異步

對于燒水這件事兒來說,傳統水壺的燒水就是同步的,高科技水壺的燒水就是異步的。

同步請求,A調用B,B的處理是同步的,在處理完之前他不會通知A,只有處理完之后才會明確的通知A。

異步請求,A調用B,B的處理是異步的,B在接到請求后先告訴A我已經接到請求了,然后異步去處理,處理完之后通過回調等方式再通知A。

所以說,同步和異步最大的區別就是被調用方的執行方式和返回時機。同步指的是被調用方做完事情之后再返回,異步指的是被調用方先返回,然后再做事情,做完之后再想辦法通知調用方。

2.2 什么是阻塞和非阻塞

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

對于你來說,坐在水壺前面等就是阻塞的,去客廳看電視等著水開就是非阻塞的。

阻塞請求,A調用B,A一直等著B的返回,別的事情什么也不干。

非阻塞請求,A調用B,A不用一直等著B的返回,先去忙別的事情了。

所以說,同步和異步最大的區別就是在被調用方返回結果之前的這段時間內,調用方是否一直等待。阻塞指的是調用方一直等待別的事情什么都不做。非阻塞指的是調用方先去忙別的事情。

2.3 阻塞、非阻塞和同步、異步的區別

有人認為阻塞和同步是一回事兒,非阻塞和異步是一回事。但是這是不對的。

首先,前面已經提到過,阻塞、非阻塞和同步、異步其實針對的對象是不一樣的。阻塞、非阻塞說的是調用者,同步、異步說的是被調用者。

針對于上文所說的燒水的案例來說,阻塞與非阻塞是形容調用者人的,而同步和異步是形容被調用者燒水這件事兒。?
同步里面可以有阻塞的情形,也可以有非阻塞的性情。異步也可以有阻塞的情形和非阻塞的情形。?

先來看同步場景中是如何包含阻塞和非阻塞情況的

我們是用傳統的水壺燒水。在水燒開之前我們一直做在水壺前面,等著水開。這就是阻塞的。
我們是用傳統的水壺燒水。在水燒開之前我們先去客廳看電視了,但是水壺不會主動通知我們,需要我們時不時的去廚房看一下水有沒有燒開。這就是非阻塞的。
再來看異步場景中是如何包含阻塞和非阻塞情況的

我們是用帶有提醒功能的水壺燒水。在水燒發出提醒之前我們一直做在水壺前面,等著水開。這就是阻塞的。
我們是用帶有提醒功能的水壺燒水。在水燒發出提醒之前我們先去客廳看電視了,等水壺發出聲音提醒我們。這就是非阻塞的。

2.4 編程實現

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

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

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

BIO (Blocking I/O):同步阻塞I/O模式,數據的讀取寫入必須阻塞在一個線程內等待其完成。

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

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

可以拿燒水的例子來解釋這三種I/O模型

BIO (Blocking I/O):有一排水壺在燒開水,BIO的工作模式就是,叫一個線程停留在一個水壺那,直到這個水壺燒開,才去處理下一個水壺。但是實際上線程在等待水壺燒開的時間段什么都沒有做。

NIO (New I/O):NIO的做法是叫一個線程不斷的輪詢每個水壺的狀態,看看是否有水壺的狀態發生了改變,從而進行下一步的操作。

AIO ( Asynchronous I/O):為每個水壺上面裝了一個開關,水燒開之后,水壺會自動通知我水燒開了。

3.參考文獻

廖雪峰官方文檔
微信公眾號:漫話編程
?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。