Operating system 是否可以更改硬件计时器';是在调度器的帮助下还是在运行时?

Operating system 是否可以更改硬件计时器';是在调度器的帮助下还是在运行时?,operating-system,hardware,scheduler,Operating System,Hardware,Scheduler,我正在学习操作系统的入门课程,我试图开发一个调度器,它可以在进程的周转时间和响应时间之间进行很好的权衡 我想知道是否可以更改计时器中断的间隔。如果我能做到这一点,也许我可以根据在给定的更大时间间隔内完成的进程数在不同的计时器间隔之间切换。例如,如果我在过去10毫秒内完成了7个进程,则将计时器间隔从10毫秒切换到15毫秒,从而在响应计划程序和使周转时间最小化的计划程序之间切换,从而获得更好的平均值 谢谢。让我们把它分成几部分 计时器 许多现代内核都是“不滴答”的。这意味着(不是让计时器以固定频率生

我正在学习操作系统的入门课程,我试图开发一个调度器,它可以在进程的周转时间和响应时间之间进行很好的权衡

我想知道是否可以更改计时器中断的间隔。如果我能做到这一点,也许我可以根据在给定的更大时间间隔内完成的进程数在不同的计时器间隔之间切换。例如,如果我在过去10毫秒内完成了7个进程,则将计时器间隔从10毫秒切换到15毫秒,从而在响应计划程序和使周转时间最小化的计划程序之间切换,从而获得更好的平均值


谢谢。

让我们把它分成几部分

计时器

许多现代内核都是“不滴答”的。这意味着(不是让计时器以固定频率生成IRQ),计时器在“一次”模式下运行(当请求的时间流逝时生成一个IRQ),内核确定下一次事件何时需要发生,并设置下一次事件何时应生成IRQ的时间。这种方法有利于电源管理(没有不必要的IRQ使空闲CPU/s脱离节能状态)和精度(例如,如果计时器恰好运行了1MHz时钟,那么内核可以向计时器请求粒度为1微秒的IRQ,而不需要100万IRQ的开销来获得固定频率的相同粒度)。当然计时器有很多用途(网络超时、睡眠()等),所以“最快时间事件”可能与当前任务消耗其时间片的时间无关

注:现代硬件也可能具有以CPU频率运行的定时器(例如,最近80x86芯片的本地APIC定时器中的“TSC截止模式”),其中“无滴答”意味着您通常可以获得“优于1纳秒”的精度

当然对于“tickless”,因为内核在每次IRQ发生时为计时器设置一个新的计数(对于新的“最早”时间事件),所以调度器非常容易使用它喜欢的任何时间片长度,不管它喜欢什么原因

任务切换导致

对于真正的操作系统,大多数任务切换都是由于当前运行的任务必须等待某些内容(等待来自文件或交换空间的数据、等待来自网络的数据包、等待缓冲区变为“未满”)而导致的因此,它可以将更多数据放入其中,等待数据通过管道或消息从另一个进程到达,等待释放互斥锁,等等);或者因为某个任务正在等待某个事件发生。调度器的计时器只是为恶意CPU占用和不需要等待任何东西的罕见CPU占用任务提供上限

注意(对于使用固定频率计时器的循环调度程序)这会导致问题。例如,如果每个任务都有一个10毫秒的时间片,但任务必须在4.321毫秒后切换,因为任务必须等待某些东西,那么您不想浪费5.679毫秒的CPU时间等待下一个计时器IRQ,但您也不想给下一个任务5.679毫秒而不是它应该得到的10毫秒。相反,您可以将计时器配置为每1毫秒生成一次IRQ,以便下一个任务的时间可以四舍五入到最接近的时间(例如,下一个任务的时间为9.679毫秒,而不是5.679毫秒,而不是10毫秒)。但是,这会增加处理不必要IRQ的开销,并影响性能,这也是使用“无滴答”的原因之一(以消除不必要的IRQ并减少“四舍五入到最近”错误)

循环中的延迟

对于循环调度程序“负载下的延迟”这是一个蹩脚的笑话,与计时器无关。问题是,需要低延迟的任务必须等待未知数量的其他任务轮到它们。例如,如果有200个任务的CPU时间应该达到10毫秒,而这200个任务中的每一个实际消耗的CPU时间平均为5毫秒ach(因为大多数任务在其时间片结束之前都会阻塞/等待);那么“低延迟”任务在获得CPU时间之前可能需要等待1000毫秒。将计时器的间隔从10毫秒更改为5毫秒可能意味着这200个任务每个任务平均消耗4毫秒的CPU时间和“低延迟”任务仍需等待800毫秒

注意:理论上,避免此问题的一种方法是将最近停止等待的任务放在“下一个任务获得CPU时间”的开头列表,以便在当前运行的任务使用完CPU后立即获得CPU时间。实际上,这允许任务故意占用CPU时间,在每个时间片结束时非常短暂地等待,以快速获得一个全新的时间片,并且通过使用一对协作任务,恶意软件可以确保其他任务永远不会获得CPU时间y CPU时间。因此,您从不将任务放在“下一个任务获得CPU时间”列表的开头

任务优先级

如果您为每个任务分配了优先级,以便调度器知道任务的重要性,该怎么办

在这种情况下,如果任务需要低延迟,您可以告诉调度程序它具有高优先级,并且当任务停止等待某件事情(例如,等待用户按键、等待网络数据包到达等)时,调度程序可以将任务的优先级与当前运行任务的优先级进行比较,实现“低延迟”任务具有更高的优先级,并立即进行任务切换(无需等待200个其他任务轮到)。在这种情况下,即使操作系统负载较重,延迟也可能“几乎为零”

这确实会产生潜在问题(高优先级CPU占用),