这两种不同模型中的哪一种更有效(考虑抖动、处理器缓存的利用、整体设计、一切等)?
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 会更有效率,但我没有听说过这个模型。提前感谢您的评论!