内核分支优化宏likely与unlikely 与 __read_mostly

本文介绍了GCC编译器中的两种优化手段:likely与unlikely宏用于改善条件分支预测,以及__read_mostly属性用于提升频繁读取数据的缓存命中率。通过这些技术的应用,可以有效地提高程序的运行效率。
摘要由CSDN通过智能技术生成

1.likely && unlikely

分支声明

对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分支选择进行优化。内核把这条指令封装成了宏,比如likely()和unlikely(),这样使用起来比较方便。
例如,下面是一个条件选择语句:
if (foo) {
/* .. */
}
如果想要把这个选择标记成绝少发生的分支:
/* 我们认为foo绝大多数时间都会为0.. */
if (unlikely(foo)) {
/* .. */
}
相反,如果我们想把一个分支标记为通常为真的选择:
/* 我们认为foo通常都不会为0 */
if(likely(foo)) {
/* .. */

}

需要注意的是:likely与unlikely并没有改变程序逻辑,仅仅是对分支预测提供一定的依据。


2.__read_mostly

__read_mostly是内核链接时使用的, 与体系结构的cache机制密切相关. 在linux kernel里定义在x86, ia64, powerpc, parisc, s390, sh, sparc 体系结构的 asm/cache.h中:


#define __read_mostly __attribute__((__section__(".data.read_mostly")))


从定义的字面意思可以理解为将需要经常读取的数据链接进内核的 .data.read_mostly段. 在x86, ia64, powerpc, parisc, s390, sh, sparc 的链接脚本里(arch/xxx/kernel/vmlinux.lds.S)有关于 .data.read_mostly的定义, 就是指定 .data.read_mostly段的数据在内核加载时放到CPU的cache中. 在那些没有cache的体系结构上, __read_mostly被定义为空, 即:


#define __read_mostly



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值