有一个类似的问题被问到before,但我想再次提出,希望有人能帮助清除一些事情。作为一个实验,我尝试写一个天真的"非阻塞"不使用NIO的Java服务器,基本上需要三个线程:
accept()
新的套接字连接,并将每个新套接字放入队列InputQueue
在上一个问题中,有人指出Java NIO的select()
机制远比在每个套接字上轮询好得多,并且在每次通过队列后稍微休眠一下。我知道选择在理论上是如何运作的,但是我很难理解的主要内容如下:如果民意调查是坏的和低效的,那么select()
如何做到这一点呢?
更新:我找到了this page,它更清楚地了解了原生select()
如何在幕后工作。有趣的是,确实,我最初的推测似乎是正确的:select()
以线性方式工作,探测每个请求的文件描述符,类似于轮询机制的作用:
他们[
select()
和poll()
]都处理文件描述符 线性方式。你要求他们检查的描述符越多,速度越慢 他们得到。只要你超过一百个文件描述符 左右 - 当然取决于你的CPU和硬件 - 你将开始 注意到仅仅等待文件描述符活动和 在检查它是哪个文件描述符后,需要一个 重要的时间,成为一个瓶颈。
答案 0 :(得分:1)
它调用操作系统中的select()
方法,其中: