当前位置: 首页 > 面试题库 >

每个客户端模型或NIO反应器模式的旧I / O线程?

訾渝
2023-03-14
问题内容

我正在编写多人游戏的服务器端网络。该游戏是RPG,绝对最大容量为2000名玩家,但实际上可能会达到300名左右,尽管可能更高或更低。在最长的时间内,每次我必须进行涉及很多客户端的网络连接时,我都坚持使用NIO,因为它不需要使用数百个线程。最近,我遇到了一个PowerPoint演示文稿,其中详细描述了这两种模型,并且几乎使每个客户端线程模型看起来优于NIO。我还找到了一些地方,指出旧的IO实际上也可以胜过NIO。

PowerPoint可以在这里找到(它有些旧):http
:
//www.mailinator.com/tymaPaulMultithreaded.pdf。

我还没有写任何内容,因此如果我必须更改整个网络设计,从一开始就对我来说不是问题。我没有时间压力。最初,我是用NIO设计一个反应堆模式实现(选择一个事件,调度一个处理程序来处理该事件)。

可以在这里找到更多信息:http :
//en.wikipedia.org/wiki/Reactor_pattern

我的整个反应堆实现都设计为使用单个线程。自从我读到旧的IO可以胜过竞争对手以来,它实际上使我陷入了困境。我不想设计一个复杂的NIO系统,该系统使用多个线程只是为了充分利用所有CPU能力,但是我也想让一个应用程序使用300多个线程。哪种设计最适合我的目的?每个客户端线程的优势在于,它本质上确实利用了所有CPU的功能,但同时又使系统陷入瘫痪。更不用说,单个线程的堆栈大小会占用大量内存(乘以几百倍时)。我应该坚持使用反应堆模式吗?

我知道这个问题有点模棱两可,但是我觉得我需要针对自己的情况提出一个具体的问题,因为我无法在此站点或解决此类问题的网站上找到问题。曾经有一款游戏,但是这款游戏原本可以容纳成千上万的玩家。

非常感谢!如果您需要任何澄清,请询问!


问题答案:

我不想设计一个复杂的NIO系统,该系统使用多个线程只是为了充分利用所有CPU能力,但是我也想让一个应用程序使用300多个线程。哪种设计最适合我的目的?

我们的JVM连续运行着超过500个线程(现在,它们的数量约为700个),峰值在1000多个。我认为没有理由认为800线程在某种程度上值得“挑战”。当您达到10,000个线程(作为停球数目)时,我会开始担心-
如果您在32位以下运行,可能会更少。当进入1000年代时,您当然将不得不分配更多的内存,但是1k线程以下的任何东西都不应该成为问题。这是有关线程创建编号的好页面。

当您拥有 大量
不经常使用IO的连接时,NIO效率最高。它解决了异步通信方面的许多问题,并且您可以使用NIO做一些事情,从功能的角度来看,“旧IO”无法做到(例如可中断通道和非阻塞IO),但是单线程处理程序是一个更简单的模型,在许多配置中它可以胜过NIO实现,对此我并不感到惊讶。使用NIO,您可以在Java代码中执行很多操作,而这些操作是在JVM中甚至在本机代码中的内核中完成的。流的复用和就绪IO的处理都是使用“旧IO”模型“免费”获得的(就复杂性而言)。

我会保持简单,并坚持使用“每个客户端线程”模式,直到您有充分的理由应对复杂性问题为止。



 类似资料:
  • 问题内容: 每个连接异步套接字的非阻塞Java NIO仍然比标准线程慢吗? 另外,如果要在每个连接中使用线程,是仅创建新线程还是使用很大的线程池? 我正在用Java写一个MMORPG服务器,如果有足够强大的硬件,它应该能够轻松扩展10000个客户端,尽管最大客户端数量是24000(由于15000个线程,我认为每个连接模型的线程都无法达到) Java中的限制)。从三年前的一篇文章中,我听说每个连接模

  • 绝大部分的嵌入式系统都包括一些 I/O(Input/Output,输入 / 输出)设备,例如仪器上的数据显示屏、工业设备上的串口通信、数据采集设备上用于保存数据的 Flash 或 SD 卡,以及网络设备的以太网接口等,都是嵌入式系统中容易找到的 I/O 设备例子。 本章主要介绍 RT-Thread 如何对不同的 I/O 设备进行管理,读完本章,我们会了解 RT-Thread 的 I/O 设备模型,

  • 本文向大家介绍NIO (New I/O)相关面试题,主要包含被问及NIO (New I/O)时的应答技巧和注意事项,需要的朋友参考一下 2.1 NIO 简介 NIO是一种同步非阻塞的I/O模型,在Java 1.4 中引入了NIO框架,对应 java.nio 包,提供了 Channel , Selector,Buffer等抽象。 NIO中的N可以理解为Non-blocking,不单纯是New。它支持

  • 主要函数 函数 描述 [[epoll_create epoll_create]] 创建一个epoll的文件描述符 [[epoll_ctl epoll_ctl]] epoll的事件注册函数 [[epoll_wait epoll_wait]] 收集在epoll监控的事件中已经发送的事件 结构体 epoll_event typedef union epoll_data { void *ptr;

  • 本文向大家介绍C++中I/O模型之select模型实例,包括了C++中I/O模型之select模型实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++中I/O模型的select模型用法。分享给大家供大家参考。具体实现方法如下: 效果如下图所示: 希望本文所述对大家的C++程序设计有所帮助。

  • 本文向大家介绍探索Java I/O 模型的演进,包括了探索Java I/O 模型的演进的使用技巧和注意事项,需要的朋友参考一下 相关概念 同步和异步 描述的是用户线程与内核的交互方式: 同步是指用户线程发起 I/O 请求后需要等待或者轮询内核 I/O 操作完成后才能继续执行; 异步是指用户线程发起 I/O 请求后仍继续执行,当内核 I/O 操作完成后会通知用户线程,或者调用用户线程注册的回调函数。