同步與異步,阻塞與非阻塞的區別

同步與異步,阻塞與非阻塞的區別

轉載:https://www.cnblogs.com/chaser24/p/6112071.html

1、概念剖析

相信很多從事linux後臺開發工作的都接觸過同步&異步、阻塞&非阻塞這樣的概念,也相信都曾經產生過誤解,比如認爲同步就是阻塞、異步就是非阻塞,下面我們先剖析下這幾個概念分別是什麼含義。

同步: 所謂同步,就是在發出一個功能調用時,在沒有得到結果之前,該調用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。

例如普通B/S模式(同步):提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能幹任何事

異步: 異步的概念和同步相對。當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者。

例如 ajax請求(異步): 請求通過事件觸發->服務器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

阻塞: 阻塞調用是指調用結果返回之前,當前線程會被掛起(線程進入非可執行狀態,在這個狀態下,cpu不會給線程分配時間片,即線程暫停運行)。函數只有在得到結果之後纔會返回。

有人也許會把阻塞調用和同步調用等同起來,實際上他是不同的。對於同步調用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數沒有返回,它還會搶佔cpu去執行其他邏輯,也會主動檢測io是否準備好。

非阻塞 非阻塞和阻塞的概念相對應,指在不能立刻得到結果之前,該函數不會阻塞當前線程,而會立刻返回。

再簡單點理解就是:

\1. 同步,就是我調用一個功能,該功能沒有結束前,我死等結果。 \2. 異步,就是我調用一個功能,不需要知道該功能結果,該功能有結果後通知我(回調通知) \3. 阻塞,就是調用我(函數),我(函數)沒有接收完數據或者沒有得到結果之前,我不會返回。 \4. 非阻塞,就是調用我(函數),我(函數)立即返回,通過select通知調用者

同步IO和異步IO的區別就在於:數據拷貝的時候進程是否阻塞

阻塞IO和非阻塞IO的區別就在於:應用程序的調用是否立即返回

綜上可知,同步和異步,阻塞和非阻塞,有些混用,其實它們完全不是一回事,而且它們修飾的對象也不相同。

2、五種IO模型

在瞭解了同步與異步、阻塞與非阻塞概念後,我們來講講linux的五種IO模型:

1)阻塞I/O(blocking I/O) 2)非阻塞I/O (nonblocking I/O) 3) I/O複用(select 和poll) (I/O multiplexing) 4)信號驅動I/O (signal driven I/O (SIGIO)) 5)異步I/O (asynchronous I/O (the POSIX aio_functions))

其中前4種都是同步,最後一種纔是異步。

2.1、阻塞I/O

應用程序調用一個IO函數,導致應用程序阻塞,等待數據準備好。 如果數據沒有準備好,一直等待….數據準備好了,從內核拷貝到用戶空間,IO函數返回成功指示。

阻塞I/O模型圖:在調用recv()/recvfrom()函數時,發生在內核中等待數據和複製數據的過程。

img當調用recv()函數時,系統首先查是否有準備好的數據。如果數據沒有準備好,那麼系統就處於等待狀態。當數據準備好後,將數據從系統緩衝區複製到用戶空間,然後該函數返回。在套接應用程序中,當調用recv()函數時,未必用戶空間就已經存在數據,那麼此時recv()函數就會處於等待狀態。

2.2、非阻塞I/O

非阻塞IO通過進程反覆調用IO函數(多次系統調用,並馬上返回);在數據拷貝的過程中,進程是阻塞的

我們把一個SOCKET接口設置爲非阻塞就是告訴內核,當所請求的I/O操作無法完成時,不要將進程睡眠,而是返回一個錯誤。這樣我們的I/O操作函數將不斷的測試數據是否已經準備好,如果沒有準備好,繼續測試,直到數據準備好爲止。在這個不斷測試的過程中,會大量的佔用CPU的時間。

img

2.3、IO複用

主要是select和epoll;對一個IO端口,兩次調用,兩次返回,比阻塞IO並沒有什麼優越性;關鍵是能實現同時對多個IO端口進行監聽; I/O複用模型會用到select、poll、epoll函數,這幾個函數也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數。

img

img

2.4、信號驅動IO

首先我們允許套接口進行信號驅動I/O,並安裝一個信號處理函數,進程繼續運行並不阻塞。當數據準備好時,進程會收到一個SIGIO信號,可以在信號處理函數中調用I/O操作函數處理數據。

img

2.4、異步IO

當一個異步過程調用發出後,調用者不能立刻得到結果。實際處理這個調用的部件在完成後,通過狀態、通知和回調來通知調用者的輸入輸出操作

img

最後,總結比較下五種IO模型:

img


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章