IOCP開發的幾個概念

2021-09-08 02:38:55 字數 1856 閱讀 8297

一、伺服器的吞吐量問題。

我們都知道,基於iocp的開發是非同步io的,也正是這一技術的本質,決定了iocp所實現的伺服器的高吞吐量。

我們舉乙個及其簡化的例子,來說明這一問題。在網路伺服器的開發過程中,影響其效能吞吐量的,有很多因素,在這裡,我們只是把關注點放在兩個方面,即:網路io速度與disk io速度。我們假設:在乙個千兆的網路環境下,我們的網路傳輸速度的極限是大概125m/s,而disk io的速度是10m/s。在這樣的前提下,慢速的disk 裝置會成為我們整個應用的瓶頸。我們假設執行緒a負責從網路上讀取資料,然後將這些資料寫入disk。如果對disk的寫入是同步的,那麼執行緒a在等待寫完disk的過程是不能再從網路上接受資料的,在寫入disk的時間內,我們可以認為這時候server的吞吐量為0(沒有接受新的客戶端請求)。對於這樣的同步讀寫disk,一些的解決方案是通過增加執行緒數來增加伺服器處理的吞吐量,即:當執行緒a從網路上接受資料後,驅動另外單獨的執行緒來完成讀寫disk任務。這樣的方案缺點是:需要執行緒間的合作,需要執行緒間的切換(這是另乙個我們要討論的問題)。而iocp的非同步io本質,就是通過作業系統核心的支援,允許執行緒a以非阻塞的方式向io子系統投遞io請求,而後馬上從網路上讀取下乙個客戶端請求。這樣,結果是:在不增加執行緒數的情況下,iocp大大增加了伺服器的吞吐量。說到這裡,聽起來感覺很像是dma。的確,許多軟體的實現技術,在本質上,與硬體的實現技術是相通的。另外乙個典型的例子是硬體的流水線技術,同樣,在軟體領域,也有很著名的應用。好像話題扯遠了,呵呵:)

二、執行緒間的切換問題。

伺服器的實現,通過引入iocp,會大大減少thread切換帶來的額外開銷。我們都知道,對於伺服器效能的乙個重要的評估指標就是:system\context switches,即單位時間內線程的切換次數。如果在每秒內,執行緒的切換次數在千的數量級上,這就意味著你的伺服器效能值得商榷。context switches/s應該越小越好。說到這裡,我們來重新審視一下iocp。

完成埠的執行緒併發量可以在建立該完成埠時指定(即numberofconcurrentthreads引數)。該併發量限制了與該完成埠相關聯的可執行執行緒的數目(就是前面我在iocp簡介中提到的執行者執行緒組的最大數目)。當與該完成埠相關聯的可執行執行緒的總數目達到了該併發量,系統就會阻塞任何與該完成埠相關聯的後續執行緒的執行,直到與該完成埠相關聯的可執行執行緒數目下降到小於該併發量為止。最有效的假想是發生在有完成包在佇列中等待,而沒有等待被滿足,因為此時完成埠達到了其併發量的極限。此時,乙個正在執行中的執行緒呼叫getqueuedcompletionstatus時,它就會立刻從佇列中取走該完成包。這樣就不存在著環境的切換,因為該處於執行中的執行緒就會連續不斷地從佇列中取走完成包,而其他的執行緒就不能執行了。

完成埠的執行緒併發量的建議值就是你系統cpu的數目。在這裡,要區分清楚的是,完成埠的執行緒併發量與你為完成埠建立的工作者執行緒數是沒有任何關係的,工作者執行緒數的數目,完全取決於你的整個應用的設計(當然這個不宜過大,否則失去了iocp的本意:))。

第三、iocp開發過程中的訊息亂序問題。

使用iocp開發的問題在於它的複雜。我們都知道,在使用tcp時,tcp協議本身保證了訊息傳遞的次序性,這大大降低了上層應用的複雜性。但是當使用iocp時,問題就不再那麼簡單。如下例:

msg1,msg2與msg3的次序也就是不確定的。所以,邏輯處理層的實現,必須考慮訊息亂序的情況,必須考慮多執行緒環境下的程式實現。

在這裡,我把訊息亂序的問題單列了出來。其實在iocp的開發過程中,相比於同步的方式,應該還有其它更多的難題需要解決,這也是與select方式相比,iocp的缺點,實現複雜度高。

IOCP開發的幾個概念

第 一 伺服器的吞吐量問題。我們都知道,基於iocp的開發是非同步io的,也正是這一技術的本質,決定了iocp所實現的伺服器的高吞吐量。我們舉乙個及其簡化的例子,來說明這一問題。在網路伺服器的開發過程中,影響其效能吞吐量的,有很多因素,在這裡,我們只是把關注點放在兩個方面,即 網路io速度與disk...

iOS開發環境配置中的幾個概念

1,certificate 證書 證書分為四種型別,主要資訊是開發者資訊 郵件,id 公鑰 ios development ios distribution apns development ios apns distribution ios 後兩種用來跟蘋果的apns伺服器進行通訊,該通訊使用加密...

Linux的幾個概念

裝置名裝載點 通過裝載點訪問裝置 根目錄 cd 主目錄 cd 不同的使用者有不同的主目錄,但擁有相同的根目錄 點檔案 以點開頭的檔案或目錄,可以作為隱藏目錄 ls 不顯示 ls a 顯示 標準子目錄 bin 命令目錄 boot 系統啟動所需的大部分檔案 dev 裝置檔案和其他特殊檔案 etc 啟動和...