- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在研究 raw_spinlock
结构,它在 /usr/src/linux/include/linux/spinlock_types.h
中:
typedef struct raw_spinlock {
arch_spinlock_t raw_lock;
#ifdef CONFIG_GENERIC_LOCKBREAK
unsigned int break_lock;
#endif
#ifdef CONFIG_DEBUG_SPINLOCK
unsigned int magic, owner_cpu;
void *owner;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
} raw_spinlock_t;
我认为raw_lock
是一种依赖架构的锁,dep_map
是一种避免死锁的数据结构,但是break_lock
、magic
、owner_cpu
和 *owner
是什么意思?
最佳答案
自旋锁
spinlock
是内核代码中用于自旋锁的公共(public) API。
参见 Documentation/locking/spinlocks.txt
.
原始自旋锁
raw_spinlock
是普通自旋锁的实际实现。在非 RT 内核上,spinlock
只是 raw_spinlock
的包装器。在 RT 内核上,spinlock
并不总是使用 raw_spinlock
。
参见 this article在 LWN 上。
arch_spinlock
arch_spinlock
是自旋锁实现的平台特定部分。 raw_spinlock
通常与平台无关,并将低级操作委托(delegate)给 arch_spinlock
。
lockdep_map
lockdep_map
是用于锁定正确性验证器的依赖映射。
参见 Documentation/locking/lockdep-design.txt
.
破解锁
在 SMP 内核上,当一个 CPU 上的 spin_lock()
开始循环而另一个 CPU 上持有锁时,它将此标志设置为 1
。持有锁的另一个 CPU 可以使用 spin_is_contended()
定期检查此标志,然后调用 spin_unlock()
。
这允许同时归档两个目标:
另见 this article .
魔法
, owner
, owner_cpu
这些字段在设置 CONFIG_SPINLOCK_DEBUG
时启用,有助于检测常见错误:
magic
在创建自旋锁时设置为一些随机选择的常量(SPINLOCK_MAGIC
即 0xdead4ead
)owner
在 spin_lock()
中设置为当前进程;owner_cpu
在 spin_lock()
中设置为当前 CPU id。spin_unlock()
检查当当前进程和 CPU 与调用 spin_lock()
时相同时调用它。
spin_lock()
检查 magic
是否等于 SPINLOCK_MAGIC
以确保调用者传递了指向正确初始化自旋锁的指针并且(希望)没有发生内存损坏。
关于linux - raw_spinlock 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256085/
我正在研究 raw_spinlock 结构,它在 /usr/src/linux/include/linux/spinlock_types.h 中: typedef struct raw_spinloc
我是一名优秀的程序员,十分优秀!