- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在阅读 Read-copy-update (RCU) .对于 SMP,我不确定我是否理解正确。据我所知,RCU 确保更新以原子方式执行。在单链表的例子中,很明显可以在一个操作中完成用新元素交换旧元素,因为它是通过改变指针来完成的。但是如何保证在双向链表的情况下RCU仍然是原子执行的呢?有两个指针指向给定元素(next 和 prev),因此该元素的每次更改都需要更改这两个指针。如何确保更改这两个指针将作为原子操作完成?在 Linux 中是如何完成的?
最佳答案
我在问自己同样的问题,快速搜索找到了 a reply to a comment , 摘自 an introduction article to RCU作者 Paul McKenney(据我所知,他是 RCU 背后思想的多个并发发明者之一)。
问题:
I'm wondering whether the omission of the backlinks in the examples is a good thing. The omission makes the technique trivial, since publishing only involves one replacing one pointer.
What about the second, back, one? Without support for atomic two-pointer updates, how can both the p->prev->next = q and p->next->prev = q updates be performed without risking clients to see an inconsistent view of the doubly linked list? Or is that not a problem in practice?
Thanks for the article, though. Looking forward to the next installment!
答案:
Glad you liked the article, and thank you for the excellent question! I could give any number of answers, including: In production systems, trivial techniques are a very good thing. Show me an example where it is useful to traverse the ->prev pointers under RCU protection. Given several such examples, we could work out how best to support this. Consistency is grossly overrated. (Not everyone agrees with me on this, though!) Even with atomic two-pointer updates, consider the following sequence of events: (1) task 1 does p=p->next (2) task 2 inserts a new element between the two that task 1 just dealt with (3) task 1 does p=p->prev and fails to end up where it started! Even double-pointer atomic update fails to banish inconsistency! ;-) If you need consistency, use locks. Given the example above, we could support a level of consistency equivalent to the double-pointer atomic update simply by assigning the pointers in sequence -- just remove the prev-pointer poisoning from list_del_rcu(), for example. But doing this would sacrifice the ability to catch those bugs that pointer-poisoning currently catches.
So, there might well come a time when the Linux kernel permits RCU-protected traversal of linked lists in both directions, but we need to see a compelling need for this before implementing it.
所以基本上,Linux 在执行 RCU 时“不允许”在两个方向上向后遍历。如评论中所述,您可以使用一些较新的硬件机制,如 Double Compare And Swap ,但它们并非随处可用,并且如前所述,您仍然会遇到内存一致性问题。
关于c - Linux RCU 和双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40360073/
Read-Copy-Update (RCU) 是一种手动内存管理技术,在 Linux 内核中越来越流行。 是否可以设计一种使用 RCU 而不是传统垃圾收集器来回收无法访问的内存的语言和 VM? 最佳答
我有许多读取器线程读取缓存数据,例如 struct { hash_table *cache; int64_t version; } ctx; 许多读取器线程读取缓存,例如 void *ge
你好, 我是 linux 内核中 rcu 锁定机制的新手。 在尝试了解 rcu 的工作原理和提供的 API 时,我看到 rcu_read_lock()、rcu_synchronize() 不采用任何锁
我有一个样板函数,可以在树状数据库中找到一个结构: struct foo { struct foo *child1; /* RCU-protected. */ struct foo *
(来自 LWN 上的一篇文章) 1 rcu_read_lock(); 2 list_for_each_entry_rcu(p, head, list) { 3 do_something_wi
我正在阅读 Read-copy-update (RCU) .对于 SMP,我不确定我是否理解正确。据我所知,RCU 确保更新以原子方式执行。在单链表的例子中,很明显可以在一个操作中完成用新元素交换旧元
在做教程时,我将数据批量加载到我的 dynamoDB JobsApplication 表中,其中包含大约 400 个随机职位发布。 使用 Node.js 和 aws-sdk 我执行了扫描操作。 var
任务 我有一个我为我的 RaspBerry Pi 2 编写的小内核模块,它实现了一个额外的系统调用来生成功耗指标。我想修改系统调用,以便只有在特殊用户(例如“root”或用户“pi”)发出时才会调用它
看了很多文章,还是搞不懂WCU和RCU是什么意思。 Dynamo 提供以下免费套餐: 25 个预置写入容量单元 (WCU) 25 个预置读取容量单元 (RCU) “每秒 25 次读写”是什么意思?我有
看了很多文章,还是搞不懂WCU和RCU是什么意思。 Dynamo 提供以下免费套餐: 25 个预置写入容量单元 (WCU) 25 个预置读取容量单元 (RCU) “每秒 25 次读写”是什么意思?我有
我已经安装了 OBIEE12c(12.2.1.4)。 OBIEE12c 认证矩阵表示 RCU 创建实用程序支持 oracle 数据库 19c。但是,当我运行 RCU 创建实用程序时,它无法满足先决条件
我试图了解一些内核同步机制(顺序锁、RCU(读取-复制-更新)和每 CPU 锁)的不同用例,建议用于编写您的设备驱动程序或内核模块。任何示例将不胜感激。 最佳答案 顺序锁 这是一种巧妙的锁定方法,写入
我想知道 nf_conntrack_find_get() 在 linux 内核中是否真的通过 RCU 保护了 ct 指针。 Read-Copy-Update(RCU) 可以在节点更新时保护访问(读取)
我正在开发的 Android TV (ATV) 应用具有语音控制功能。基本上,当用户按下 Remote 上的麦克风按钮时,按键事件(由 KeyEvent.KEYCODE_SEARCH 标识)由应用处理
我正在使用 AWS 免费套餐,并且我有 5 个 DynamoDB 表,每个表具有 5 个读/写容量,尽管我不确定是否需要 5 个 - 我只是将它们用于简单的 Lambda 函数,并且绝对没有太多的写入
在 Windows 10 机器上安装 Oracle Data Integrator (ODI) 12.2.1.4.0 时,Studio 安装成功,但 rcu.bat 脚本不运行,无法创建存储库。 双击
为了考虑将 AWS Keyspaces 作为本地 Cassandra 集群的替代方案,我想进行成本估算。但是, key 空间定价基于写入请求单位 (WRU) 和读取容量单位 (RCU)。 https:
我是一名优秀的程序员,十分优秀!