2014-08-24
同步i/o與非同步i/o
執行緒在執行中如果遇到磁碟讀寫或網路通訊(統稱io操作),通常要耗費較長的時間,這時os會剝奪此執行緒的cpu控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為阻塞。當i/o操作完畢時,作業系統將這個執行緒的阻塞狀態解除,恢復其對cpu的控制權,令其繼續執行,這種i/o模式就是同步式i/o或阻塞式i/o。在這種情況下,程式是線下執行的,比如
這種執行方式很好理解,傳統伺服器的處理方式是為每個請求開啟乙個執行緒,在遇到i/o請求的時候阻塞處理。但每個cpu能承受的執行緒數是有限制的,於是達到限制的時候就必須新增新的cpu,而且開啟執行緒是非常消耗資源的。var
fs =
require
("fs"
);
var
data =fs
.readfilesync
("test.txt"
,"utf-8"
);
console
.log
(data
);
console
.log
("over"
);
非同步i/o誕生就解決了上述問題,在非同步i/o模型中,執行緒遇到i/o操作時,不會以阻塞的方式等待i/o操作的完成或資料的返回,而是將i/o請求傳送給作業系統,繼續執行下一條語句。當作業系統完成/io操作時,以事件的形式通知執行i/o操作的執行緒,執行緒會在特定時候處理這個事件。為了處理非同步i/o,執行緒必須有事件迴圈,不斷地檢查有沒有未處理的事件,依次予以處理,典型的非同步程式設計模型有node.js
node函式預設是非同步處理,上述程式執行會先列印出"over",待i/o處理完成,再繼續執行讀檔案操作。var
fs =
require
("fs"
);
fs
.readfile
("test.txt"
,"utf-8"
,function
(err
,data
)else
});
console
.log
("over"
);
可以看到阻塞模式下,乙個執行緒只能處理一項任務,要想提高吞吐量必須通過多執行緒;而非阻塞模式下,乙個執行緒永遠在執行計算操作,這個執行緒所使用的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 前端使用非同步的...