這兩個不同模型中的哪一個會更高效(考慮抖動,處理器緩存利用率,整體設計,所有內容等)?套接字服務器的高效重疊I/O
1 IOCP和旋轉X線程(其中X是計算機具有的處理器的數量)。這意味着我的「服務器」只有1個IOCP(隊列)用於所有請求和X個線程來處理/處理它們。我已閱讀了許多文章,討論這種設計的效率。有了這個模型,我將有1個監聽器也會與IOCP相關聯。讓我們假設我可以弄清楚如何保持數據包/請求同步。
X IOCP(其中X是計算機具有的處理器數量),每個IOCP有1個線程。這意味着每個處理器都有自己的隊列和1個線程來處理/處理它們。有了這個模型,我將有一個單獨的監聽器(不使用IOCP)來處理連接並將SOCKET分配給正確的IOCP(創建的X之一)。讓我們假設我可以找出負載平衡。
使用對兩種設計過於簡化的類推(銀行):
與幾個收銀員到手的交易一行。每個人都在同一行,每個出納員將下一個可用人員排隊。
每個收銀臺都有自己的線路和人「擺」到這些線路
這兩個設計之間,哪一個更高效的之一。在每個模型中,重疊I/O結構將使用帶有MEM_COMMIT的VirtualAlloc(與「新」相對),因此交換文件不應該成爲問題(無分頁)。根據我對它的描述,將VirtualAlloc與MEM_COMMIT一起使用,內存被保留,不會被分頁。這將允許SOCKETS將傳入的數據寫入我的緩衝區而不經過中間層。所以我不認爲顛簸應該是一個因素,但我可能是錯的。
有人告訴我#2會更有效率,但我沒有聽說過這種模式。預先感謝您的意見!
我不確定,但是#2甚至工作?是否有可能通過幾個不同的線程監聽同一套接字? –
是的,這是可能的。至少,在unix上,我確信windows沒有什麼不同 – rvs
我會做的是有一個單獨的監聽器對象,它監聽輸入連接。該對象會將SOCKET分配給其中一個IOCP。每個IOCP都不會聽。 – BabelFish