__aligned
__aligned(m) 的含义是地址按照m字节对齐
如果在定义一个结构体的后边使用 __attribute__ ((aligned (8))) 则是要求每一个成员按照8字节对齐;
always_inline
定义:这是一个非标准的扩展,通常由特定的编译器(如 GCC )支持。 它强制编译器将指定的函数内联,即使这样做可能会导致代码膨胀。 标准:编译器特定扩展( GCC 等)。
内联,即在c语言的源代码中我们看到这里定义了一个函数,但是如果用IDA看反编译出来的伪代码,其实它是被包含在一个函数中的,这样在底层会少了一些寄存器的保存等调用约定相关的操作,加速调用。如果有一处函数A调用内联函数B,在编译时就要把函数B的汇编代码直接嵌入到函数A中,这样会加速函数执行效率,但是会不断增大程序的体积。
static
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
static定义的变量会存放在bss段,测试代码如下:
在IDA中反汇编:
查看b的定义位置:
__per_cpu
Per-cpu变量是在 linux 内核 2.6 版本时加入的特征。顾名思义,对于任何Per-cpu变量,内核会为每一个cpu分配独立的内存空间,用来保存该变量的副本。
在对称多处理器(SMP-Symmetry Multi Processing)系统中,当多个cpu并发访问同一个资源时,需要使用锁机制及缓存一致性协议来保证数据一致性。但是,访问Per-cpu变量时,由于每个cpu都只访问自己副本中的变量,所以不需要使用锁机制;同时,避免了共享内存时因缓存一致性带来的缓存行失效问题,提高了缓存命中率。所以,使用Per-cpu变量能够有效的提升性能,是典型的以空间换时间的技术。
另外,进程在访问Per-cpu变量时,需要禁止抢占,以免该进程被切换到其它cpu执行,导致数据错误。
作者:CoderHeart
链接:https://juejin.cn/post/7332067091368263732
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。