Linux代码中的unlikely和likely分别是什么意思?

我在Linux代码中没有找unlikely和likely的定义.

在源代码中搜索出来很多无法找.

请各位赐教!

谢谢!

|

内核里有很多线程的代码啊

其实就是告诉编译器哪个分支在实际运行时更可能运行以便产生分支预测相关的机器指令。

用likely 标记那些极有可能运行的分支,而用unlikely标记很少运行的分支来实现优化

|

是GCC对C的扩展,unlikely和likely分别表示一个表达式不太可能为真或很可能为真,这样编译器能够更好的优化指令预取,提高运行效率。

例如在写类似断言或检查错误状态的时候经常使用,因为一般情况下错误总是不大可能发生的。

|

下面节自《Linux Kernel Development》 2nd , 第二章

(书可以在http://elinux.cn下载)

Branch Annotation

The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The compiler uses the directive to appropriately optimize the branch. The kernel wraps the directive in very easy-to-use macros, likely() and unlikely().

For example, consider an if statement such as the following:

if (foo) {

/* ... */

}

To mark this branch as very unlikely taken (that is, likely not taken):

/* we predict foo is nearly always zero ... */

if (unlikely(foo)) {

/* ... */

}

Conversely, to mark a branch as very likely taken:

/* we predict foo is nearly always nonzero ... */

if (likely(foo)) {

/* ... */

}

You should only use these directives when the branch direction is overwhelmingly a known priori or when you want to optimize a specific case at the cost of the other case. This is an important point: These directives result in a performance boost when the branch is correctly predicted, but a performance loss when the branch is mispredicted. A very common usage for unlikely() and likely() is error conditions. As one might expect, unlikely() finds much more use in the kernel because if statements tend to indicate a special case.

|

指令优化的东西

控制CPU的指令预取

|

ls正解,内核的模块很多都是这样的,比如内核地址空间地址fixup,

.section .fixup

.previous

不大可能出现的代码被编译器安排到远的地方,这样可以充分利用CPU的流水线技术。

linux在代码中表示什么意思,Linux代码中的unlikely和likely分别是什么意思?相关推荐

  1. Linux内核分析(一)通过汇编代码,理解程序在计算机中是如何运行的

    作者:于波 声明:原创作品转载请注明出处    来源:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 首 ...

  2. Linux中w r x数学代码,Linux bc命令实现数学计算器

    bash shell 内置了对整数运算的支持,但是并不支持浮点运算,而 linux bc 命令可以很方便的进行浮点运算,当然整数运算也不再话下. bc 甚至可以称得上是一种编程语言了,它支持变量.数组 ...

  3. linux下从git获取有权限的代码,linux下从源代码安装git

    之所以有这样的需求,是因为部分预安装的git版本太低,很多功能没有并且安全性存在问题. 比如git submodule add xxx@host:yyy.git必须在父repo的root目录安装,而新 ...

  4. Windows/Linux TCP Socket网络编程简介及测试代码

    典型的网络应用是由一对程序(即客户程序和服务器程序)组成的,它们位于两个不同的端系统中.当运行这两个程序时,创建了一个客户进程和一个服务器进程,同时它们通过从套接字(socket)读出和写入数据在彼此 ...

  5. Linux包管理器apt/apt-get发现远程代码执行漏洞

    研究人员Max Justicz日前发现了知名Linux包管理器apt/apt-get中的远程代码执行漏洞,该漏洞允许外部进行中间人攻击并获取root权限以执行任何代码.该漏洞已在最新版本apt修复,如 ...

  6. linux install命令文件夹,详解Linux系统中的install命令的用法

    用法:install [选项]... [-T] 源文件 目标文件 或:install [选项]... 源文件... 目录 或:install [选项]... -t 目录 源文件... 或:instal ...

  7. linux动态线程池--原理,这儿的代码不完整

    本文给出了一个通用的线程池框架,该框架将与线程执行相关的任务进行了高层次的抽象,使之与具体的执行任务无关.另外该线程池具有动态伸缩性,它能根据执行任务的轻重自动调整线程池中线程的数量.文章的最后,我们 ...

  8. 十天学Linux内核之第九天---向内核添加代码

    原文:十天学Linux内核之第九天---向内核添加代码 睡了个好觉,很晚才起,好久没有这么舒服过了,今天的任务不重,所以压力不大,呵呵,现在的天气真的好冷,不过实验室有空调,我还是喜欢待在这里,有一种 ...

  9. Linux Kernel系列三:Kernel编译和链接中的linker script语法详解

    先要讲讲这个问题是怎么来的.(咱们在分析一个技术的时候,先要考虑它是想解决什么问题,或者学习新知识的时候,要清楚这个知识的目的是什么). 我在编译内核的时候,发现arch/arm/kernel目录下有 ...

  10. 搜索linux中大于m文件,linux 下查找大于100M的文件(转)

    命令行如下 find . -type f -size +1000000k Linux系统下查找大文件或目录的技巧 当硬盘空间不够时,我们就很关心哪些目录或文件比较大,看看能否干掉一些了,怎么才能知道呢 ...

最新文章

  1. 取文字_有内涵的男孩名字:用三字经为宝宝取一个独特稀少有内涵的好名
  2. linux下定时清理磁盘日志步骤
  3. Spring注解编程基石(四)
  4. 图像处理核函数:之高斯核的生成方法 python
  5. mongodb 集群shard_mongodb单机配置shard分片集群
  6. 把github转至gitee
  7. 剑指offer——面试题52:构建乘积数组
  8. linux串口输出重定向到文件,DOS 下将屏幕打印输出重定向到指定文件中(或重定向到并口/串口)...
  9. AVR之bootloader介绍
  10. hive窗口函数总结
  11. [二]Unity接入Steam技术[大厅,邀请好友,Steam消息事件,成就]
  12. 吴恩达机器学习ex4 Neural Networks Learning (python)
  13. java 数字转大写 100行内搞定
  14. 神器——写Markdown来画流程图、时序图
  15. python列表怎么比较大小_python列表怎么比较大小
  16. matlab乖离率计算,BIAS乖离率指标计算公式
  17. shell脚本——sql连接及其查询结果重定向到txt
  18. 软件测试到底要不要报培训班学习?看完这个就知道了
  19. appnode面板中php命令 appnode-php80换成php
  20. 虚拟机和服务器如何分辨率,电脑如何设置虚拟机VMware分辨率|VMware怎么设置全屏...

热门文章

  1. 新世纪福音战士EVA
  2. 如何解决图片403问题
  3. c语言表示整型变量,在表示 C语言的整型变量时,表示“无符号长整型”的符号是( )。...
  4. iOS-无痕埋点设计
  5. linux 创建子进程,linux中fork同时创建多个子进程的方法(一)
  6. 愚人节整人软件测试自学,愚人节被玩坏的五大整人APP 帮你问鼎愚人节最佳损友...
  7. Parser-Free Virtual Try-on via Distilling Appearance Flows - 基于外观流提取的免解析器虚拟试穿
  8. 新乡腰椎间盘突出 腰椎间盘突出如何治疗
  9. 王劲说无人车是他的终身事业,他要重回行业一线!
  10. 微信小程序——微信开发工具:网络连接失败