簡述linux同步與異步、阻塞與非阻塞概念以及五種IO模型


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()函數時,發生在內核中等待數據和復制數據的過程。

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

2.2、非阻塞I/O

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

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

2.3、IO復用

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

 

2.4、信號驅動IO

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

 

 2.4、異步IO

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

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

 

 

參考鏈接:http://www.360doc.com/content/16/0425/12/9075092_553624380.shtml   這里有各種模型優缺點分析

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM