线程的成本

时间:2013-02-12 20:08:48

标签: multithreading operating-system resources

我理解如何用我选择的语言创建一个线程,我理解互斥锁,以及共享数据e.t.c的危险,但我确定O / S如何管理线程和每个线程的成本。我有很多问题都是相关的,而且最明确的方式来表明我理解的极限可能是通过这些问题。

产生线程的成本是多少?在设计软件时是否值得担心?创建线程的成本之一必须是它自己的堆栈指针和进程计数器,然后空间将所有工作注册表复制到调度程序在核心上移动或移出核心时,还有什么呢?

一个程序的可用堆栈数量是在进程的线程之间还是先到先得的服务器之间平均分配的?

我可以以某种方式检查启动(程序的)硬件核心数量。如果我在具有N个内核的机器上运行,我应该将线程数保持为N-1吗?

3 个答案:

答案 0 :(得分:5)

  

然后空间将所有工作注册表复制到移动状态   和调度程序的核心,但还有什么?

一个不太明显的代价是对调度程序施加的压力,如果它需要处理成千上万的线程,它可能会开始窒息。记忆不是真正的问题。通过正确的调整,你可以得到一个“线程”来占用很少的内存,只比它的堆栈多。这种调整可能很困难(即直接在linux等下使用clone(2)),但可以这样做。

  

一个程序可用的堆栈数量是否平均分配   流程的线索或先到先得的

每个线程都有自己的堆栈,通常可以控制它的大小。

  

如果我在有N核的机器上运行,我应该保留数量   线程到N-1

检查核心数量很简单,但环境特定。但是,如果您的工作负载由CPU密集型操作组成,I / O很少,那么将线程数限制为内核数只是有意义的。如果涉及I / O,您可能希望拥有比核心更多的线程。

答案 1 :(得分:3)

添加其他优秀帖子:

'产生线程的成本是多少?在设计软件时是否值得担心?'

如果你的一个设计选择经常做这样的事情。避免此问题的一种好方法是在应用启动时通过使用专用于操作的池和/或应用程序生命周期线程创建一次线程。线程间信令比连续线程创建/终止/破坏快得多,也更安全/更容易。

有关线程停止,终止,销毁,线程计数失控,OOM故障等问题的帖子数量是最重要的。如果你可以完全避免这样做,那很好。

答案 2 :(得分:2)

在设计和实施的所有内容中,您应该尽可能周到。

我知道每次创建线程时Java线程堆栈占用大约1MB。 ,所以他们加起来。

线程对于允许长时间运行的活动发生而不会阻止所有其他用户/进程取得进展的异步任务是有意义的。

线程由操作系统管理。有很多方案,都在操作系统的控制之下(例如循环,先到先得等)。

对于我来说,为某些活动(例如计算密集型计算,图形,数学等)为每个核心分配一个线程是完全合理的,但这不一定是决定因素。我开发的一个app在生产中使用大约100个活动线程;它不是100核心机器。