1. 程式人生 > >Linux下阻塞與非阻塞,同步與非同步的關係及IO模型

Linux下阻塞與非阻塞,同步與非同步的關係及IO模型

一、阻塞與非阻塞,同步與非同步的關係

1、同步

  同步,就是在發出一個功能呼叫時,在沒有得到結果之前,該呼叫就不返回也就是說事情必須一件一件地做,等前一件做完了才能做下一件事。

2、非同步

  非同步,就是在發出一個功能呼叫時,呼叫者不會立刻得到結果。實際處理這個呼叫的部件是在呼叫發出後,通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。

3、阻塞

  阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起(執行緒進入非可執行狀態。在這個狀態下,cpu不會給執行緒分配時間片,即執行緒暫停執行)。函式只有在得到結果之後才會返回。

4、非阻塞

  非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函式不會阻塞當前執行緒

,而會立刻返回。

5、總結

  同步和非同步是一個過程,阻塞和非阻塞是執行緒的一種狀態

  同步和非同步描述的是獲得功能呼叫(結果)的方式。阻塞和非阻塞描述的是在獲得功能呼叫(結果)的過程中,當前執行緒的狀態。

同步,就是我呼叫一個功能,該功能沒有結束前,我死等結果。
非同步,就是我呼叫一個功能,不需要知道該功能結果,該功能有結果後通知我(回撥通知)
阻塞, 就是呼叫我(函式),我(函式)沒有接收完資料或者沒有得到結果之前,我不會返回。
非阻塞,就是呼叫我(函式),我(函式)立即返回,呼叫者通過忙輪詢去獲取結果。

二、Linux下五種IO模型

1、阻塞IO

在這裡插入圖片描述

  分析:從上圖可以看到在整個過程中,當用戶程序進行系統呼叫時,核心就開始了I/O的第一個階段,準備資料到緩衝區中,當資料都準備完成後,則將資料從核心緩衝區中拷貝到使用者程序的記憶體中,這時使用者程序才解除block的狀態重新執行。

  例如:我要去飯堂吃飯,這時飯堂的人很多,我就得排隊買飯,排隊的時間被浪費了,

2、非阻塞 I/O

在這裡插入圖片描述

  分析:從上圖可以看到在I/O執行的兩個階段中,使用者程序只有在第二個階段被阻塞了,而第一個階段沒有阻塞,但是在第一個階段中,使用者程序需要盲等,不停的去輪詢核心,看資料是否準備好了

  例如:我要去飯堂吃飯,這時飯堂的人很多,一般來說我需要排隊買飯,但我們飯堂的管理最近變的比較人性化,你點完飯後,會給你一個號碼,但飯堂噪聲很大,我不得不頻繁的詢問我的飯是否做好了,但是我可以利用之前排隊的時間去買瓶飲料喝!

3、多路複用IO

在這裡插入圖片描述

  分析:從上圖可以看到在I/O複用模型中,由於非阻塞方式需要不斷主動輪詢,輪詢佔據了很大一部分過程,輪詢會消耗大量的CPU時間,而 “後臺” 可能有多個任務在同時進行。如果迴圈查詢多個任務的完成狀態,只要有任何一個任務完成,就去處理它。輪詢不是程序的使用者態。這時 “IO 多路複用”就出現了。即UNIX/Linux 的 select、poll、epoll

IO多路複用是阻塞在select,epoll這樣的系統呼叫之上,而沒有阻塞在真正的I/O系統呼叫如recvfrom之上。從整個IO過程來看,他們都是順序執行的,因此可以歸為同步模型(synchronous)。都是程序主動等待且向核心檢查狀態。

  例如:我要去飯堂吃飯,這時飯堂的人很多,點完飯後,我會拿到一個號碼,以前我不得不頻繁的詢問我的飯做好了沒,但是最近飯堂安裝了一塊電子顯示屏,你的飯好了就會在屏上顯示出來,這時候我就不用頻繁的去問了,直接看電子顯示屏就醒了,然後我就可以利用這個時間去超市買個牙膏了。

4、訊號驅動I/O

在這裡插入圖片描述

  分析:從上圖可以看出,只有在I/O執行的第二階段阻塞了使用者程序,而在第一階段是沒有阻塞的。該模型在I/O執行的第一階段,當資料準備完成之後,會主動的通知使用者程序資料已經準備完成,即對使用者程序做一個回撥。該通知分為兩種,一為水平觸發,即如果使用者程序不響應則會一直髮送通知,二為邊緣觸發,即只通知一次。

  例如:我要去飯堂吃飯,這時飯堂的人很多,點完飯後,我會拿到一個號碼,雖然說飯堂安裝了一塊電子顯示屏,但我在玩手機時還不得不擡頭看一下顯示屏上有我的號碼沒,最近飯堂買了一個大喇叭,哪個號碼好了,賣飯的阿姨就會用喊,雖說飯堂有點吵,但這個聲音還是可以聽到的,這樣我就可以專心的低頭玩手機了。

5、非同步 I/O

在這裡插入圖片描述

  分析:從上圖可以看出,在該模型中,當用戶程序發起系統呼叫後,立刻就可以開始去做其它的事情,然後直到I/O執行的兩個階段都完成之後,核心會給使用者程序傳送通知,告訴使用者程序操作已經完成了。

  例如:我要去飯堂吃飯,估計這會飯堂的人很多,但最近我們飯堂可以叫外賣了,這樣就省事多了,我直接打個電話,訂份飯送到我們宿舍,而我現在就可以利用原來去飯堂路上和等飯的時間寫部落格了。

參考:https://www.toutiao.com/i6618683062395863560/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1541693336&app=news_article&utm_source=mobile_qq&iid=41695181029&utm_medium=toutiao_android&group_id=6618683062395863560
https://blog.csdn.net/baiye_xing/article/details/74331041