转载:x86的cpu_relax解析
来源:互联网 发布:健身计划的软件 编辑:程序博客网 时间:2024/05/17 07:58
原文:http://blog.liuw.name/1024
内核执行的任务在很多情况下是不加锁的,只是poll某个公有变量去保证同步。再深一步,即使是使用锁,本质上也是一个poll某个公有变量的过程。这个poll的过程需要CPU一直循环等待。
要是让我这个菜鸟来写的话,循环体内大概是什么都不会做的了,XD。而x86的内核中一般是调用cpu_relax()。这个函数又是何方神圣呢?
实际上,这个函数很简单。
自旋锁里面也有rep;nop这个语句。而我很蛋痛地在想,为什么是rep;nop而不是nop;nop而不是nop;nop;nop…;nop,反正都是什么都不做嘛,为什么偏偏要选这个?众所周知,在内核这个层次,基本上每一行代码都是最优的,做出这样的选择必定事出有因。
rep;nop的机器码是f3 90,其实就是pause指令的机器码,相当于pause的一个“别名”,这是巧合吗?pause指令又是干什么的呢?
从Intel的手册里面翻出来一段话:
Improves the performance of spin-wait loops. When executing a “spin-wait loop,” a Pentium 4 or Intel Xeon processor suffers a severe performance penalty when exiting the loop because it detects a possible memory order violation. The PAUSE instruction provides a hint to the processor that the code sequence is a spin-wait loop. The processor uses this hint to avoid the memory order violation in most situations, which greatly improves processor performance. For this reason, it is recommended that a PAUSE instruction be placed in all spin-wait loops.
An additional fucntion of the PAUSE instruction is to reduce the power consumed by a Pentium 4 processor while executing a spin loop.
…
简单点说,用pause可以提示CPU接下来的指令序列是用来自旋等待,就不用做memory reorder了,cache什么的也不用废掉了——要知道,cache是很宝贵的资源啊。这指令还有附送的功能——减少能耗。其实内核代码最根本的要求就是:快,快,更加快,这条指令还有附送功能,所以何乐而不为呢?
那么为什么不直接写pause而要写rep;nop呢?理论上是等价的,但是实际上为什么不这样做,不好意思,不清楚。但是可以确定是的pause是Pentium 4才引入的,也许大家比较怀旧所以还用rep;nop也说不定。
So,以后写应用程序而又蛋痛写了循环等待的话,不妨也用用pause吧。不过我想会在应用程序中写循环等待这么傻的代码的程序员,应该也想不到用pause去节能减排兼提速了吧,伤脑筋。
- 转载:x86的cpu_relax解析
- 转载:x86的cpu_relax解析
- [转载]Linux 的 x86 汇编程序设计
- cpu_relax()-----对自选循环等待(spin-wait loops)操作的优化
- 转载 x86,x64,ia64
- x86 LES指令解析
- X86 LDS指令解析
- x86系统下的c语言内存分配解析
- DCC报文的解析,转载
- x86架构是什么?(转载)
- 4. x86常见指令解析
- 一篇讲x86与arm比较的很棒的文章(转载)
- [转载]x86/x86-64/x64/AMD64/IA64/Intel64
- 转载 80X86汇编语言程序设计教程(杨季文)答案的说明
- [转载]X86和ARM架构的处理器能效差异为什么会这么大?
- (转载)解析Windows2000的IDT扩展机制
- 转载:解析商业智能失败的根源
- 【转载】解析“extern”--keen的专栏
- awk给外部变量赋值
- 为何国外软件要比我们强?从C++语言的设计就可以看出。
- 高效的使用stl::map和std::set
- Linux内核list&hlist解读
- 需求驱动赢得创新
- 转载:x86的cpu_relax解析
- 配置VIM语法高亮及自动缩进
- Hadoop源代码eclipse编译指南
- Hadoop开发者入门专刊
- hadoop开发者第二期
- Hadoop开发者第四期
- 改进型MapReduce
- hadoop开发者第三期
- LINUX内存高,触发OOM-KILLER问题解决