我最近开始阅读罗伯特·洛夫(Robert Love)的书“ Linux Kernel Development 3rd edition”(Linux内核开发第三版),并深入到调度程序部分,这给我带来了很多问题。
所以首先,我了解到在两种情况下,调度程序会更改当前正在运行的任务(如果我不准确,请纠正我),或者是由于任务在某些情况下会阻塞而主动要求重新调度的任务/ O或睡眠,或者是导致CPU跳到调度程序代码并抢占当前任务(如果可中断)的计时器中断。
多核处理器中的每个内核是否都获得与重新调度有关的中断?它们每个都有不同的计时器,还是说在某种算法中有一个中断每次都会选择一个特定的内核来处理它?</ p>
假定每个中断不仅只有一个内核重新调度(因为从那时起,我想可能会花一些时间在所有内核上交换进程),如果两个内核同时重新调度会发生什么?因为,我假设您在运行调度功能时必须锁定任务列表,然后我想象有几个内核同时重新调度其当前任务,导致只有一个内核实际在进行调度工作,而所有其他内核等待任务列表锁。
不仅需要触摸任务列表锁并说出更改任务状态或运行队列顺序,还需要任务列表锁,如果当前调度的一个核计算了下一个应同时运行的任务,该怎么办?另一个内核成功完成了调度,这导致第一个内核计算完全错误,因为成功的重新调度只是严重改变了系统状态?
我了解到,在Linux中,优先级分为“ nice值”,即-20到19(较高的值表示较低的优先级,而更多的“ nice”)和实时优先级(0-99)。实时优先级值仅对几个调度策略重要,并且每个进程可以注册到不同的调度策略。 实时策略是否总是击败未注册到实时策略的流程?这意味着如果我运行实时进程,我将永远无法执行正常的进程吗?调度程序算法中正常进程的“ nice”值和实时进程的实时优先级值如何一起工作?