使用完成端口模型做一個微型靜態頁面HTTP Server

IOCP已經調好了,下一步就是實現一個靜態頁面的HTTP Server。 

如果有FreeMind則可以下載示意圖:

https://www.kicoy.com/svn/repos/kicoy/trunk/doc/socket%e5%88%9b%e5%bb%ba%e8%bf%87%e7%a8%8b.mm 

這裏是JPG圖片:IOCP

創建完成模口是非常簡單的,只要使用一個API:CreateIoCompletionPort。然後再創建一堆worker線程就ok了。

線程數量上可以參照 cpu數量*2+2,是個經驗公式,也不知道頂不頂用。

這些線程實際上是休眠的,因爲線程的第一句話就是:GetQueuedCompletionStatus,這讓windows可以把這批線程先凍結,等到有連接的時候自動觸發。

監聽線程則一直阻塞在WSAAccept中,當然沒有連接就一直僵在這裏,只是佔了一些內存,並沒有什麼影響。

一旦有連接進來,則WSAAccept就解凍,並且產生一個ConnSocket,把這個socket與CompletPort綁定,之後所有這個socket產生的傳輸就會激活最開始創建過的休眠的線程。

立即在監聽線程中執行WSARecv,這樣會至少解凍一個休眠線程,即GetQueuedCompletionStatus阻塞結束,一個線程激活了。由於這個線程是預創建的,所以比阻塞多線程模型要少一個創建線程的過程,僅僅需要激活即可。

而且數據已經由windows準備好了,不需要再讀一次,緩存區充滿了數據,只要worker線程處理一下就行了。

這時候worker線程是主角,處理了request頭後,返回一個response頭和html內容。處理完畢後close。

這就是一次連接的全過程。

當出現多次併發連接的時候,首先是監聽線程是多個來接受WSAAccept並且綁定CompletPort。綁定後每次WSARecv都激活一個worker線程,而這些線程是預創建的,並且IO數據是由windows預先存在緩存區內,所以響應速度非常快。

據說這就是支撐IIS的完成端口模型,號稱windows下最快IO傳輸。爭取找個環境來試一下。

源碼就在這裏,當然這是kicoy.com的一部分,單獨是不能運行的。

https://www.kicoy.com/svn/repos/kicoy/trunk/src/NetworkUnit.pas

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章