阻塞
執行緒在執行中如果遇到(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 的情況下利用更多的核。
來看看《深入淺出node.js》對非同步i/o的解釋,在作業系統中,程式執行的空間分為核心空間和使用者空間。我們常常提起的非同步i/o,其實質是使用者空間中的程式不用依賴核心空間中的i/o操作實際完成,即可進行後續任務。
非同步i/o優缺點
使用同步io,它的優點是可以使程式除錯方便,但是它的缺點也是明顯的,程式的執行過程中如果入到一些耗時的io操作,程式的執行都要等待該io的完成,在這個等待的過程中,程式無法充分利用cpu,導致了cpu的閒置,為了充分利用cpu,和io並行操作,常用的方法有2中:
(1)多執行緒單程序
多執行緒的設計之處就是為了在共享的程式空間中,實現並行處理任務,從而達到充分利用cpu的效果。
多執行緒缺點:
其一、執行時(執行緒切換)上下文交換的開銷較大,乙個執行緒大約需要2m的記憶體空間,占用資源較大。
其二、狀態同步(鎖)的問題,它也使得程式的編寫和呼叫複雜化。
(2)單執行緒多程序
為了避免多執行緒造成的使用不便問題,有的語言選擇了單執行緒保持呼叫簡單化,採用啟動多程序的方式來達到充分利用cpu和提公升總體的並行處理能力。它的缺點在於業務邏輯複雜時(涉及多個i/o呼叫),因為業務邏輯不能分布到多個程序之間,事務處理時長要遠遠大於多執行緒模式。
對 同步 非同步 阻塞 非阻塞的理解
老張愛喝茶,廢話不說,煮開水。出場人物 老張,水壺兩把 普通水壺,簡稱水壺 會響的水壺,簡稱響水壺 1 老張把水壺放到火上,立等水開。同步阻塞 老張覺得自己有點傻 2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。同步非阻塞 老張還是覺得自己有點傻,於是變高階了,買了把會響笛的那種水壺...
個人對同步非同步,阻塞非阻塞的理解
以下內容純屬個人理解,如有錯誤,歡迎指出討論 我們經常把同步非同步,阻塞非阻塞,當作單獨的兩個塊來理解,就單獨針對同步非同步理解起來不難,單獨針對阻塞非阻塞理解起來似乎也不難 但是兩個塊放到一起理解似乎總有點含糊不清的感覺 然後有人得出 同步就阻塞,非同步就非阻塞 的錯誤觀念 說個我覺得比較好理解但...
IO模型 對阻塞 非阻塞,同步 非同步的理解
看乙個同學面經的時候看到這個問題,在unp 因此介紹的背景是socket程式設計 上找到了相應的內容介紹 unix下的io模型有五種 socket預設是blocking的,這種情況下,發出乙個系統呼叫,如果當前沒有資料可讀 如果呼叫read 那麼該程序會block直到有資料可讀,然後完成讀取,返回 ...