同步与异步,阻塞与非阻塞的区别
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種都是同步,最后一種才是異步。
原文:https://www.cnblogs.com/chaser24/p/6112071.html
分類:?Linux系統編程總結
以上是生活随笔為你收集整理的同步与异步,阻塞与非阻塞的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tensorflow op tf.g
- 下一篇: TF.VARIABLE和TENSOR的区