我需要解决的一个锁定的问题,对于这种情况:

  1. 多CPU系统。
  2. 所有的CPU是使用一个共同的(软件)的资源。
  3. 只读取到的资源是非常普遍。(处理的进入网络分组)
  4. 写的访问是一个很大小频繁。(相当多的结构变化)。

目前我用的 read_lock_bh, write_lock_bh (自旋锁)的机制。问题是,更多的CPU是,我越得到软锁定在一个作家的上下文。

我读并发篇章 这本书, 但不能完全了解是否阅读器或作家将获得优先权时使用旋锁。

所以问题是:

  1. 不Linux调节锁机构给予的优先权的读者/作家/没有他们吗?
  2. 是否有更好的机制,我可以为了避免在使用那些软拘留所的在我的情况,或可能的方式对我给予的优先权的作家,只要它试图获得锁,同时利用我现在的解决办法?

谢谢, 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/ 对于一个良好写了它的使用。

如果你做的工作,同时保持锁是很小的你可以试试一个正常的互斥、不阅读的作家。它的效率更高。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top