时间片的价格是多少?

What is price of time-slicing?

让我们用一个简单的例子。我在池中有 1 个核心1 个线程,有两个持续很长时间的 CPU 绑定任务。由于一个线程在 1 个核心上 运行,因此它从头到尾都是不间断的。然后是 运行 第二个任务。

但让我们把它变得有趣。我在池中添加了另一个线程 (size=2),我仍然在那个 1 核上工作。现在我让线程 1 与任务 1 一起工作,线程 2 与任务 2 一起工作。这很糟糕,因为我会出名 time-slicing.

我为引进它付出的代价是什么?时间片需要做什么才能从线程 1 切换到线程 2 以及相反的线程? 任何有用的资源都会很好。我需要知道当 OS 更改它执行的线程时需要再次加载什么。

Now I make thread 1 work with task 1 and thread 2 work with task 2. This is bad because i would get famous time-slicing.

不一定有什么不好的;它允许计算机同时在两个任务上取得进展,这通常是您想要的。

What is the price I am paying for introducing it?

代价是您的 OS 的调度程序必须每 so-many 毫秒执行一次 context-switch -- 这通常不是什么大问题,因为调度程序的量子 (即它在从执行一个线程切换到另一个线程之前允许通过的时间量)被调整到足够长,以至于执行 context-switch 的开销可以忽略不计。

另一个代价是同时进行两个任务,计算机必须同时将两个任务的数据保存在 RAM 中,这意味着最大 RAM 使用率高于 one-task-at-a-time 情况.这是否重要取决于您的两个任务使用多少 RAM。在两个数据集之间来回切换也可能会在某种程度上降低 CPU 缓存的有效性,如果一个任务的 working-set 大部分适合可用的缓存 space 但两个任务的 working-sets 不会。

What does time-slicing need to do to switch from thread 1 to thread 2 and opposite?

要进行上下文切换,OS 的调度程序必须对 timer-interrupt 作出反应(导致 scheduler-routine 到 运行),保存当前CPU-core 的所有寄存器的值放入 RAM 缓冲区,然后将另一个线程的 register-values 从(之前保存它们的 RAM 缓冲区)加载回 CPU-core 的寄存器,然后为调度程序下次需要 运行.

设置一个 interrupt-timer