【发布时间】:2011-02-12 15:36:41
【问题描述】:
这两种不同的模型中哪一种会更有效(考虑抖动、处理器缓存的利用、整体设计、一切等等)?
1 IOCP 和启动 X 线程(其中 X 是计算机拥有的处理器数量)。这意味着我的“服务器”对于所有请求和 X 线程只有 1 个 IOCP(队列)来服务/处理它们。我已经阅读了许多讨论这种设计效率的文章。使用此模型,我将拥有 1 个也与 IOCP 关联的侦听器。让我们假设我可以弄清楚如何保持数据包/请求同步。
X IOCP(其中 X 是计算机拥有的处理器数量)并且每个 IOCP 有 1 个线程。这意味着每个处理器都有自己的队列和 1 个线程来服务/处理它们。使用此模型,我将有一个单独的侦听器(不使用 IOCP)来处理传入连接并将 SOCKET 分配给正确的 IOCP(创建的 X 之一)。让我们假设我可以弄清楚负载平衡。
对两种设计(一家银行)使用过于简化的类比:
一行有几个收银员来处理交易。每个人都排在同一条线上,每个收银员接下一个可用的人。
每个收银员都有自己的线路,人们被“放置”到其中一条线路中
在这两种设计之间,哪一种更高效。在每个模型中,重叠 I/O 结构将使用带有 MEM_COMMIT 的 VirtualAlloc(而不是“新”),因此交换文件不应成为问题(无分页)。根据向我描述的方式,将 VirtualAlloc 与 MEM_COMMIT 一起使用,内存被保留并且不会被分页。这将允许 SOCKETS 将传入数据直接写入我的缓冲区,而无需通过中间层。所以我不认为颠簸应该是一个因素,但我可能错了。
有人告诉我#2 会更有效率,但我没有听说过这个模型。提前感谢您的 cmets!
【问题讨论】:
-
我不确定,但 #2 是否有效?是否可以通过多个不同的线程在同一个套接字上监听?
-
是的,有可能。至少,在 unix 上,我确信 windows 在这方面没有什么不同
-
我要做的是有一个单独的 Listener 对象来监听传入的连接。该对象会将 SOCKET 分配给 IOCP 之一。每个 IOCP 都不会听。
标签: windows sockets visual-c++ performance io-completion-ports