首先,RCU 表示"Read-Copy-Update"(阅读-复制-更新),是一种用来保护共享内存数据结构同时不阻塞读操作的机制。RCU机制使得读操作在共享内存数据结构被更新时可以不阻塞,而牺牲的是写操作性能的一部分。rcu_bh 表示的是运行在软件中断上下文中的RCU机制,主要是处理用户中断的一种机制。
在 Linux 内核中,RCU既表示一种机制,也表示一个钩子函数,在实现中,RCU机制添加了以下几个机制:
rcu_bh 机制主要解决了如何在用户中断上下文中调用RCU读取者作为回调函数的问题。在用户中断上下文中,禁止调用 rcu_read_lock/rcu_read_unlock 这种读取者机制,因为可能阻塞内核、用户进程或者等待时间过长。
rcu_bh 采用将回调函数挂在 bh 队列中的方法,这样,当内核进入软中断时,会首先处理 bh 队列,在 bh 的处理过程中顺带地调用 rcu_bh 回调函数。这样实现了在用户中断上下文中调用 rcu read 的操作。
rcu_bh 机制主要应用在需要保证实时性的内核子系统中。例如,在网络数据包传输过程中,需要保证内核响应和处理时间尽可能短。在这种情况下,采用 rcu_bh 机制可以高效地进行RCU读操作,从而提高数据包处理的实时性。
此外,很多内核网络驱动程序也使用了 rcu_bh 机制来更新共享数据结构,以避免阻塞内核的写操作。
在 Linux 内核中,还有其他一些读写锁机制,例如spinlock,rw_semaphore等,这些锁机制的原理和作用与RCU机制有所不同。相对于这些读写锁机制而言,RCU机制适用于大多数读操作,而在写操作上,RCU机制的性能相对较差。因此,在具体实现时,需要根据实际情况选择采用何种机制。