2015-10-01 32 views
2

RIO這裏代表Windows8'註冊I/O'網絡擴展。通過查看示例代碼,似乎無論您是將RIONotify與事件還是IO完成端口一起使用,您基本上最終都會編寫相同的循環,並且具有幾乎相同的性能特徵。循環體:IOCP的RIO與事件有關嗎?

RIONotify() [event or IOCP] 
Wait [on the event, or using GetQueuedCompletionStatus()] 
RIODequeueCompletion() 
// Process the dequeued events 

基本上好像IO完成端口的使用情況提供了「事件」通知/等待沒有額外的功能,因爲消息的實際隊列與RIODequeueCompletion完成。所以使用事件或IOCP無關緊要。我的問題是,我忽略了模型之間的任何有趣或重要的區別?

回答

2

如果您使用帶IOCP的RIO,您可以通過調用RIODequeueCompletion()一次將多個完成排隊,然後立即調用RIONotify()以允許更多通知,然後讓線程處理完成你用RIODequeueCompletion()檢索。如果有更多的完成可用,另一個線程將變爲活動狀態並可以執行相同的操作。這可能會或可能不會提高您在單個線程輪詢循環中的性能。

我有這個here的一些示例代碼,以及關於各種RIO設計和「標準」UDP服務器設計here的相對性能的一些想法。

+0

謝謝!我讀過你的文章,並且讚賞這個額外的解釋。但原則上,仍然可以通過手動分配在一些工作線程中調用RIODequeue完成的工作來手動擴展多個接收線程*,而無需手動IOCP。 IOCP更關心如何比表現性更方便嗎? –

+1

你可以手動做,但爲什麼要麻煩? IOCP將更加高效和明顯。其他任何事情都可能需要你「提前」喚醒線程來輪詢完成。 –

3

RIO是關於向內核註冊緩衝區以節省開銷和更高效的隊列管理。這不是一個根本性的轉變。只需a lot less overhead

IOCP不是提高個人行爲的表現。它關於使用更少的線程和更少的上下文切換。 RIO需要更進一步。