多執行緒同步I O和單執行緒非同步I O

2021-06-28 10:56:36 字數 1475 閱讀 7036

2014-08-24

同步i/o與非同步i/o

執行緒在執行中如果遇到磁碟讀寫或網路通訊(統稱io操作),通常要耗費較長的時間,這時os會剝奪此執行緒的cpu控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為阻塞。當i/o操作完畢時,作業系統將這個執行緒的阻塞狀態解除,恢復其對cpu的控制權,令其繼續執行,這種i/o模式就是同步式i/o或阻塞式i/o。在這種情況下,程式是線下執行的,比如

var

fs =

require

("fs"

);var

data =fs

.readfilesync

("test.txt"

,"utf-8"

);console

.log

(data

);console

.log

("over"

);

這種執行方式很好理解,傳統伺服器的處理方式是為每個請求開啟乙個執行緒,在遇到i/o請求的時候阻塞處理。但每個cpu能承受的執行緒數是有限制的,於是達到限制的時候就必須新增新的cpu,而且開啟執行緒是非常消耗資源的。

非同步i/o誕生就解決了上述問題,在非同步i/o模型中,執行緒遇到i/o操作時,不會以阻塞的方式等待i/o操作的完成或資料的返回,而是將i/o請求傳送給作業系統,繼續執行下一條語句。當作業系統完成/io操作時,以事件的形式通知執行i/o操作的執行緒,執行緒會在特定時候處理這個事件。為了處理非同步i/o,執行緒必須有事件迴圈,不斷地檢查有沒有未處理的事件,依次予以處理,典型的非同步程式設計模型有node.js

var

fs =

require

("fs"

);fs

.readfile

("test.txt"

,"utf-8"

,function

(err

,data

)else

});

console

.log

("over"

);

node函式預設是非同步處理,上述程式執行會先列印出"over",待i/o處理完成,再繼續執行讀檔案操作。

可以看到阻塞模式下,乙個執行緒只能處理一項任務,要想提高吞吐量必須通過多執行緒;而非阻塞模式下,乙個執行緒永遠在執行計算操作,這個執行緒所使用的cpu核心利用率永遠是100%, i/o 以事件的方式通知。

node的非同步i/o

多執行緒帶來的好處是在多核cpu的情況下利用更多的核,而node.js的單執行緒也能帶來同樣的好處,node.js使用了單執行緒、非阻塞的事件程式設計模式。

單執行緒事件驅動的非同步i/o有個缺點就是非同步程式不是很好理解,編寫非同步程式比較困難。

「多執行緒IO」和「單執行緒非同步IO」的對比

順手寫了個程式對比了一下多執行緒io和單執行緒非同步io的效能差異。需要說明的是,linux上目前的非同步io是由使用者態執行緒模擬的。目前核心原生的aio和glibc中的非同步io都有缺陷,libeio目前感覺比較好 因為nodejs在用 單執行緒非同步io指的是主線程中控制io的 全部都是在主線...

同步非同步單執行緒多執行緒初級理解

對於我開始接觸同步非同步單執行緒多執行緒的概念的時候,都是分別理解同步和非同步 單執行緒和多執行緒概念,當看到 使用同步方法保證執行緒安全 時愚昧的理解為那就是單執行緒咯 於是就陷入了困惑,同步等於單執行緒嗎?下面是我自己不成熟的理解,理解的不是很全面,大家僅供參考,看看就好,歡迎批評改正,深刻的理...

非同步和單執行緒

什麼是非同步 對比同步 非同步 不會有阻塞 console.log 100 settimeout function 1000 console.log 300 同步 會阻塞,需要等待確認後才會繼續執行 console.log 100 alert 200 console.log 300 前端使用非同步的...