linux - raw_spinlock 是什么意思?

标签 linux linux-kernel synchronization kernel spinlock

我正在研究 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_lockmagicowner_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_MAGIC0xdead4ead)
  • ownerspin_lock() 中设置为当前进程;
  • owner_cpuspin_lock() 中设置为当前 CPU id。

spin_unlock() 检查当当前进程和 CPU 与调用 spin_lock() 时相同时调用它。

spin_lock() 检查 magic 是否等于 SPINLOCK_MAGIC 以确保调用者传递了指向正确初始化自旋锁的指针并且(希望)没有发生内存损坏。

参见 kernel/locking/spinlock_debug.c .

关于linux - raw_spinlock 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32256085/

相关文章:

java - 'nameList' 变量是实例变量还是类变量?为什么不包含在 'synchronised(this){}"语句中呢?

mysql - 在两个不同的数据库之间同步数据

java - Java 中的 SCP,带有没有密码和用户名的 URI

Linux 内核多核问题

c - 如何处理来自 Linux 内核模块中已经具有不可共享处理程序的 PCI 设备的中断?

c - 暂停一个linux内核函数

mysql - mysql中表间数据同步

linux - 在什么情况下控制权从用户空间传递到 Linux 内核空间?

linux - Linux/Unix 应用程序的源代码最适合保存在哪里?

linux - 在 Linux 中编辑比屏幕宽的文件