【问题标题】:Thread scheduling overhead and context switching线程调度开销和上下文切换
【发布时间】:2016-01-02 11:48:11
【问题描述】:

我只是想澄清我关于多线程开销的概念。在 Brian Göetz 的 Java 书籍“Java Concurrency In Practice”中,我阅读了第 11 章第 11.1 节中的以下段落。


“虽然目标可能是提高整体性能,但与单线程方法相比,使用多线程总是会带来一些性能成本。这些包括与协调相关的开销 线程(锁定、信号、同步)、增加上下文切换、线程创建和拆除以及调度开销。”


他为什么将上下文切换开销和调度开销分开。线程调度开销是否与上下文切换开销不同。我对这两个概念都感到困惑。

【问题讨论】:

    标签: java scheduling context-switch


    【解决方案1】:

    简单来说:

    上下文切换意味着在您的进程中,一个线程将进入等待/睡眠状态,而另一个线程将进入运行状态,即开始执行。这确实意味着存储进入等待状态的线程的当前状态并检索其他线程的当前状态,以便从进入等待状态的点开始执行相同的线程。

    调度开销意味着一旦线程进入可运行状态(准备执行),操作系统会将其连同它可能需要的资源重新调度到其中一个处理器。

    【讨论】:

    • "Os 会将其重新安排到其中一个处理器上" .但是这句话与操作系统将在其中一个处理器中恢复其上下文相同,即是上下文切换,那么区别在哪里?
    • 假设您已经有线程处于可运行状态,但假设所有处理器都很忙,操作系统不会安排您的线程,因为您的线程已经在运行。现在,如果您的线程说进入等待状态,它只会恢复当前线程并会拾取已经在等待队列中的线程并开始执行它。
    • 而这一切最终都会因为调度线程而涉及上下文切换。即两者都是一样的。
    • 不,它们不是,但您可以为特定实例说上下文切换,这意味着它将承担稍后安排的成本。
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多