在设计服务器时,我们正在考虑两种方法:
异步(基于选择)方法,因此后端rpc可以在单个线程中并行化。
一种同步方法,其中每个后端rpc在线程池的另一个线程中处理。
存在权衡:1具有更好的性能,2具有更少的代码复杂性。 机器是多核还是64位,1真的很重要吗?
答案 0 :(得分:2)
我建议您阅读有关ACE
的这些书籍获取有关允许您创建高效服务器的模式的想法。
答案 1 :(得分:0)
我认为它应该是相反的,async select()方法使代码更简单,因为没有涉及线程同步。
您需要做的就是将套接字句柄列表传递给select()函数。它将阻塞并仅在一个或多个套接字句柄中发生某些事件时返回。与使用线程池相反,您必须拥有一个作业调度队列,其中线程池中的所有线程都可以从中获取作业。
异步select()方法的缺点是它不会随着处理器核心的数量而扩展,因为所有内容都是在一个线程中执行的。
答案 2 :(得分:0)
在不了解有关服务器要求的更多详细信息的情况下,很难确定哪种方法可能为您提供更好的性能和/或降低代码复杂性。
有趣的是,性能和简单性通常在现实生活中的服务器设计中一起使用(但是提出简单的设计很难)。 select / poll本身不会自动为您提供更好的性能。并且线程池肯定不会降低您的代码复杂性。回答你的问题:1仍然很重要。异步设计不能很好地扩展多进程机器,但只有当您的服务器在一个进程上运行时才会这样。如果您的服务器设计为在多进程机器上生成多个进程,该怎么办?不同的进程可以在不同的用户帐户下运行,并具有不同的安全设置。虚拟机怎么样?每个进程一个线程并不意味着您无法利用多核机器。
然而,我真的记不起上次我看到基于异步select()的真实服务器设计了。也许在我上大学时的课本上,而不是任何真正的制作系统。
答案 3 :(得分:0)
这是相关的读物(它是一种少数报告):
http://www.usenix.org/events/hotos03/tech/full_papers/vonbehren/vonbehren.pdf
这也是一个很好的资源:
http://www.kegel.com/c10k.html
请记住,在某种程度上,您可以将这两种方法结合起来,以最大化多核架构的实用性。假设您的服务器(“Krumpets here!”;)是可以分配的 - 这意味着您可以在同一台机器上运行它的多个实例 - 使用select编写服务器,然后为每个CPU内核运行一个服务器实例。