究竟什么是阻塞與非阻塞、同步與異步

文章目錄

  • 前言
  • 阻塞與非阻塞
  • 同步與異步
  • 復雜的網絡IO
  • 真正的異步IO
  • IO分類與示例
  • 總結

前言

這幾個名詞在程序開發時經常聽到,但是突然問起來各個詞的含義一時間還真是說不清楚,貌似這幾個詞都是翻譯過來的,每個人的解釋都不太一樣,我對這幾個詞的理解也不是一成不變的,隨著開發經驗的積累,漸漸有了自己的記憶方式,所以總結一下,不一定準確,有問題可以一起聊一聊。

先說說我的結論:阻塞與非阻塞是指等待執行結果時的狀態,同步與異步是指獲取執行結果的方式,讀起來有點繞口,聽起來也迷迷糊糊的,沒關系,我們用具體的例子來說明應該就容易理解了。

阻塞與非阻塞

先說說『阻塞與非阻塞是指等待執行結果時的狀態』這一句,是說在執行某個操作或者某個函數時,在沒有拿到我們想要的結果時,我們的狀態是怎樣的,如果是一直等就是【阻塞】的,如果發現沒有結果就去做別的事情了就是【非阻塞】的。

以常見的網絡IO為例,服務器對客戶端連接的socket調用read函數,試圖獲取客戶端發送的請求數據,但是客戶端并不總是有數據發送過來,所以想要獲得數據我可以采用【阻塞】方式一直等,也可以采用【非阻塞】方式,在發現此時沒有數據時就先去干別的事,一會再來看看。

同步與異步

再來說說『同步與異步是指獲取執行結果的方式』這一句,以游戲中的常見升級發獎為例,可以主動調用升級函數,在執行完成后返回升級的結果,然后根據結果來發獎勵,也就是【同步】寫法,也可以注冊一個監聽等級變化的回調函數,注冊完我就不管了,當升級時會將升級的結果通過回調函數傳回來,這就是【異步】處理方式。

復雜的網絡IO

為什么同步和異步沒有用網絡IO來舉例呢?因為網絡IO這里的情況更加復雜,雖然你注冊了回調函數,但它很可能是個同步IO,究竟怎么回事,一起來看看。

我們知道要想從IO讀取數據,需要經歷「內核數據準備好」和「數據從內核態拷貝到用戶態」兩個過程,還是以read函數為例,如果設置為阻塞模式,相當于read函數等待了「內核數據準備好」和「數據從內核態拷貝到用戶態」兩個過程,然后取到IO數據,如果設置成非阻塞模式,當內核數據沒準備好會直接返回,也就是不會等待第一個過程,但是當數據準備好時,會直接等待第二個過程完成后,將結果數據返回。

所以無論是否阻塞,我們都等待了第二個階段,等著它執行完成后獲取結果,所以這兩種都是同步IO。

那作為IO多路復用里的“一哥”epoll也是同步IO嗎?是的!那封裝了select/poll/epoll的libevent可是用了Reactor模式,支持事件回調,它也是同步IO嗎?是的!

真正的異步IO

有點驚呆了不是嗎?那究竟什么是異步IO呢?還真有!Windows 里實現了一套完整的支持 socket 的異步編程接口 IOCP,而 Linux 是在 2019 年 5.1 版本 內核首次引入的高性能異步I/O 框架 io_uring,我確實都沒用過,感興趣的可以試一下

是否是異步IO就看「數據從內核態拷貝到用戶態」這個過程需不需要等待,如果需要邏輯層自己等待這個過程取數據就是同步IO,如果這個過程都不用等,調用回調函數時已經把內核態的數據拷貝出來,并且通過回調將數據進行了回傳,這就是異步IO。

IO分類與示例

所以總結下來一共有這么幾種:同步阻塞IO,同步非阻塞IO,異步IO,為啥不區分異步阻塞IO和異步非阻塞IO呢?你在阻塞時搞個異步試試,辦不到吧,所以異步只能與非阻塞搭配,也就習慣只寫異步IO了。

一頓理論講下來可能還是比較抽象,那我們再舉個日常生活中的例子,比如中午買飯的過程:

同步阻塞IO就好像,你去食堂吃面條,但是你去這一鍋面條還沒煮好,然后你就一直在那里等啊等,等了一段時間終于做好了(數據準備的過程),但是你還得繼續等工作人員把面條(內核空間)打到你的餐盤里(用戶空間),才能找個桌子開始吃飯。

同步非阻塞IO就好像,你又去食堂吃飯,問大叔飯做好了沒有,告訴你沒有你就離開了,過了一會,你又來飯堂問大叔飯做好了嗎,人家說說做好了,于是你等著把飯打到你的餐盤里,后面這個過程你是得等待的。

異步IO就好像,你在十分焦急的寫BUG,這時到飯點肚子餓了,給食堂大叔打電話,等飯做好了麻煩給我送一份,等到飯好了真的送來直接就能吃了,一直在抓緊寫BUG中間沒有等待(做夢中)

我想大部分同學吃午飯都是第一種同步阻塞IO吧,第二種同步非阻塞IO可能也有,但是不是要重新排隊啊,如果是第三種異步IO的情況,我只能說大哥/姐,我跟你混了~~

總結

  • IO分為同步阻塞IO,同步非阻塞IO,異步IO三類
  • 異步IO有Windows平臺的 IOCP 和 Linux 平臺的 io_uring
  • 從IO讀取數據,需要經歷「內核數據準備好」和「數據從內核態拷貝到用戶態」兩個過程
  • 分析阻塞和非阻塞看是否等待第一個過程,分析同步與異步看是否等待第二個過程

==>> 反爬鏈接,請勿點擊,原地爆炸,概不負責!<<==

人生的岔路口,不知是機會還是風險,邊走邊看吧,畢竟路還是在腳下,空想也到不了終點~

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

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

相關文章

深度學習卷積神經網絡參數計算難點重點

目錄 一、卷積層圖像輸出尺寸 二、池化層圖像輸出尺寸 三、全連接層輸出尺寸 四、卷積層參數數量 五、全連接層參數數量 六、代碼實現與驗證 以LeNet5經典模型為例子并且通道數為1 LeNet5網絡有7層&#xff1a; ? 1.第1層&#xff1a;卷積層 ? 輸入&#xff1a;原始的圖片像素…

c語言數字轉圈

數字轉圈 題干輸入整數 N&#xff08;1≤N≤9&#xff09;&#xff0c;輸出如下 N 階方陣。 若輸入5顯示如下方陣&#xff1a; * 1** 2** 3** 4** 5* *16**17**18**19** 6* *15**24**25**20** 7* *14**23**22**21** 8* *13**12**11**10** 9*輸入樣例3輸出樣例* 1*…

PTA 海盜分贓

P 個海盜偷了 D 顆鉆石后來到公海分贓&#xff0c;一致同意如下分贓策略&#xff1a; 首先&#xff0c;P 個海盜通過抽簽決定 1 - P 的序號。然后由第 1 號海盜提出一個分配方案&#xff08;方案應給出每個海盜分得的具體數量&#xff09;&#xff0c;如果能夠得到包括 1 號在…

linux高級篇基礎理論六(firewalld,防火墻類型,,區域,服務端口,富語言)

??作者&#xff1a;小劉在C站 ??個人主頁&#xff1a; 小劉主頁 ??不能因為人生的道路坎坷,就使自己的身軀變得彎曲;不能因為生活的歷程漫長,就使求索的 腳步遲緩。 ??學習兩年總結出的運維經驗&#xff0c;以及思科模擬器全套網絡實驗教程。專欄&#xff1a;云計算技…

基于戰爭策略算法優化概率神經網絡PNN的分類預測 - 附代碼

基于戰爭策略算法優化概率神經網絡PNN的分類預測 - 附代碼 文章目錄 基于戰爭策略算法優化概率神經網絡PNN的分類預測 - 附代碼1.PNN網絡概述2.變壓器故障診街系統相關背景2.1 模型建立 3.基于戰爭策略優化的PNN網絡5.測試結果6.參考文獻7.Matlab代碼 摘要&#xff1a;針對PNN神…

測試工具JMeter的使用

目錄 JMeter的安裝配置 測試的性能指標 TPS 響應時長 并發連接 和 并發用戶 CPU/內存/磁盤/網絡 負載 性能測試實戰流程 JMeter JMeter快速上手 GUI模式 運行 HTTP請求默認值 錄制網站流量 模擬間隔時間 Cookie管理器 消息數據關聯 變量 后置處理器 CSV 數據文…

中國企業500強的排名也在不斷變化。面對不確定性的挑戰,企業如何應對?

隨著全球經濟的不斷發展和變化&#xff0c;中國企業500強的排名也在不斷變化。面對不確定性的挑戰&#xff0c;企業如何應對&#xff1f;在本文中&#xff0c;挖數據平臺將提供數據源探討中國企業500強在應對不確定性方面的突圍與變革。 一、數據挖掘與分析 從2006年到2023年&…

【電子通識】什么是物料清單BOM(Bill of Material))

BOM (Bill of Materials)是我們常說的物料清單。BOM是制造業管理的重點之一&#xff0c;用于記載產品組成所需要的全部物料&#xff08;Items&#xff09;。物料需求的計算是從最終產品開始&#xff0c;層層往下推算出部件&#xff0c;組件&#xff0c;零件和原材料的需求量。這…

【C++11】nullptr關鍵字使用詳解

系列文章目錄 C11新特性使用詳解-持續更新 https://blog.csdn.net/xiaofeizai1116/category_12498334.html 文章目錄 系列文章目錄一、簡介二、引入nullptr原因1. 消除歧義2. 兼容性問題3. 類型安全 三、使用場景1. 初始化指針變量2. 判斷指針是否為空3. 釋放內存后置為空 四、…

【nlp】3.5 Transformer論文復現:3.解碼器部分(解碼器層)和4.輸出部分(線性層、softmax層)

Transformer論文復現:3.解碼器部分(解碼器層)和4.輸出部分(線性層、softmax層) 3.1 解碼器介紹3.2 解碼器層3.2.1 解碼器層的作用3.2.2 解碼器層的代碼實現3.2.3 解碼器層總結3.3 解碼器3.3.1 解碼器的作用3.3.2 解碼器的代碼實現3.3.3 解碼器總結4.1 輸出部分介紹4.2 線性…

Python---函數定義時缺省參數(參數默認值)

缺省參數也叫默認參數&#xff0c;用于定義函數&#xff0c;為參數提供默認值&#xff0c;調用函數時可不傳該默認參數的值&#xff08;注意&#xff1a;所有位置參數必須出現在默認參數前&#xff0c;包括函數定義和調用&#xff09;。 def user_info(name, age, gender男):pr…

Elaticsearch學習

Elaticsearch 索引 1、索引創建 PUT /index_v1 {"settings": {"number_of_shards": 3,"number_of_replicas": 1},"mappings": {"properties": {"aaa": {"type": "keyword","store&qu…

匯編-CALL和RET指令

CALL指令調用一個過程&#xff0c; 使處理器從新的內存位置開始執行。過程使用RET(從過程返回) 指令將處理器轉回到該過程被調用的程序點上。 CALL指令的動作&#xff1a; 1.將CALL指令的下一條指令地址壓棧(作為子過程返回的地址) 2.將被調過程的地址復制到指令指針寄存器E…

搜維爾科技:Faceware面部捕捉最佳實踐!

視頻源和分辨率&#xff1a; 我們的軟件針對 RGB 彩色素材進行了優化&#xff0c;不支持使用紅外攝像機。 我們建議視頻分辨率為 720p 和 1080p。低于 720p 的分辨率可能會對跟蹤質量產生負面影響&#xff0c;而高于 1080p 的分辨率會導致存儲要求和傳輸時間增加&#xff0c;而…

python——第十三天

uuid 是通用唯一識別碼&#xff08;Universally Unique identifier&#xff09;的縮寫 UUID是一個128比特的數值 uuid模塊&#xff1a; 獲取一個128位&#xff08;比特&#xff09;的永不重復的數字&#xff0c;當然我們使用的時候會轉換為32個的字符串 impor uuud uui…

【Java 進階篇】Jedis:讓Java與Redis輕松對話的利器

在現代軟件開發中&#xff0c;緩存系統是提高系統性能的常見手段之一&#xff0c;而Redis作為一個高性能的緩存數據庫&#xff0c;被廣泛應用于各類系統。如果你是Java開發者&#xff0c;那么使用Jedis庫可以讓你輕松地與Redis進行交互。本文將帶你深入了解Jedis的快速入門&…

c語言-冒泡排序

冒泡排序原理&#xff1a; 冒泡排序是一種簡單直觀的排序算法&#xff0c;它重復地遍歷待排序的元素序列&#xff0c;比較相鄰的兩個元素&#xff0c;如果它們的順序不符合要求&#xff08;例如升序要求前面的元素小于后面的元素&#xff09;&#xff0c;則交換它們的位置。遍歷…

國家開放大學平時作業 練習題

試卷代號&#xff1a;1377 理工英語3 參考試題 一、交際用語&#xff08;共計10分&#xff0c;每小題2分&#xff09; 1-5題&#xff1a;選擇正確的語句完成下列對話&#xff0c;并將答案序號寫在答題紙上。 1.-1 won the first prize in todays speech contest. - …

R語言——圖解taxize,強烈推薦收藏關注,持續更新中

圖解taxize 1. taxize分解思路1.1 圖解說明 2. 針對不同數據庫的函數組2.1 APGⅢ2.2 BOLD&#xff08;barcode of life data system&#xff09; 1. taxize分解思路 taxize可以幫助人們從許多數據庫中獲取信息。 由于要處理的數據庫很多&#xff0c;導致taxize包含的功能函數…

基本鎖介紹

鎖 1、分類 樂觀鎖:在select的時候不會加鎖&#xff0c;是基于程序實現的&#xff0c;所以不會存在死鎖的情況。適用于讀多寫少的場景&#xff08;寫的并發量相對不高&#xff09;&#xff0c;可以提高系統的吞吐量。因為如果寫多的話&#xff0c;樂觀鎖會有很大機率更新失敗…