linux锁是什么版本号,什么是最好的Linux内核锁定机制的具体方案

这是直接引用Essential Linux Device Drivers这可能是你要找的。这似乎在结束与RCU处理可能是你感兴趣的部分。

读写锁

另一个专门并发调控机制是自旋锁的读写器变种。如果关键部分的使用使得单独的线程从共享数据结构中读取数据或写入共享数据结构,但是两者都不执行,则这些锁定是非常合适的。同时在关键区域内允许多个阅读器线程。 阅读器螺旋锁的定义如下:

rwlock_t myrwlock = RW_LOCK_UNLOCKED;

read_lock(&myrwlock); /* Acquire reader lock */

/* ... Critical Region ... */

read_unlock(&myrwlock); /* Release lock */

然而,如果写线程进入临界区,其它读取器或写入线程不内部允许的。要使用 作家自旋锁,你可以写成这样:

rwlock_t myrwlock = RW_LOCK_UNLOCKED;

write_lock(&myrwlock); /* Acquire writer lock */

/* ... Critical Region ... */

write_unlock(&myrwlock); /* Release lock */

看那IPX路由代码存在于net/ipx/ipx_route.c的读写器自旋锁的活生生的例子。 A 读写器锁定称为ipx_routes_lock保护IPX路由表免受同时访问。线程 需要查找路由表来转发数据包请求读卡器锁。需要添加的线程或从路由表中删除条目的线程获取写入程序锁定。这可以提高性能,因为路由表查找通常比路由表更新多得多。

像普通自旋锁,读写锁也有相应的IRQ变种,即read_lock_irqsave(), read_lock_irqrestore(),write_lock_irqsave()和write_lock_irqrestore()。这些 功能的语义与常规自旋锁的功能类似。

在2.6内核中引入的序列锁或seqlocks是读写器锁,其中作者优于 阅读器。如果对变量的写入操作远远超过读取访问次数,这非常有用。一个例子是本章前面讨论的 jiffies_64变量。作家线程不会等待可能在 之内的读者成为关键部分。正因为如此,读者线程可能会发现,他们的一个关键部分内输入失败 ,可能需要重试:

u64 get_jiffies_64(void) /* Defined in kernel/time.c */

{

unsigned long seq;

u64 ret;

do {

seq = read_seqbegin(&xtime_lock);

ret = jiffies_64;

} while (read_seqretry(&xtime_lock, seq));

return ret;

}

作家保护利用write_seqlock()和write_sequnlock()关键区域。

2.6内核引入了一种叫做另一种机制读复制更新(RCU),其产量提高 性能时,读者远远多于作家。其基本思想是读卡器线程可以在不锁定的情况下执行。编写器线程更复杂。他们对数据结构的副本执行更新操作,并替换读者看到的指针。保持原始副本,直到下一个上下文将所有CPU切换到 ,确保完成所有正在进行的读取操作。请注意,使用RCU比使用迄今为止讨论的基元更加复杂,只有在确定它是正确的工具后才能使用它。 RCU数据 结构和接口功能在include/linux/rcupdate.h中定义。 Documentation/RCU/*有充足的文件。

对于RCU使用示例,请参阅fs/dcache.c。在Linux上,每个文件都与目录条目 信息(存储在称为dentry的结构中),元数据信息(存储在inode中)和实际数据 (存储在数据块中)相关联。每次对文件进行操作时,都会解析文件路径中的组件,并获取相应的dentries。这些dentries被保存在一个名为dcache的数据结构中,以加快未来的操作速度到 。在任何时候,dcache查找的次数远远超过dcache更新,因此使用RCU原语来保护对dcache的引用 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值