为了在c_中创建一个可伸缩的多用户服务器,这两种服务器中哪一种更有效?您可以看到一个使用begin*方法(如beginacept、beginsend)here和threadpool实现here的异步服务器示例。
我知道什么是线程池以及它是如何工作的,所以我非常了解这个实现是如何工作的。但是异步服务器呢?这会为每个发送、接收和连接事件生成一个线程吗?这与线程池相比有多高效?
我所说的效率只是指速度和内存使用的总体平衡。
编辑:
有人建议我使用begin()方法,但当它们生成一个新线程来处理send、receive或connect事件时,难道不会产生开销吗?还是最终使用某种内部线程池?如果没有,是否有办法使它使用线程池,或者我应该只是滚动我自己的异步套接字服务器?

最佳答案

如果您所说的可伸缩性是指大量的连接,那么除了使用线程池之外,您还应该考虑其他一些方面。
1)如果使用.net3.5,请考虑socketAsyncEventArgs,而不是beginxxx/endxxx。该方法在MSDN Magazine中描述。这些允许更有效地分派和处理底层异步I/O。
2)考虑你的memory usage very carefully。为异步I/O分配的字节[]缓冲区被固定,迫使GC在压缩阶段处理这些缓冲区,而压缩阶段又可能导致负载下的碎片和OutOfMemoryException。此外,还考虑了异步I/O的低级本机问题,如非分页池中的可用内存。
一些可用的技术是对所有挂起的接收使用一个共享的零字节缓冲区,并对将实际传输数据的I/O使用池缓冲区(来自未压缩的内存-loh或本机堆)。

08-04 14:58