线程堆栈小有什么好处?
What is the advantage of having a small stack of a thread?
我正在研究 POSIX 线程,发现有一种方法可以改变堆栈大小;对于通用操作系统,我还是门外汉;那么拥有一个小堆栈有什么好处,我会在运行时节省内存吗?输入嵌入式系统?
what is the benefit of having a small stack
主要好处是您可以创建更多线程。
在 32 位操作系统(4GiB 地址 space)上,使用 8MiB 堆栈最多可以创建 512 个线程。实际上,您会 运行 更快地用完虚拟地址,因为内核通常会保留总地址的 1/2 到 1/4 space,并且堆和共享库会将可用地址分段 space更多
如果您正在 运行 宁服务器进程(想想网络搜索),您可能想要使用 "one thread per connection" 模型,然后限制您可以在一台机器上处理的同时连接数。即使在 10 年前,与处理器的能力相比,500 个线程还是太少了。
地址 space 耗尽对于 64 位操作系统来说不是一个问题。
此外,一旦一个线程使用了大量的堆栈,那么内存就是 "stranded"。
假设您有一个每秒处理 1000 个请求的 Web 服务器。如果大多数请求使用(比如)32KiB 的堆栈,但偶尔很少有请求使用 2MiB 的堆栈,并且如果请求随机分布在线程池中,最终每个线程都会使用 2MiB 的 RAM,因此您的进程将继续尽管 99.99% 的时间只需要 N*32KiB,但仍使用 N*2MiB 的 RAM。
如果您强制您的线程使用不超过(比如)64KiB 的堆栈,您可以避免这种 RAM 搁浅。
拥有这个额外的 RAM 允许您在同一台机器上 运行 其他任务(这是多少云服务提供商能够以非常低的成本出售他们的 "excess capacity")。
我正在研究 POSIX 线程,发现有一种方法可以改变堆栈大小;对于通用操作系统,我还是门外汉;那么拥有一个小堆栈有什么好处,我会在运行时节省内存吗?输入嵌入式系统?
what is the benefit of having a small stack
主要好处是您可以创建更多线程。
在 32 位操作系统(4GiB 地址 space)上,使用 8MiB 堆栈最多可以创建 512 个线程。实际上,您会 运行 更快地用完虚拟地址,因为内核通常会保留总地址的 1/2 到 1/4 space,并且堆和共享库会将可用地址分段 space更多
如果您正在 运行 宁服务器进程(想想网络搜索),您可能想要使用 "one thread per connection" 模型,然后限制您可以在一台机器上处理的同时连接数。即使在 10 年前,与处理器的能力相比,500 个线程还是太少了。
地址 space 耗尽对于 64 位操作系统来说不是一个问题。
此外,一旦一个线程使用了大量的堆栈,那么内存就是 "stranded"。
假设您有一个每秒处理 1000 个请求的 Web 服务器。如果大多数请求使用(比如)32KiB 的堆栈,但偶尔很少有请求使用 2MiB 的堆栈,并且如果请求随机分布在线程池中,最终每个线程都会使用 2MiB 的 RAM,因此您的进程将继续尽管 99.99% 的时间只需要 N*32KiB,但仍使用 N*2MiB 的 RAM。
如果您强制您的线程使用不超过(比如)64KiB 的堆栈,您可以避免这种 RAM 搁浅。
拥有这个额外的 RAM 允许您在同一台机器上 运行 其他任务(这是多少云服务提供商能够以非常低的成本出售他们的 "excess capacity")。