注明:转载自 http://www.wowotech.net/forum/viewtopic.php?id=21
里面很多大牛的干货!!!

最近在看wake_up_process流程的时候,发现在try_to_wake_up函数里面有这么一条语句:

 while (p->on_cpu)cpu_relax();

一直想弄明白cpu_relax()函数的真实含义.
我们查看这个函数的定义如下:
ARM32:

#if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
#define cpu_relax()         smp_mb()
#else
#define cpu_relax()         barrier()
#endif

ARM64:

static inline void cpu_relax(void)
{asm volatile("yield" ::: "memory");
}

能够看到:

  • ARM32中,在调用cpu_relax()函数的时候,只有内存屏障
  • ARM64中,在调用cpu_relax()函数的时候,不仅仅有内存屏障还存一个yield指令,是让cpu松弛下来,降低功耗,把资源配置给其他thread等.

详细的解释如下:
我们知道cpu_relax()是用于busy loop的场景.比如下面的代码:

 while (p->on_cpu)cpu_relax();

p->on_cpu的数值是期待其他进程修改的,从而解除本cpu的忙等待状态.
cpu_relax必须具备两个功能:

</tr>
<tr><td bgcolor=orange>2、通知底层CPU,ARM32的代码没有在做什么实际有意义的事情,如果可以的话,别让cpu做太多事情,系统的资源尽量让给其他的cpu。ARM64目前支持</td></tr>
1、确保对p->on_cpu的访问每次都从memory中加载,也就是barrier()函数的作用;

当然,由于ARMv8之前的CPU不支持上面的第二个功能,所以只会看到的cpu_relax()就是barrier()。我们看到ARM64的代码

static inline void cpu_relax(void)
{asm volatile("yield" ::: "memory");
}

在这里, 嵌入式汇编中的clobber list没有描述汇编代码对寄存器的修改情况,只是有一个memory的标记。我们知道,clober list是gcc和gas的接口,用于gas通知gcc它对寄存器和memory的修改情况。因此,这里的memory就是告知gcc,在汇编代码中,我修改了memory中的内容,cpu_relax()之前的c代码块和cpu_relax()之后的c代码块看到的memory是不一样的,对memory的访问不能依赖于嵌入式汇编之前的c代码块中寄存器的内容,需要重新加载,这也就是Optimization barrier的功能。而 嵌入式汇编中的yield指令则完成了cpu_relax的第二个功能,即让CPU 松弛下来,降低功耗,把资源配置给其他thread等,即yield指令用来告知硬件系统,本cpu上执行的指令是polling操作,没有那么急迫,如果有任何的资源冲突,本cpu可以让出控制权。

但是看ARM V8 spec,yield指令似乎没有实现…

cpu_relax()函数的意义相关推荐

  1. R语言set.seed函数的意义及实战

    R语言set.seed函数的意义及实战 目录 R语言set.seed函数的意义及实战 #如果不设置set.seed #设置set.seed

  2. python变量必须以字母和下划线_【转载】关于python中带下划线的变量和函数的意义...

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  3. Matlab pwelch函数参数意义

    Matlab pwelch函数参数意义 该函数常用形式为[pxx,f] = pwelch(x,window,noverlap,nfft,fs). 其中x为输入信号,window为窗口类型,noverl ...

  4. select()函数返回值及select与socket阻塞的关系及select函数的意义

    1.select()函数返回值 select的返回值与recv函数的返回值十分类似,都分>0,=0,<0三种情况. >0:有事件发生, FD_ISSET(socket, &f ...

  5. python回调函数的作用是_回调函数的意义以及python实现

    因工作需要,最近在学习使用python来解析各种文件,包括xmind,xml,excel,csv等等. 在学习python解析XML的时候看到这样一段话: 当时就犯了老毛病,被一个不是很知道的名词引起 ...

  6. 回调函数的意义以及python实现

    回调函数(callback),百度百科的解释是这样的: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回 ...

  7. 记录 之 tf.placeholder() 函数的意义及用法

    函数原型: tf.placeholder(dtype, shape=None, name=None) 参数释义:1.dtype:数据类型.常用的是tf.float32,tf.float64等数值类型 ...

  8. python中变量和函数的区别_关于python中带下划线的变量和函数 的意义

    Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就易于阅读, ...

  9. php中什么是函数函数的意义是什么,php中arsort函数的功能起什么作用呢?

    摘要: 下文讲述php中arsort函数的功能讲解,如下所示: arsort函数功能说明: 根据数组的值进行降序排列 arsort语法: arsort(array,sortingtype); ---- ...

  10. 关于python中带下划线的变量和函数 的意义

    转载:https://www.cnblogs.com/wangshuyi/p/6096362.html 总结: 变量: 1.  前带_的变量:  标明是一个私有变量, 只用于标明, 外部类还是可以访问 ...

最新文章

  1. zabbix   微信报警( python 2.x )
  2. 数据流分析:可用表达式的计算+活跃变量计算+到达定值。
  3. 软件设计师笔记---流水线
  4. 微型计算机系统中的内部寄存,微机原理与接口技术习题集汇总.doc
  5. 【学习笔记】APP测试基本流程及测试要点
  6. ListView的CheckBox实现全部选中/不选中
  7. power bi 实时_Power BI中的实时流
  8. 怎么查计算机二级证书到没到学校,今年3月份考的全国计算机二级,结果忘记去领证书了,我是在城建学院考的,还会给我留着吗?这证书能补办吗...
  9. atitit.修复xp 操作系统--重装系统--保留原来文件不丢失
  10. Android开发中导入字体库
  11. CPU寻址能力的理解
  12. Apache和Httpd是什么关系
  13. 微信公众平台开发教程(一) 微信公众账号注册流程
  14. Python 于 webgame 的应用(上)
  15. BigDecimal出现多位小数问题
  16. 什么是节点流和处理流?
  17. package is corrupt, exception while verifying: undefined method `size' for nil:NilClass (NoMethodErr
  18. 有关计算机的英语作文一千字,英语作文一封信大学1000词5篇
  19. 毕业设计-基于微信小程序的图书馆座位预约系统
  20. 基于Wemos D1避障WiFi小车及智能垃圾桶设计

热门文章

  1. 方位角的表示及示意图
  2. jxl 冻结单元格_如何在Word中冻结表格中单元格的大小
  3. UnicodeTOGB,能够将Unicode串转换成GB码,方便开发。
  4. 解决windows server 2012R2操作系统激活报错0xc000022
  5. 0-glusterfs: failed to set volfile server: File exists
  6. Aspose.Words使用模板导出数据库中图片内容
  7. 台式计算机怎么开声音,台式机如何使用耳机说话
  8. spring boot基于Java的电影院售票与管理系统毕业设计源码011449
  9. 用于屏幕对比图片jevin
  10. 【python】给excel加密