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

2021-06-21 20:10:34 字數 1234 閱讀 2758

順手寫了個程式對比了一下多執行緒io和單執行緒非同步io的效能差異。需要說明的是,linux上目前的非同步io是由使用者態執行緒模擬的。目前核心原生的aio和glibc中的非同步io都有缺陷,libeio目前感覺比較好(因為nodejs在用)。單執行緒非同步io指的是主線程中控制io的**全部都是在主線程中執行的,libeio內部使用的執行緒對外來說完全不可感知。單執行緒非同步io的好處就是主流程中的控制**完全處於單執行緒環境,可以完全不用考慮鎖的問題。

應用場景客戶端啟動20個執行緒同時從服務端求資料。服務端從磁碟出檔案回給客戶端。服務端有兩種實現1、使用多執行緒每個執行緒服務乙個使用者。2、使用單執行緒和非同步io來服務多個使用者。

測試時服務端的處理器為單核600mhz的armv6(raspberrypi),客戶端為2.5 ghz intel core i5(2013版 mac mini),因此客戶端不會成為性瓶可以體現出服務端的差異。兩台機器用100m網線直連。

多執行緒183393

183505

183792

182878

非同步io

198165

191537

196565

193653

多執行緒12434

13099

12773

12958

非同步io

15293

15073

15974

15631

兩種方案的優缺點對比

1、性上傳統的多執行緒方案占有優勢。不過測程式中多執行緒中完全沒有使用鎖,現實中由於的鎖的限制多執行緒的性將大打折扣。

2、單執行緒非同步io程式中,由於控制**在單執行緒環境中執行,可以完全無鎖。

3、單執行緒非同步io程式中同時服務20個使用者只使用了3個執行緒(libeio使用執行緒模擬非同步io,當前linux上非同步io沒有更好的決方案),多執行緒版本的程式使用了21個執行緒(包括主線程)。由於執行緒多,因此多執行緒版本的記憶體占用比libeio版本了很多。

4、libieo版本的流程沒有多執行緒版本的直觀。

總結單執行緒非同步io的主流程**可以完全無鎖,這個是單執行緒非同步io的最大優勢。在效能損失不多的情況下(和完全無鎖的多執行緒方案對比,現實中完全無鎖的多執行緒環境幾乎不存在),很值得考慮。唯一需要考慮的,單執行緒非同步io可能對多核cpu的利用不如傳統的多執行緒充分。

另外,還可以擴充套件一下,在編寫複雜應用時,除了io等阻塞操作,cpu密集的操作也可以拿出來到單獨的執行緒中執行,盡量把耗時不多的邏輯部分留在單執行緒中,由於執行在單執行緒環境,這樣很大程度上簡化邏輯部分的編寫。

**:

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

2014 08 24 同步i o與非同步i o 執行緒在執行中如果遇到磁碟讀寫或網路通訊 統稱io操作 通常要耗費較長的時間,這時os會剝奪此執行緒的cpu控制權,使其暫停執行,同時將資源讓給其他的工作執行緒,這種執行緒排程方式稱為阻塞。當i o操作完畢時,作業系統將這個執行緒的阻塞狀態解除,恢復其...

非同步和單執行緒

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

單執行緒和非同步

非同步 async 是相對於同步 async 而言的,同步就是一件事一件事的執行。只有前乙個任務執行完畢,才能執行後乙個任務。當js解析執行時,會被引擎分為兩類任務,同步任務 synchronous 和 非同步任務 asynchronous 對於同步任務來說,會被推到執行棧按順序去執行這些任務。對於...