2010-11-11 128 views
5

我正在编写一些代码,它产生了很多线程(目前大约有512个,但未来可能会更高)。每个线程只执行少量的操作,所以我希望线程在系统上的开销保持在最低限度。安全线程堆栈大小?

我设置使用pthread_attr_setstacksize()堆栈大小,我可以从PTHREAD_STACK_MIN得到允许的最小堆栈大小。但我的问题是:使用PTHREAD_STACK_MIN作为线程堆栈大小安全吗?如何计算我需要多少堆栈?是否有任何隐藏的开销需要添加到我的计算中?

此外,是否有任何其他的技术,我可以使用,以减少系统的线程的负担?

回答

4

减小线程堆栈大小不会减少开销(未在CPU,存储器使用或性能方面)。你在这方面的唯一限制是给你的平台上的线程提供的总可用虚拟地址空间。

,直到平台提出的问题,否则(如果发生的话)我会使用默认的堆栈大小。然后在出现问题时尽量减少堆栈使用。但是,这些将导致真正的性能问题,因为您需要点击堆,或在其他地方使用devise thread-dependent allocation

隐藏开销可以包括:在堆栈上大型阵列,如通过VLAalloca()或只是简单的静态尺寸自动数组的

  • 分配。
  • 你不控制或不知道使用诸如模板,工厂类等的后果的代码。但是,鉴于你没有指定C++,这不太可能是一个问题。
  • 从库头导入的代码等。这些可能会改变版本,并显着改变他们的堆栈,甚至线程的使用。
  • 递归。出现这种情况的原因还有,考虑像boost::bind,variadic模板,疯狂的宏,然后在堆栈上使用缓冲区或大对象进行一般递归。

除了设置堆栈大小,操作线程优先级以及根据需要挂起和恢复它们,这将显着地协助调度程序和系统响应。 Pthreads允许您设置争用范围; LWP,并且在范围内,调度的性能特征差别很大。

下面是一些有用的链接:

+0

谢谢马特。我认为这与我之后的答案最接近。我希望有人会说“加上所有局部变量的sizeof(),为线程开销增加42个字节,然后为好运增加10%”,但似乎有更多因素可能正在上映。感谢关于优先级和暂停的提示。 – 2010-11-11 14:30:50

+2

@ ltn100:不,它更像是“在指定堆栈大小的情况下彻底测试您的代码,在调试环境中检测溢出,然后为好运添加10%”。 – 2010-11-11 14:43:45

+2

@ ltn100:如果你可以找到一个调试工具来实际测量你的平台上的高水位堆栈使用情况,那很好,但是你实际需要这样做的平台(因为堆栈是物理RAM)最好的调试工具。而且你必须通过测试真正彻底。任何小事情,包括你动态链接的库的变化,或者他们看到的环境变量,或者(从字面上)一周中的某一天,都可能增加你的高水位标记。避免使用VLA,避免依赖于输入数据的任何递归。 – 2010-11-11 14:58:21

7

你不应该靠近多个线程创建的任何地方,你绝对不应该做一个新的线程来执行操作的量小。当且仅当您现有的线程完全饱和并且有更多可用的物理或逻辑关注才能工作时,您应该创建一个新线程。这对于大约10个线程左右的合理的当前应用程序有很大的限制,即使你使用hexacore,你最多只需要12个左右。这样的设计很有缺陷,会使用大量的进程内存,并且不会真正提高性能。

对于堆栈大小,你真的不能计算出你需要多少的任意线程,因为它完全取决于代码运行。但是,在Visual Studio中,典型的堆栈大小是几兆字节。你将不得不发布整个代码和由线程执行的结果反汇编,以知道要使用多少堆栈大小。只需坚持几兆字节。

+1

+1:但是你可能需要比内核更多的线程,如果你的线程是定期IO的限制...... – 2010-11-11 13:04:41

+0

@奥利但不是50倍。 – 2010-11-11 13:10:26

+4

@C。 Ross:取决于他们是如何限制I/O的。好的,所以还有其他一些构建异步I/O系统的方法,这些异步I/O系统在资源方面效率更高(可能在我的时间效率较低,这取决于我对事件队列,select,等等有多好),但是如果我的线程将花费99.8%的时间等待网络I/O,那么我想要500个线程。有时RAM比程序员便宜,有时候不是;-) – 2010-11-11 13:15:25

5

栈帧所需的空间大小取决于您使用的编译器,基本上你可以尝试去猜测你的自动变量,参数的大小和一些开销回报ADRESS,保存寄存器等

你应该考虑是否它可以替代使用Thread Pool。由于创建线程不是免费的。

+1

我对线程池是否对现代实现有显着的好处持怀疑态度。没有人再使用'LinuxThreads'和黑客了。你有关于线程创建的相对成本的最新参考吗? – 2010-11-11 17:10:39

+1

确实。创建线程的成本各不相同,但通常这些日子很便宜。不过我认为关于线程池的观点依然存在。他们是一个有用的工具,但我发现大多数人只是试图找到一个使用它们的理由。 – 2010-11-12 02:47:31