【问题标题】:What is the advantage of having a small stack of a thread?拥有一小堆线程有什么好处?
【发布时间】:2020-04-24 10:08:19
【问题描述】:

我正在研究 POSIX 线程,发现有一种方法可以更改堆栈大小;我仍然是通用操作系统的门外汉;那么拥有一个小堆栈有什么好处,我会在运行时节省内存吗?在嵌入式系统中输入?

【问题讨论】:

  • 一个因素:每个线程都需要一个单独的堆栈。因此,较小的堆栈将允许更多的并发线程。虽然需要认真重新考虑任何具有如此多线程的应用程序的设计,这会成为一个问题。
  • 当然,每个线程都有一个堆栈,在我见过的 linux 中,该堆栈默认为 8Mb。如果你把它变小,那么你会节省一些内存。除非您使用资源非常有限的嵌入式设备,否则我不会担心。这些天内存又便宜又充裕,我从来没有修改过堆栈大小。
  • 在一个直到页面被触摸才分配的操作系统(如 Linux)上,拥有更大的堆栈很可能不需要任何成本。
  • 请注意,给你的线程一个更小的堆栈并不是利用设置堆栈大小能力的唯一方法——你也可以使它更大。例如,如果您的线程使用许多大型的堆栈分配对象,这可能很重要。
  • @stark:这不是真的,并且错过了“分配”未定义。无论如何,必须立即分配虚拟地址空间,在任何现代 32 位系统上,这将成为限制因素。此外,如果启用了提交记帐(这样您就不会遇到意外的 OOM-killing),它也会按照提交的意义进行分配。那么,唯一没有“分配”的情况就是内存可以用作缓存,直到它(可能永远不会)需要作为堆栈。

标签: c operating-system pthreads posix embedded-linux


【解决方案1】:

小筹码有什么好处

主要好处是您可以创建更多线程。

在 32 位操作系统(4GiB 地址空间)上,使用 8MiB 堆栈允许您创建最多 512 个线程。实际上,您会更快地用完虚拟地址,因为内核通常会保留 1/2 到 1/4 的总地址空间,而堆和共享库会更多地分割可用地址空间。

如果您正在运行服务器进程(想想网络搜索),您可能希望使用“每个连接一个线程”模型,这会限制您可以在单台计算机上处​​理的同时连接数。即使在 10 年前,与处理器的能力相比,500 个线程也太少了。

地址空间耗尽对于 64 位操作系统来说不是问题。

此外,一旦线程使用了大量的堆栈,该内存就会“搁浅”。

假设您有一个每秒处理 1000 个请求的 Web 服务器。如果大多数请求使用(比如说)32KiB 的堆栈,但偶尔的罕见请求使用 2MiB 的堆栈,并且如果请求在线程池中随机分布,最终每个线程将使用 2MiB 的 RAM,因此您的进程将继续使用 N*2MiB 的 RAM,尽管 99.99% 的时间只需要 N*32KiB。

如果您强制线程使用不超过(例如)64KiB 的堆栈,则可以避免这种 RAM 的搁浅。

拥有这个额外的 RAM 可以让您在同一台机器上运行其他任务(这就是有多少云服务提供商能够以非常低的成本出售他们的“过剩容量”)。

【讨论】:

  • 呵呵,现在我可以更好地理解什么时候可以减少线程的堆栈了
猜你喜欢
  • 1970-01-01
  • 2016-05-21
  • 2023-01-31
  • 2020-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
相关资源
最近更新 更多