Linux内核同步方式总结

有关linux内核同步的参考:

memory barrier: http://www.wowotech.net/kernel_synchronization/memory-barrier.html


阅读《深入理解linux内核》笔记

内核抢占:如果进程正在执行内核函数时(即它在内核态运行时),允许发生内核切换(被替换的进程是正在执行内核函数的进程),这个内核就是抢占的。

运行在内核态的进程可以自动放弃cpu,称为计划性进程切换,抢占式内核中,进程被迫放弃CPU,称为强制性进程切换。抢占内核的主要特点是:一个内核态运行的进程,可能在执行内核函数期间被另一个进程取代。

内核抢占就会发生一种情况:两个或两个以上的交叉内核路径嵌套时,就可能出现竞争条件。还有一种情况,多核环境下,多个core上的进程同时进入内核,就会出现访问的竞争。因此内核需要同步。内核同步技术主要有以下方式:


1.per-cpu 变量:将内核变量声明为per-cpu变量,它的数据结构是数组,系统的每个CPU对应数组中的一个元素,一个CPU只能修改自己对应的元素,不用担心竞争条件。per-cpu只能对来自不同CPU的并发访问提供保护,但对自身的异步函数(中断处理函数和可延迟函数)的访问不提供保护,需要同步原语

2.原子操作(linux中有一个专门的atomic_t类型):操作在芯片级是原子的,原子操作必须以单个指令执行,中间不能中断,且避免其他的CPU访问同一存储器单元。

3.优化屏障(optimization barrier)和内存屏障(memory barrier):现代编译器可能重新安排汇编语言指令的吮吸,CPU通常并行的执行多条指令,且可能重新安排内存访问,但是,当处理同步时,必须避免指令重新排序,如果放在同步原语之后的一条指令在同步原语之前被执行,就很糟糕!内存屏障:确保在原语之后的操作开始执行之前,原语之前的操作已经完成。mb(), smp_mb();

简单的说,由于内存乱序以允许更好的性能,在某些情况下,需要内存屏障以强制保证内存顺序,否则将出现很糟糕的问题。

程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问。内存乱序访问行为出现的理由是为了提升程序运行时的性能。内存乱序访问主要发生在两个阶段:

  1. 编译时,编译器优化导致内存乱序访问(指令重排)
  2. 运行时,多 CPU 间交互引起内存乱序访问

Memory barrier 能够让 CPU 或编译器在内存访问上有序。一个 Memory barrier 之前的内存访问操作必定先于其之后的完成。Memory barrier 包括两类:

  1. 编译器 barrier
  2. CPU Memory barrier

4.spin lock:当内核控制路径必须访问共享数据结构或进入临界区时,需要锁,spin lock的循环指令表示“忙等”,即使等待的内核控制路径无事可做,它也在CPU上保持运行

5.读写spin lock:它的引入主要是为了增加内核的并发能力,只要没有内核路径对数据结构进行修改,读写spin lock允许多个内核控制路径同时读同一个数据结构。但是写者需要独占。

6.顺序锁:读写spin lock中读者和写着有相同的优先级,当读者多的时候,可能出现一种情况,写着一直得不到服务,可能饥饿。引入顺序锁(seqlock),它与读写spin lock非常相似,但是它赋予写着较高的优先级。

7.RCU(read-copy update):是为了保护在多数情况下被多个CPU读的数据结构而设计的另一种同步方式。RCU允许多个读者和写者并发执行,而且RCU不使用锁。但RCU的使用有限制:

  • RCU只能保护动态分配并通过指针引用的数据结构
  • 在被RCU保护的临界区中,任何内核控制路径都不能睡眠
内核控制路径要读取被RCU保护的数据结构时,执行宏rcu_read_lock(),但是读者在完成对数据结构的读操作之前,是不能睡眠的,rcu读结束之后,调用宏rcu_read_unlock()标记临界区的结束。
由于读者几乎不做任何事情来防止竞争条件的出现,所以写着必须多做一些。

8.信号量

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值