代码之家  ›  专栏  ›  技术社区  ›  rony l

阻塞的线程占用哪些资源

  •  7
  • rony l  · 技术社区  · 14 年前

    在异步编程模型中编写代码(更具体地说,使用回调而不是阻塞线程)的主要目的之一是最小化系统中阻塞线程的数量。

    但是阻塞的线程呢?为什么减少他们的数量如此重要?

    例如,当等待来自web服务器的响应时,一个线程被阻塞,不占用任何CPU时间,也不参与任何上下文切换。

    所以我的问题是: 除了RAM(每个线程大约1MB?)阻塞的线程占用了哪些其他资源?

    在什么情况下,这一成本才是编写异步代码的真正理由(代价可能是,例如,将良好的一致性方法拆分为许多beginXXX和EndXXX方法,并将参数和局部变量移动为类字段)。

    1. 更多线程意味着更多地锁定公共资源

    2. 更多的线程意味着更多的创建和处理线程,这是非常昂贵的

    3. 系统肯定会耗尽线程/RAM,然后停止为客户端提供服务(在web服务器场景中,这实际上会导致服务宕机)

    3 回复  |  直到 7 年前
        1
  •  6
  •   Reed Copsey    14 年前

    所以我的问题是:除了RAM(每个线程大约1MB?)阻塞的线程占用了哪些其他资源?

    这是最大的一个。也就是说,有一个原因是.NET中的线程池在3.5中允许每个内核有这么多线程 the default was 250 worker threads per core in the system

    但是,我认为,从代码管理的角度来看,减少阻塞线程的数量是值得的。每一个被阻塞的线程都是一个操作,在某个时刻,该操作应该返回并被解除阻塞。有许多这样的代码意味着您需要管理一组相当复杂的代码。保持这个数字的减少将有助于保持代码库的简单性和可维护性。

    现在,这常常是一种痛苦。这在很大程度上取决于场景。这个 Task<T> 但是.NET 4中的类在很多情况下都会改进这个特性。与以前使用APM(BeginXXX/EndXXX)甚至EAP相比,使用TPL的痛苦要小得多。

    improving this situation in the future . 他们的目标是使异步代码更易于编写,以便更频繁地使用它。

        2
  •  0
  •   BrokenGlass    14 年前

    除了来自被阻塞线程可能持有锁的任何资源外,还需要考虑线程池的大小。如果您已经达到最大线程池大小(如果我正确地记得.NET 4是最大线程数是每CPU 100),那么在至少一个线程被释放之前,您将无法在线程池上运行任何其他操作。

        3
  •  0
  •   500 - Internal Server Error    14 年前

    另一方面,拥有大量线程必然会使任务调度程序陷入困境,因为它必须跟踪线程(自上一个勾号以来,线程已变得可运行,依此类推)。