什么是最好的linux内核锁定机制对于特定的方案
-
06-09-2019 - |
题
我需要解决的一个锁定的问题,对于这种情况:
- 多CPU系统。
- 所有的CPU是使用一个共同的(软件)的资源。
- 只读取到的资源是非常普遍。(处理的进入网络分组)
- 写的访问是一个很大小频繁。(相当多的结构变化)。
目前我用的 read_lock_bh
, write_lock_bh
(自旋锁)的机制。问题是,更多的CPU是,我越得到软锁定在一个作家的上下文。
我读并发篇章 这本书, 但不能完全了解是否阅读器或作家将获得优先权时使用旋锁。
所以问题是:
- 不Linux调节锁机构给予的优先权的读者/作家/没有他们吗?
- 是否有更好的机制,我可以为了避免在使用那些软拘留所的在我的情况,或可能的方式对我给予的优先权的作家,只要它试图获得锁,同时利用我现在的解决办法?
谢谢, Nir
解决方案
这是直接引用 重要的Linux设备的司机 这可能是你要找的。它似乎是部分处理区域协调单位在结束可能是你感兴趣。
读写的锁
另一个专门的并发的调节机制,是读者-作家变式的自旋锁.如果使用情况 关键的部分是这样的,单独的线阅读或写入一个共用数据结构,但是不做 两者,这些锁是天作之合。多读者线允许内部的关键区域同时进行。读者自旋锁定义如下:
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
对于一个现实生活的例的一读写调节锁.一个
读者-作家称锁 ipx_routes_lock
保护IPX路由表同时访问。螺纹
这需要看路由表以前报请求的读者锁。线,需要增加或
删除项自由表获得作家锁。这可以提高性能,因为通常有
远远更多的实例路由查表比由表更新。
像常规的自旋锁,读者-作家锁也有对应的中断变体,即 read_lock_irqsave()
,
read_lock_irqrestore()
, write_lock_irqsave()
, , write_lock_irqrestore()
.语义的这些
功能都是类似的那些定期的自旋锁.
序锁或seqlocks,介绍了在2.6核心,是读者-作家锁,作家是受到青睐过
读者。这是有用的,如果写操作上的一个变量远远多于阅读的访问。一个例子是的
jiffies_64
变前讨论中的这一章。作家线不等待读者可以是内部
一个关键部分。因此,阅读器螺纹可以发现,他们的入境内的一个关键部分已经失败
并且可能需要retry:
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内核介绍了另一个机制被称为 读副本更新(协调股), 这将产生改进
性能在读者远远超过作家.基本的想法是,阅读器螺纹可以执行不
锁。作家线更加复杂。他们执行更新的操作上的一个复制的数据结构和
替代指针,读者参阅。原始副本一直保持到下一个上下文关于所有Cpu
保证完成所有正在进行的阅读作业。要知道,利用区域协调股是更多地参与比使用
原语的讨论迄今为止,并应仅用于如果你确定这是正确的工具。区域协调单位的数据
结构和界面功能的定义 include/linux/rcupdate.h
.有充分的文件
Documentation/RCU/*
.
对于一个区域协调单位的使用实例, 看看 fs/dcache.c
.在Linux上,每个文件都是相关的,与目录项
信息(存储在一个结构称为dentry)、元数据信息(存储在一个内节点),并且实际数据
(存储在数据块)。每次工作文件、组件,在该文件的路径进行分析,
相应的目录项获得。该目录项是保持缓存在一个数据结构称为dcache,
速度未来的行动。在任何时候,数dcache查找更多dcache更新,所以
引用dcache保护使用RCU元。
其他提示
这不是种类的使用情况的区域协调单位的设计是为了处理?看看 http://lwn.net/Articles/262464/ 对于一个良好写了它的使用。
如果你做的工作,同时保持锁是很小的你可以试试一个正常的互斥、不阅读的作家。它的效率更高。