同步、異步、阻塞和非阻塞的理解

這一段來自:http://blog.csdn.net/feitianxuxue/article/details/8936802 處理大併發之一 對異步非阻塞的理解

阻塞

    線程在執行中如果遇到(I/O 操作)如磁盤讀寫或網絡通信,通常要耗費較長的時間,這時操作系統會剝奪這個線程的 CPU 控制權,使其暫停執行,同時將資源讓給其他的工作線程,這種線程調度方式稱爲 阻塞。當 I/O 操作完畢時,操作系統將這個線程的阻塞狀態解除,恢復其對CPU的控制權,令其繼續執行。這種 I/O 模式就是通常的同步式 I/O(Synchronous I/O)或阻塞式 I/O(Blocking I/O)。

非阻塞

    非阻塞是這樣定義的,當線程遇到 I/O 操作時,不會以阻塞的方式等待 I/O 操作的完成或數據的返回,而只是將 I/O 請求發送給操作系統,繼續執行下一條語句。當操作系統完成 I/O 操作時,以事件的形式通知執行 I/O 操作的線程,線程會在特定時候處理這個事件。

對比阻塞與非阻塞

    阻塞模式下,一個線程只能處理一項任務,要想提高吞吐量必須通過多線程。

    非阻塞模式下,一個線程永遠在執行計算操作,這個線程所使用的 CPU 核心利用率永遠是 100%,I/O 以事件的方式通知。

    在阻塞模式下,多線程往往能提高系統吞吐量,因爲一個線程阻塞時還有其他線程在工作,多線程可以讓 CPU 資源不被阻塞中的線程浪費。

    而在非阻塞模式下,線程不會被 I/O 阻塞,永遠在利用 CPU。多線程帶來的好處僅僅是在多核 CPU 的情況下利用更多的核。


下面這一段轉自:原文來自:博客園(華夏35度)http://www.cnblogs.com/zhangchaoyang 作者:Orisun

同步和異步、阻塞和非阻塞這是兩組概念,說的是不同的事情,同步和阻塞沒有必然的聯繫,異步和非阻塞也沒有必然的聯繫。同步和異步是隻跟IO操作過程中進程的狀態變化有關。阻塞和非阻塞就是進程的兩種狀態。比如你去銀行,排除的話就是一種同步的方式,叫號的話就是異步的方式。排隊必須自己看着什麼時候輪到自己,而叫號則不必,輪到你的時候會觸發一個事件,或者說你會收到一個信號,別人會叫你。不管是排除還是叫號,如果你在等待的過程中不能做其他事情,那就是阻塞模式,否則就是非阻塞模式。同步的時候可以有阻塞和非阻塞,異步的時候也可以有阻塞和非阻塞。

阻塞 I/O

Linux下的I/O操作默認是阻塞I/O,即open和socket創建的I/O都是阻塞I/O。當讀寫操作沒有完成時,函數就不會返回,進程一直阻塞在那裏。

非阻塞I/O    

非阻塞模式的使用並不普遍,因爲非阻塞模式會浪費大量的CPU資源。

網絡編程時listen,recvfrom,connect都會引起阻塞。非阻塞IO通常應用於網絡編程中,IO請求時加上O_NONBLOCK一類的標誌位,函數立刻返回,IO沒有就緒會返回錯誤,需要請求進程主動輪詢不斷髮IO請求直到返回正確
比如調用recvfrom時,如果系統還沒有接收到網絡數據,內核馬上返回一個 EWOULDBLOCK的錯誤。

 當一個應用程序使用了非阻塞模式的套接字,它需要使用一個循環來不停地測試是否一個文件描述符有數據可讀(稱做 polling(輪詢))。應用程序不停的 polling 內核來檢查是否 I/O操作已經就緒。這將是一個極浪費 CPU資源的操作。這種模式使用中不是很普遍。

I/O多路複用

針對批量IP操作時,使用I/O多路複用,非常有好。

在使用 I/O 多路技術的時候,我們調用 select()函數和 poll()函數或epoll函數(2.6內核開始支持),在調用它們的時候阻塞。
當我們調用 select函數阻塞的時候,select 函數等待數據報套接字進入讀就緒狀態。當select函數返回的時候, 也就是套接字可以讀取數據的時候。 這時候我們就可以調用 recvfrom函數來將數據拷貝到我們的程序緩衝區中。
IO複用同非阻塞IO本質一樣,不過利用了新的select系統調用,由內核來負責本來是請求進程該做的輪詢操作。看似比非阻塞IO還多了一個系統調用開銷,不過因爲可以支持多路IO,纔算提高了效率。多路複用的高級之處在於:它能同時等待多個文件描述符,而這些文件描述符(套接字描述符)其中的任意一個進入讀就緒狀態,select()函數就可以返回。

異步I/O

      當我們運行在異步 I/O 模式下時,我們如果想進行 I/O 操作,只需要告訴內核我們要進行 I/O 操作,然後內核會馬上返回。具體的 I/O 和數據的拷貝全部由內核來完成,我們的程序可以繼續向下執行。當內核完成所有的 I/O 操作和數據拷貝後,內核將通知我們的程序。

還有一個生動的例子解釋同步、異步、阻塞和非阻塞 :http://www.cnblogs.com/jogger/archive/2012/09/27/2705386.html

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