Java 线程调度

Amo*_*eba 2 java multithreading scheduling

我的笔记说线程调度算法有两大类,抢占式和分时式。我想弄清楚这些在 Java 中是如何工作的。

据我所知(如果我稍微错了,请纠正我!)抢占允许更高优先级的线程在进入可运行状态时从低优先级线程接管 CPU。它会独占 CPU 直到更高优先级的线程出现,还是只会消耗大部分 CPU 时间,但较低优先级的线程也有机会运行?我在这里假设没有调用像 yield() 或 sleep() 这样会放弃 CPU 的方法。

在时间共享中,更高优先级的线程是否获得更多的 CPU 时间份额?

我猜我对先发制人的解释(以及我提出的问题)不可能是正确的,因为它似乎与分时相同!但我想确定细节。

我想,这一切是如何实施的?JVM 还是操作系统调度线程,还是依赖于 JVM 实现?

par*_*fal 5

首先,我怀疑您的笔记不正确,应该是非抢占式与分时式(也称为抢占式)。至少,这就是几十年前我参加操作系统课程时崩溃的方式,我怀疑它是否已经改变。

抢占式线程 (/process) 模型中,每个线程 (/process) 都被授予单独使用 CPU 的权利,直到它明确放弃为止。这是您在单用户操作系统中发现的模型,例如原始的 Windows 或 Macintosh(以及一系列早于它们的小型计算机系统)。一个正在运行的进程可以明确地yield()控制处理器,允许另一个线程/进程运行。当然,对此有很多注意事项,特别是关于中断处理,但我将把描述留在那里。

在抢占式,也就是分时模型中,操作系统可能会强制一个线程/进程让出 CPU(即“抢占”它)。这可能发生在任何数量的地方,但在最简单的情况下,操作系统在时钟的每个滴答声中被调用,并决定哪个进程应该在时钟的下一个滴答声中获得 CPU。再次简化,具有最高优先级的进程开始运行;如果有多个进程具有相同的优先级,通常由最近最少运行的算法来决定。

但是,无论如何,对于所有现代 Java 实现,决定线程何时(何地)运行的是操作系统,而不是 JVM。