win*_*art 10 assembly x86-64 instruction-set cpu-architecture
我对MONITOR-MWAIT和HLT指令提出了疑问.两者都停止处理器,两者都在各种外部触发器(中断等)上唤醒.
在我的实验中,HLT和MWAIT功能几乎相同,考虑到:
(当然,MWAIT可能是更高的分辨率,我没有测量分辨率,但它似乎超过了唤醒(我假设)中断等等.所以我看不到大的优势.
谢谢,以这种方式的任何想法将不胜感激
Bre*_*dan 14
为了表现; 最重要的是CPU无论何时等待(HLT的IRQ,或MWAIT的IRQ或存储器写入)发生时,它都会离开其"等待"状态所需的时间.这会影响延迟 - 例如,在中断处理程序启动之前或任务切换实际发生之前需要多长时间.对于不同的CPU,CPU退出其等待状态所花费的时间是不同的,并且对于同一CPU上的HLT和MWAIT也可能略有不同.
这同样适用于功耗 - 等待时消耗的功率在不同的CPU之间会有很大差异(特别是当你开始考虑超线程等事情时); HLT与MWAIT的功耗在同一CPU上也可能略有不同.
对于使用,它们适用于不同的情况.HLT用于等待IRQ,而MWAIT用于等待存储器写入发生.当然,如果您正在等待内存写入,那么您需要决定IRQ是否应该中断您的等待(例如,如果您只想等待内存写入,CLI则可以这样做MWAIT).
但是,对于多任务系统,在CPU空闲的调度程序中,大多数情况下它们都只用于相同的事情.在引入MONITOR/MWAIT之前,调度程序将在等待工作时使用HLT(以减少功耗).这意味着如果另一个CPU解除阻塞任务,它不能只将该任务放入调度程序的队列中,并且必须向HLTed CPU发送(相对昂贵的)"处理器间中断"以将其从HLT状态中删除(否则)当它可以/应该做的工作时,CPU将继续无所事事.使用MWAIT,这种"处理器间中断"(可能)是不必要的 - 您可以将MONITOR设置为监视对调度程序队列的写入,以便将任务放入队列的行为足以导致等待CPU停止等待.
还有一些研究使用MONITOR/MWAIT来实现自旋锁和同步(例如等待释放竞争锁).这项研究的最终结果是,CPU退出"等待"状态所需的时间过长,使用这样的MONITOR/MWAIT导致性能损失太大(除非存在设计缺陷 - 例如使用自旋锁什么时候你应该使用互斥锁).
我想不出使用HLT或MWAIT的任何其他原因(超出调度程序和锁定/同步).
小智 9
HLT指令实现可用于单个线程的最浅空闲功率状态(C-State),而MWAIT指令允许您请求所有可用空闲功率状态以及子状态.
在硬件级别,执行HLT相当于执行状态提示为0的MWAIT.这使处理器处于C1状态,这是核心的时钟门控.如果要进入更深的C状态以便为核心供电并可能为封装供电,则必须使用MWAIT.
各种电源状态的省电和退出延迟之间总是存在权衡.C-State越深,节能越多,但退出C-State所需的时间越长.您还应注意,现代x86处理器将根据中断频率限制电源状态的深度(即,如果您每1 us收到一次中断事件,硬件将不会尝试进入具有2 us退出的C状态潜伏).
除了硬件禁止进入C状态之外,某些C状态只能通过线程之间的协调进入.例如,在具有超线程的Intel x86处理器上,核心中的两个线程都必须请求功率门控C状态,以便在核心级别进行功率门控,同样,包中的所有内核都必须请求包 - 用于功率门控的电平门控C状态发生在封装级.硬件通常遵循最浅的请求,因此如果1个线程请求C1而另一个请求C3,则处理器进入C1.
如果你不是在控制操作系统,那么这真的是一个没有实际意义的点(因为MWAIT仅在CPL0上可用).如果你"拥有"操作系统,那么使用MWAIT代替HLT几乎总是有意义的,因为它在很多情况下可以节省更多的功率,并且可以访问HLT所做的相同的空闲功率状态.