博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
queued spinlock锁的使用
阅读量:4216 次
发布时间:2019-05-26

本文共 1491 字,大约阅读时间需要 4 分钟。

qspinlock是queued spinlock的简称,主要用于解决在锁竞争激烈的情况下来减少spinlock 所损失的性能,提高系统总体性能qspinlock的数据结构定义在kernel/qspinlock.c中struct __qspinlock {	union {		atomic_t val;#ifdef __LITTLE_ENDIAN		struct {			u8	locked;			u8	pending;		};		struct {			u16	locked_pending;			u16	tail;		};#else		struct {			u16	tail;			u16	locked_pending;		};		struct {			u8	reserved[2];			u8	pending;			u8	locked;		};#endif可以看到qspinlock 就是一个原子变量,但是在实际使用中却将这个原子变量分成很多位域具体位域如下:/* * Bitfields in the atomic value: * * When NR_CPUS < 16K *  0- 7: locked byte *     8: pending *  9-15: not used * 16-17: tail index * 18-31: tail cpu (+1) * * When NR_CPUS >= 16K *  0- 7: locked byte *     8: pending *  9-10: tail index * 11-31: tail cpu (+1) */ qspinlock 提供的API 都定义在include/asm-generic/qspinlock.h中 #define arch_spin_is_locked(l)		queued_spin_is_locked(l)#define arch_spin_is_contended(l)	queued_spin_is_contended(l)#define arch_spin_value_unlocked(l)	queued_spin_value_unlocked(l)#define arch_spin_lock(l)		queued_spin_lock(l)#define arch_spin_trylock(l)		queued_spin_trylock(l)#define arch_spin_unlock(l)		queued_spin_unlock(l)从这里可以知道用户并不知能直接调用qspinlock的提供的锁函数。而是使用传统的spinlock的接口接口就可以static __always_inline int spin_is_locked(spinlock_t *lock){	return raw_spin_is_locked(&lock->rlock);}#define raw_spin_is_locked(lock)	arch_spin_is_locked(&(lock)->raw_lock)所以内核采用qspinlock 对用户来讲是透明的,只要内核使能了qspinlock,用户不用改任何code 就可以享受到qspinlock带来的性能提升从makefile 中可以知道要使能qspinlock的话,应该打开CONFIG_QUEUED_SPINLOCKSobj-$(CONFIG_QUEUED_SPINLOCKS) += qspinlock.o

转载地址:http://xnnmi.baihongyu.com/

你可能感兴趣的文章
eclipse: android rename package name
查看>>
cocos2dx c++调用java思想
查看>>
cocos2dx lua Node节点 私有数据存取
查看>>
lua math.ceil math.ceil
查看>>
cocos2dx CCNode计算node的大小
查看>>
cocos2dx 布局记录(1)
查看>>
lua 多行注释和取消多行注释
查看>>
缩放系数计算
查看>>
cocos2dx --- 按钮点击居中放大
查看>>
cocos2dx menu位置计算
查看>>
cocos2dx资源加载机制(同步/异步)
查看>>
cocos2dx C++调用java -- 字符串传递
查看>>
git学习网站
查看>>
JavaScript 学习网站
查看>>
cocos2dx java调用c++ -- 字符串传递
查看>>
CCScaleTo与CCScaleBy比较
查看>>
cocos2dx CCObject引用计数,内存释放分析(1)
查看>>
cocos2dx2.X 编译时,传递编译选项
查看>>
ccCArray.cpp 文件
查看>>
cocos2dx 屏幕大小
查看>>