为什么要使用非阻隔或阻隔的插座? [关闭](Why should I use non-block

2019-07-29 10:41发布

首先,我要问的是这是在其中规定最好? 例如实时MMORPG服务器。 如果我创建每个客户端线程,而不是使用非阻塞套接字的? 或者,如果我使用一个包含所有非阻塞套接字一个线程? 你能解释一下我的优势是什么?

Answer 1:

你的问题应该得到一个更长的讨论,但这里是在回答的短刺:

  • 使用阻塞插座意味着只有一个插座可以是活动的在任何时间在任何一个线程(因为它块,同时等待活性)
  • 使用阻塞插座通常比非阻塞套接字容易(异步编程更趋于复杂)
  • 您可以创建每个插槽1个线程,你说,但是线程有开销,是相对于非阻塞解决方案效率极低;
  • 与非阻塞套接字,你可以处理客户端的体积大得多:它可以扩展到几十万在一个单一的过程 - 但是代码变得更复杂一点点

随着非阻塞套接字(在Windows上),你有两个选择:

  • 轮询
  • 基于事件
  • 重叠I / O

重叠I / O会给你最好的性能(千插座/工艺),由于它是最复杂的模型,以了解并正确执行费用。

基本上它归结为性能与编程复杂性。

注意

这就是为什么使用线程/插座模型是一个坏主意一个更好的解释:

在Windows中,创造了大量线程是非常低效的,因为调度程序是无法正确地确定哪些线程应被接收处理器时间并且其不应该。 这再加上每个线程的存储器开销意味着你将在操作系统级别用完的(因为堆栈空间)的内存和处理器周期(因为在管理线程的开销)长的,然后才将耗尽容量来处理套接字连接的。



Answer 2:

我会继续记录的话说,除了对玩具节目几乎所有的东西,你应该使用非阻塞套接字是理所当然的事。

阻止套接字导致一个严重的问题:如果在另一端(或者连接到它的任何部分)的机器阻塞调用过程中出现故障,你的代码最终会阻塞,直到IP堆栈的超时。 在典型的情况下,这是约2分钟,这对于大多数目的完全不能接受的。 只有这样,1中止阻断呼叫终止,使得它的线程-但终止线程本身几乎都是不可接受的,因为它本质上是不可能的清理后,并收回任何资源它分配了。 非阻塞套接字做,如果需要的时候/, 没有做任何事情来进行调用线程琐碎中止通话。

这有可能使阻止套接字工作之类的好,如果你使用多进程模型代替。 在这里,你只需产卵为每个连接一个全新的过程。 这个过程使用阻塞套接字,如果出现错误的时候/你只要杀了整个过程。 操作系统知道如何从一个进程清理资源,所以清理是没有问题的。 它还有其它潜在的问题,但:1)你很可能需要一个过程监控需要时终止进程,以及2)产卵的过程通常是颇有几分不仅仅是创造一个插座更贵。 然而,这可能是一个可行的选择,特别是如果:

  1. 你所面对的是少量的连接在同一时间
  2. 你通常做广泛的处理对每个连接
  3. 你跟本地主机只处理让你给他们连接快速可靠
  4. 你更关心的不是执行优化开发

1.好了,在技术上并不是唯一可行的办法,但大部分方案都比较丑-更具体,我想你的时候添加代码,找出存在的问题,然后解决问题,你”已经比如果你只是使用非阻塞套接字可能做更多的额外工作。



文章来源: Why should I use non-blocking or blocking sockets? [closed]