Linux 锁机制

Linux 锁机制

自旋锁

自旋锁(spin lock)是在多处理器环境中的锁(单处理机系统上,这种锁不起作用),如果内核控制路径发现自旋锁未上锁,就获取锁并执行;如果内核控制路径发现已经上锁,就在周围“旋转”,反复执行循环指令,等待锁被释放。
自旋锁是一种非阻塞锁,在上锁时间较短时,效率远高于互斥锁,如果上锁时间较长,会占用CPU资源。

互斥锁

读写锁是一种特殊的自旋锁,读写锁的引入为了增加内核的并发能力,只要没有内核控制路径对数据结构进行修改,读写锁允许多个内核控制路径同时读同一数据结构,如果有内核控制路径想对数据结构进行写操作时,会获取写锁,写锁会独占资源。允许数据并发读提高了系统的性能。

顺序锁

在读写锁中,内核控制路径发出的读锁和写锁具有相同的优先级,读者必须等待写操作完成,同样,写者也必须等待读操作的完成,Linux 2.6中引入顺序锁(seqlock),为写操作赋予更高的优先级,在读操作正在进行时,也允许写操作运行。这样的好处是使写操作不再等待,缺点是读操作不得不反复读相同的数据直到获取有效的副本。

互斥锁

互斥锁(metux)用来实现内核的互斥访问功能,是一种阻塞锁,内核控制路径获取锁失败时,会被挂起,直到锁被释放时才被唤醒。

读—拷贝—更新(RCU)

读—拷贝—更新是为了保护在多数情况下被多个CPU读的数据而设计的同步技术。RCU允许多个读者和写着并发执行。同时RCU不使用CPU共享的锁和计数器,具体实现如下
1.RCU只保护被动态分配并通过指针引用的数据结构
2.在被RCU保护的临界区中,任何内核控制路径不能睡眠。

当内核控制路径读取被RCU保护的数据结构时,执行宏rcu_read_lock( ),读者间接引用该数据结构指针所指的内存单元,开始读取这个数据结构,用宏rcu_read_unlock( )标记临界区的结束。
写者在写操作时间接引用指针并生成数据结构的副本,写者修改副本,一旦修改完毕,写者改变指向数据结构的指针,使它指向被修改的副本,由于修改指针值的操作时原子操作,所以旧副本和新副本对每个读者或写者都可见。

RCU技术的困难在于:写者修改指针时不能立即释放数据结构的旧副本。只有在CPU上所有潜在读者都执行完宏rcu_read_unlock( )之后才能释放旧副本。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值