这是一个相当普遍的计算机科学问题,并不针对任何操作系统或框架。线程池和上下文切换(任务)?
所以我有点困惑与线程池上切换任务相关的开销。在许多情况下,为每个作业提供自己的特定线程(我们不想创建太多硬件线程)是没有意义的,所以我们把这些作业放到可以安排在线程上运行的任务中。我们建立了一个线程池,然后动态分配任务以在从线程池获取的线程上运行。
对于在特定线程(在线程池中)切换任务相关的开销,我只是有点困惑(无法找到深入的答案)。 DrDobbs的一篇文章(来源于下文)说明了它的作用,但我需要更深入地回答实际发生的事情(可以引用的来源会非常棒:))。
根据定义,SomeWork必须在池中排队,然后在 上运行与原始线程不同的线程。这意味着我们必然 招致排队开销加上一个上下文切换只是将工作移动到 池。如果我们需要将回答传回原始线程(例如通过消息或Future或类似的),我们将为此另外发送一个上下文切换。
来源:http://www.drdobbs.com/parallel/use-thread-pools-correctly-keep-tasks-sh/216500409?pgno=1
哪些组件的线程的实际切换?线程本身并不实际切换,只是特定于线程的数据。与此相关的开销是多少(或多或少)?
这开始变得更有意义(有点)。所以“线程池”线程并没有实际的上下文切换。文章指出有一个上下文切换来排队任务(即将任务移动到线程池)。你是说同样的事情吗?线程池不上下文切换,但任务呢?即将任务从创建任务的线程移动到将运行任务的线程 – smjpl 2014-10-10 18:34:50
任务只是一个数据结构(一个函数指针)。队列也只是数据。内核不参与排队任务或执行它们。没有开关。 – usr 2014-10-10 18:49:26
那么为什么我们需要确保任务足够大,如果在线程池中排队和运行任务没有任何相关开销?从文章(第1页):“另一方面,任务不应该太短,因为执行工作作为线程池任务存在实际成本。” – smjpl 2014-10-10 19:05:53