当进程设置为以10的初始时间片运行时,硬件中的某个人应该知道这个初始时间片并递减它,当时间片变为0时,应该触发中断!
在freeBSD内核中,我知道hardclock和softclock完成了这个会计任务。但我的问题是,这个时钟的递减是否与进程的执行并行?
答案 0 :(得分:1)
我将在这里使用PIT作为示例,因为它是最简单的计时机制(已经存在了很长一段时间)。
此外,这个答案相当x86特定;而且与操作系统无关。我不太了解FreeBSD和Linux的内部结构,特别是对它们的回答。其他人可能更有能力。
基本上,时间片与进程的执行并行“递减”,因为计时器为每个“滴答”创建一个IRQ(注意,诸如HPET之类的定时器可以执行'一次性'模式,从而触发IRQ在特定延迟之后,也可以用于调度)。一旦时间片减少到零,就通知调度程序并发生任务切换。所有这些都与您的过程“同时”发生:IRQ跳入,运行一些代码,然后让您的过程继续进行,直到时间片耗尽。
应该注意的是,一般来说,由于系统调用的直接结果(例如,从阻塞的磁盘读取,任务切换)可能会发生,因此您看不到进程在其时间片结束时运行甚至写信给终端。)
答案 1 :(得分:1)
这在过去的迷雾中更为简单:时钟芯片 - 主板上的分立器件 - 将配置为以X Hz的速率周期性地触发中断。每次“定时器中断”关闭时,当前程序的执行将被暂停(就像任何其他中断一样),并且内核的调度程序代码将减少其时间片。当时间片一直变为零时,内核会将CPU从程序中取出并将其交给另一个程序。与CPU分离的时钟芯片显然与程序的执行并行运行,但是内核的簿记工作必须中断程序(这是我们所讨论的迷茫的过去,因此只有一个CPU,所以内核代码和用户代码不能同时运行。
如今,时钟不是一个独立的设备,它是CPU的一部分,它可以编程来做各种聪明的事情。最重要的是,它可以编程为在N微秒后发出一个中断,其中N可能非常大;这允许内核在很长一段时间内(在计算机方面;也许,比如,整整一秒)使CPU空闲,如果它没有任何建设性的东西可以做,节省功耗。与此同时,很难找到单核CPU,内核会做各种巧妙的技巧,将他们的簿记工作推迟到没有更好的事情的CPU上,而且时间片会计变得更加复杂。 Linux目前使用“Completely Fair Scheduler”,它甚至没有“时间片”的概念。我不知道FreeBSD有什么,但如果它很简单,我会感到惊讶。
所以对你的问题的简短回答是“大多数情况下并行,现在比以往更加简单,但它不再像倒数计时器那么简单了”。