Linux RCU队列(1)经典RCU队列实现

RCU是Linux中的一种读写优化机制,避免了读写锁带来的性能开销。在RCU队列中,读操作无需锁定,而写操作会复制数据并在所有处理器完成一次线程切换后更新。synchronize_rcu函数确保所有读者退出后再执行内存释放,call_rcu则用于异步更新。虽然经典RCU不适用于多核和可抢占内核,但其读写分离的核心思想在实际实现中得到了优化。
摘要由CSDN通过智能技术生成

RCU全称Read Copy Update,这是一种对读写锁的优化。当所有对相关数据结构的操作时读者行为时,则通过最高层次的禁止线程调度就可以了,如果需要对这个队列进行写操作,那么可以先将原来的数值复制一份出来,然后对复制出来的数据进行处理,最后在适当的时机进行更新。而更新的适当时机则是所有的处理器上都进行了一次线程切换之后,因为只有这样才能保证整个所有的处理器上的读者都释放了相应的资源。

	struct foo {
		int a;
		char b;
		long c;
	};
	DEFINE_SPINLOCK(foo_mutex);
	struct foo *gbl_foo;
	void foo_update_a(int new_a)
	{
		struct foo *new_fp;
		struct foo *old_fp;
		new_fp = kmalloc(sizeof(*new_fp), GFP_KERNEL);
		spin_lock(&foo_mutex);
		old_fp = gbl_foo;
		*new_fp = *old_fp;
		new_fp->a = new_a;
		rcu_assign_pointer(gbl_foo, new_fp);
		spin_unlock(&foo_mutex);
		synchronize_rcu();
		kfree(old_fp);
	}
	int foo_get_a(void)
	{
		int retval;
		rcu_read_lock();
		retval = rcu_dereference(gbl_foo)->a;
		rcu_read_unlock();
		return retval;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值