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

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的流水线技术。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值