蜗窝科技

arm体系下的cpu_relax()函数疑惑--再讨论

蜗窝讨论区存档 · Linux kernel技术问答 · 楼主 tigger · 2016-07-27 · 3 帖

本文是原「蜗窝讨论区」的历史存档(2016-07-27),来自版块「Linux kernel技术问答」,共 3 帖。讨论区已停止服务,此处仅供查阅。

tigger · 2016-07-27 10:41

hi linux 在之前的帖子中,最后一段对yeild的描述如下 而 嵌入式汇编中的yield指令则完成了cpu_relax的第二个功能,即让CPU 松弛下来,降低功耗,把资源配置给其他thread等 yield是不会让出cpu的,并没有调用schedule相关的函数,是忙等待。这里能把资源配置给其他thread吗?? 我想你的意思应该是其他core上面的thread?另外附上ARMV8对YIELD指令的解释 The YIELD instruction The YIELD instruction provides a hint that the task performed by a thread is of low importance so that it could yield, see YIELD on page C6-768. This mechanism can be used to improve overall performance in an Symmetric Multi-Threading (SMT) or Symmetric Multi-Processing (SMP) system. Examples of when the YIELD instruction might be used include a thread that is sitting in a spin-lock, or where the arbitration priority of the snoop but in an SMP system is modified. The YIELD instruction permits binary compatibility between SMT and SMP systems. The YIELD instruction is a NOP (No Operation) hint instruction. The YIELD instruction has no effect in a single-threaded system, but developers of such systems can use the instruction to flag its intended use for future migration to a multiprocessor or multithreading system. Operating systems can use YIELD in places where a yield hint is wanted, knowing that it is treated as a NOP if there is no implementation benefit.

linuxer · 2016-07-27 16:31

要想理解这些内容,需要对processor内部设计要比较清楚,下面,我们从处理器设计人员的角度来澄清几个概念: 1、thread。其实就是一个处理器能够识别并执行的指令流 2、thread context。支持执行一个thread的硬件必备的条件,例如一组通用寄存器,PC等。 3、single-threaded processor。只能执行一个thread的处理器 4、multi-threaded processor。能执行多个thread的处理器,该处理器必须支持多个thread context。也就是说该处理器要有多个PC,多个通用寄存器。 5、Multicore/multiprocessors。系统中有多个procesor(cpu core),共享memory(我接触的ARM系统基本都是这个类型,对于其他的计算机系统,也会有其他形态的,不细述)。每一个procesor可能是single-threaded processor,也可能是multi-threaded processor。

基于上面的描述,对于一个Multicore(ARM常用这个术语)系统而言,如果每一个core都是single-threaded processor,那么这些processor之间除了memory,并不共享其他的硬件资源。如果Multicore系统中的一个core支持multi-threaded,那么该core(processor)上会执行两个不同的thread,而执行这两个thread的硬件需要竞争一些和CPU运算相关的资源,例如issue slot(当然具体需要竞争什么样子的资源是和具体实现相关)。

现在,我们回到具体的问题上来,首先,yield指令肯定是不会让出CPU了,本质上,执行这段指令的硬件仍然会继续loop,当然,不会是busy loop了,而是leisure loop。举一个形象的比喻:如果一个multi-threaded processor执行两个thrad A和thread B,如果没有yield指令,那么A和B两个thread都是尽自己的最大能力在抢占CPU资源,来完成自己thread指令流的执行。如果A执行了yield,那么A thread就变慢了,好象发射的指令也少了,不再拼命干活,而是喝喝咖啡,干一点活。这时候,由于A thread的执行变“慢”了,因此B thread可以更加欢快的执行。

上面说的是一个multi-threaded processor上的两个thread竞争CPU资源,对于Multicore系统,多个cpu core之间共享的资源就是memory,因此运行在不同core的thread唯一需要竞争的就是memory资源。如果在busy loop中,一个thread以较慢的速度访问共享memory,其他的cpu core上的thread那么就会有更大机会来获取对共享memory的访问权,从而提升系统的性能。

最后,上面是我的理解,仅供参考!

tigger · 2016-07-27 20:05

我现在明白你那句话的意思了。 在这个网站里面,每天都有新发现啊。好开心啊~~~啊啊啊啊~~~~~