第5章:并发与竞态条件-10:The Spinlock Functions

In continuation of the previous text 第5章:并发与竞态条件-9:The Spinlock Functions, let's GO ahead.

Reader/Writer Spinlocks

The kernel provides a reader/writer form of spinlocks that is directly analogous to the reader/writer semaphores we saw earlier in this chapter. These locks allow any number of readers into a critical section simultaneously, but writers must have exclusive access. Reader/writer locks have a type of rwlock_t, defined in . They can be declared and initialized in two ways:

内核提供的读写自旋锁,与本章前文介绍的读写信号量语义直接对应。这类锁允许任意数量的读线程同时进入临界区,但写线程必须独占访问。读写自旋锁的类型为 rwlock_t,定义于 <linux/spinlock.h> 头文件,可通过两种方式声明和初始化:

rwlock_t my_rwlock = RW_LOCK_UNLOCKED; /* Static way */
rwlock_t my_rwlock;
rwlock_init(&my_rwlock); /* Dynamic way */

The list of functions available should lookreasonably familiar by now. For readers, the following functions are available:

读线程的锁定与释放函数与普通自旋锁用法相近,如下所示:

void read_lock(rwlock_t *lock);
void read_lock_irqsave(rwlock_t *lock, unsigned long flags);
void read_lock_irq(rwlock_t *lock);
void read_lock_bh(rwlock_t *lock);
void read_unlock(rwlock_t *lock);
void read_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
void read_unlock_irq(rwlock_t *lock);
void read_unlock_bh(rwlock_t *lock);

Interestingly, there is no read_trylock. The functions for write access are similar:

值得注意的是,读写自旋锁没有读非阻塞函数(read_trylock),写线程的函数与读线程类似,具体如下:

void write_lock(rwlock_t *lock);
void write_lock_irqsave(rwlock_t *lock, unsigned long flags);
void write_lock_irq(rwlock_t *lock);
void write_lock_bh(rwlock_t *lock);
int write_trylock(rwlock_t *lock);
void write_unlock(rwlock_t *lock);
void write_unlock_irqrestore(rwlock_t *lock, unsigned long flags);
void write_unlock_irq(rwlock_t *lock);
void write_unlock_bh(rwlock_t *lock);

Reader/writer locks can starve readers just as rwsems can. This behavior is rarely a problem; however, if there is enough lockcontention to bring about starvation, performance is poor anyway.

与读写信号量(rwsem)一样,读写自旋锁也可能导致读线程饥饿(即读线程长时间无法获取锁)。但这种情况通常不会造成严重问题:如果锁的竞争激烈到足以导致饥饿,系统性能本身已经很差了。

补充说明:

  1. 函数配对原则

    读写自旋锁的函数必须严格配对使用,规则与普通自旋锁一致:例如 read_lock_irqsave 必须与 read_unlock_irqrestore 配对,write_lock_bh 必须与 write_unlock_bh 配对,否则可能导致中断或软中断状态异常。

  2. 与读写信号量(rwsem)的核心差异

    特性

    读写自旋锁(rwlock_t)

    读写信号量(rwsem)

    适用上下文

    中断上下文、无睡眠进程上下文

    仅进程上下文(可睡眠)

    等待方式

    自旋(忙循环)

    阻塞睡眠

    性能(无竞争)

    极高

    较低(有上下文切换开销)

    读线程非阻塞

    不支持(无 read_trylock)

    支持(down_read_trylock)

  3. 无 read_trylock 的原因

    ​​​​​​​内核设计中,读线程的非阻塞尝试(read_trylock)需求极少,且实现复杂度高(需处理多读者并发的原子性),因此未提供该接口。若需读线程非阻塞访问,可改用普通自旋锁或其他同步机制。

  4. 适用场景

    ​​​​​​​读写自旋锁适用于 “读操作远多于写操作、且临界区极短” 的场景,例如:

    1. 中断上下文与进程上下文共享的只读数据保护。

    2. 驱动中共享数据的统计信息读取(读多写少);

  5. 饥饿问题的规避

    ​​​​​​​若写操作频繁,应避免使用读写自旋锁,改用普通自旋锁或互斥锁,以防止读线程长期饥饿。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeeplyMind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值