`
- 浏览:
6313698 次
-
读-拷贝-更新(RCU)是为了保护在多数情况下被多个CPU读的数据结构而设计的另一种同步技术。RCU允许多个读者和写者并发执行(相对于只允许一个写者执行的顺序锁有了改进)。而且,RCU是不使用锁的,就是说,它不使用被所有CPU共享的锁或计数器,在这一点上与读/写自旋锁和顺序锁(由于高速缓存行窃用和失效而有很高的开销)相比RCU具有更大的优势。RCU是如何不使用共享数据结构而令人惊讶地实现多个CPU同步呢?其关键的思想包包括限制RCP的范围的两个约束条件,这个是重中之重,如下所述:1. RCU只保护被动态分配并通过指针引用的数据结构。2. 在被RCU保护的临界区中,任何内核控制路径都不能睡眠。当内核控制路径要读取被RCU保护的数据结构时,执行宏rcu_read_lock(),它仅仅是preempt_disable():#define rcu_read_lock() / do { / preempt_disable(); / __acquire(RCU); / } while(0)接下来,读者间接引用该数据结构指针所对应的内存单元并开始读这个数据结构。正如在前面所强调的,读者在完成对数据结构的读操作之前,是不能睡眠的。最后,用等同于preempt_enable()的宏rcu_read_unlock()标记临界区的结束:#define rcu_read_unlock() / do { / __release(RCU); / preempt_enable(); / } while(0)根据上面所述,读者几乎不做任何事情来防止竞争条件的出现,所以写者的工作不得不做得更多一些。当写者要更新数据结构时,它间接引用指针并生成整个数据结构的副本。接下来,写者修改这个副本。一但修改完毕,写者改变指向数据结构的指针,以使它指向被修改后的副本。由于修改指针值的操作是一个原子操作,所以旧副本和新副本对每个读者或写者都是可见的,在数据结构中不会出现数据崩溃。尽管如此,还需要内存壁垒来保证:只有在数据结构被修改之后,已更新的指针对其他CPU才是可见的。如果把自旋锁与RCU结合起来以禁止写者的并发执行,就隐含地引入了这样的内存壁垒。然而,使用RCU技术的真正困难在于:写者修改指针时不能立即释放数据结构的旧副本。因为,写者开始修改时,正在访问数据结构的读者可能还在读旧副本。只有在CPU上的所有(潜在的)读者都执行完宏rcu_read_unlock()之后,才可以释放旧副本,并换成新副本。所以,根据约束,内核要求每个潜在的读者在下面的操作之前执行rcu_read_unlock()宏:(1)CPU执行进程切换(参见前面的约束条件2)(2)CPU开始在用户态执行(2)CPU执行空循环对上面每种CPU情况,Linux给其下了一个定义,叫做CPU已经经过了静止状态(quiescent state)。这个概念就是这么来的。写者调用函数call_rcu()来释放数据结构的旧副本(注意,内核没有提供什么rcu_write_lock函数,因为写也是并行的,只是替换一个副本,将新副本与旧副本替换):void fastcall call_rcu(struct rcu_head *head, void (*func)(struct rcu_head *rcu)){ unsigned long flags; struct rcu_data *rdp; head->func = func; head->next = NULL; local_irq_save(flags); rdp = &__get_cpu_var(rcu_data); *rdp->nxttail = head; rdp->nxttail = &head->next; if (unlikely(++rdp->qlen > qhimark)) { rdp->blimit = INT_MAX; force_quiescent_state(rdp, &rcu_ctrlblk); } local_irq_restore(flags);}当所有的CPU都通过静止状态之后,call_rcu()接受rcu_head描述符(通常嵌在要被释放的数据结构中)的地址和将要调用的回调函数的地址(*func)作为参数。一旦回调函数被执行,它通常释放数据结构的旧副本。struct rcu_head { struct rcu_head *next; void (*func)(struct rcu_head *head);};函数call_rcu()把回调函数和其参数的地址存放在rcu_head描述符中,然后把描述符通过next字段插入回调函数的每CPU(per-CPU)链表中。内核每经过一个时钟滴答就周期性地检查本地CPU是否经过了一个静止状态,即上述三种情况。如果所有CPU都经过了静止状态,本地tasklet的描述符存放在每CPU变量rcu_tasklet中就执行每CPU链表中的所有回调函数,释放数据结构的旧副本。RCU是Linux 2.6中新加的功能,主要用在网络层和虚拟文件系统中。
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
### Linux内核RCU机制分析 #### 一、概述 Read-Copy-Update(简称RCU)是一种在Linux内核中广泛使用的并发控制技术。它主要用于处理读取密集型场景下的数据一致性问题,通过允许读操作不受写操作的影响,从而提高...
### Linux 内核RCU机制详解 #### 一、RCU概述 RCU(Read-Copy-Update)是一种专门针对读多写少场景优化的同步机制,在Linux内核2.5版本开发期间引入。尽管其核心概念相对简单,但理解和掌握这一机制却需要一定的...
### Linux RCU机制详解 #### 一、前言 RCU(Read-Copy-Update)是一种用于并发控制的机制,在Linux内核中被广泛应用。它主要用于处理读多写少的场景,通过允许读操作无锁地进行,从而极大提高了系统的性能。RCU...
RCU机制的关键优势在于它对读操作不加锁,因此在读多写少的场景下,相较于传统的锁机制,能显著提高性能和并发度。 从内容部分来看,文档P0461R1中提供了C++风格RCU API的示例函数,包括读锁、写锁、同步和延迟回收...
知识点:Linux RCU机制及其应用 ### Linux RCU机制简介 Read-Copy-Update(简称RCU)是一种在Linux内核中使用的并发控制技术,它主要用于处理读多写少的场景,尤其适用于像网络设备这样的高并发环境中。RCU允许读...
标题“rcu.rar_control_rcu”暗示了我们正在讨论RCU机制与控制消息的发送相关的内容。描述中的"extract control messages the sendmsg() control buffer"提示我们,这可能涉及通过`sendmsg()`系统调用处理内核控制...
3. 在CPU上使用RCU机制管理数据,确保在GPU计算过程中数据的一致性。 4. 在GPU上并行计算第一组粒子碰撞的时间,利用CUDA的并行性加速计算。 5. 使用RCU机制安全地更新数据,将计算结果返回到CPU。 6. 分析和可视化...
7. **安全测试**:确保RCU机制在处理敏感信息时,能提供必要的安全保护,防止信息泄露。 压缩包内的“测试结果”文件,可能包含了一系列测试用例的详细报告,包括测试目标、方法、步骤、预期结果和实际结果。这些...
内存屏障、内存映射、同步机制、GDB基本功能、CPU缓存、...描述符、虚拟内存机制、RCU机制、ARM架构、高速缓存、页面回收、数据同步、回写机制、页交换、 软硬中断区别、等待队列、字符设备驱动、系统调用、内存碎片。
2. 读-拷贝-更新(Read-Copy-Update,简称RCU):Linux 2.6内核引入了RCU机制,允许读者和写者并发执行,无需获取任何锁即可访问被保护的数据结构。写者在修改数据前需要拷贝一份数据副本,并在副本上进行修改。写者...
rcu_read_lock()是RCU机制的一部分,它提供了一个读取临界区,在这个区域内,代码可以安全地读取被RCU保护的数据,而不用担心其他线程进行破坏性的修改。但是,RCU读锁不会阻止数据结构的删除,只是确保在读取期间,...
然而,理解并合理应用RCU需要深入理解其工作机制和潜在问题,这正是《Mathieu-Desnoyers-talk-lpc2009.pdf》这份资料可能涵盖的内容,它可能会提供更详细的讲解和案例分析,帮助读者进一步掌握RCU在Linux系统中的...
标题中的"rcu_example"是指一个示例项目,旨在帮助开发者理解如何在Linux内核中应用RCU机制。这个示例项目可能是用C语言编写的,因为给定的标签中包含了"C",这表明它会涉及到C语言编程和内核编程相关的知识。 **...
RCU 机制是一种机制,它可以解决多个 CPU 同时读写共享数据的场景。RCU 机制可以允许多个 CPU 同时进行写操作,不使用锁,并且实现垃圾回收来处理旧数据。 九、内存屏障(Memory Barrier) 内存屏障是一种机制,它...
RCU是一种无锁的数据结构更新机制,它允许读取操作一直进行,即使有其他线程正在对数据结构进行修改。读取者无需任何同步措施,而写入者则需要协调所有可能的读者完成后再进行更新。这种设计极大地提高了系统的并行...
【标题】"vlan_core.rar_V2" 涉及的核心知识点是虚拟局域网(VLAN)技术在Linux内核中的实现,特别是针对版本2.13.6的RCU(Read-Copy Update...同时,了解如何在RCU机制下正确操作,是确保内核代码稳定性和性能的关键。
RCU是一种针对读多写少的共享数据结构的同步机制,最初由Paul E. McKenney、Jonathan Appavoo、Andi Kleen、Orran Krieger、Rusty Russell、Dipankar Sarma和Maneesh Soni等人在Linux技术社区中开发和实现。这种技术...
在深入理解HSR协议和RCU机制的基础上,开发者需要确保 `hsr_forward` 函数在读取端口信息时正确地获取和释放RCU读锁,避免死锁和数据不一致的问题。这通常涉及到对Linux内核编程和并发控制的深入理解,以及对HSR协议...