将进程/线程调度到核心完全由操作系统决定。硬件不了解等待运行的任务。维护操作系统可运行进程列表与等待I/O的进程列表完全是软件的事情。
将线程从一个核心迁移到另一个核心是通过内核代码在原始核心上将架构状态存储到内存中,然后新核心上的操作系统代码恢复该保存的状态并恢复用户空间执行来完成的。
传统上,频率和电压的调整决策是由操作系统做出的。以Linux为例:这个决策代码被称为
调节器(同时这个
Arch Wiki链接在谷歌上排名很高)。它会考虑诸如进程在当前核心上有多频繁地使用了它们的整个
时间片段等因素。如果调节器决定CPU应该以不同的速度运行,它会编程一些控制寄存器来实现变化。据我所知,硬件会选择
合适的电压来支持请求的频率。
据我的理解,每个核心运行的操作系统独立做出决策。在能够让每个核心以不同频率运行的硬件上,决策代码不需要彼此协调。如果在一个核心上运行高频率需要高电压芯片范围内实现,硬件会处理这个问题。我认为DVFS(动态电压和频率调节)的现代实现是相当高级的,操作系统只需告诉硬件它想要N个选择中的哪一个,板载功率微控制器负责编程振荡器/时钟分频器和电压调节器的细节。
英特尔的“Turbo”功能可以在最大可持续频率以上机会性地提高频率,决策是由硬件做出的。每当操作系统请求最高广告频率时,CPU利用Turbo(如果功率和冷却允许)。
英特尔的Skylake更进一步:操作系统可以将DVFS的完全控制权交给硬件,可选限制。这使得它可以从微秒到微秒地反应,而不是毫秒级别的时间尺度。这确实允许爆发工作负载中更好的性能,因为在有用时可以获得更多的Turbo功率预算。一些基准测试足够爆发,例如一些浏览器/JavaScript测试(如果我没记错的话)。
在2015年的IDF大会上,关于Skylake新的电源管理进行了全面的讨论,请
查看幻灯片或存档的网络广播。那里也详细描述了旧方法,以说明差异,因此如果您想要比我的摘要更详细的信息,真的应该查看一下。(其他IDF演讲的列表在
这里,感谢
Agner Fog's博客提供链接)