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中:
|
从定义的字面意思可以理解为将需要经常读取的数据链接进内核的 .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被定义为空, 即:
|