Linux内核同步

如果多个执行线程同时访问和操作数据,就有可能发生各线程之间互相覆盖共享数据的情况,造成被访问数据处于不一致状态,因此共享资源需要防止并发访问。

临界区与竞争条件

临界区就是访问和操作共享数据的代码段,如果两个执行线程有可能处于同一个临界区中同时执行,那么这种情况就称为竞争条件。

简单来讲,当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序时,这种情况就是竞争条件。

例如下面的例子就出现了竞争条件:

假设两个进程P1和P2共享了变量a。在某一执行时刻,P1更新a为1,在几乎同一时刻,P2更新a为2。因此两个任务竞争地写变量a。在这个例子中,竞争的“ 失败者”(最后更新的进程)决定了变量a的最终值。

同步即避免并发和防止竞争条件。

内核使用的各种同步技术

有以下技术:
在这里插入图片描述

每CPU变量

最简单也是最重要的同步技术包括把内核变量声明为每CPU变量。

每CPU变量主要是数据结构的数组,系统的每个CPU对应数组的一个元素。

一个CPU不应该访问其它CPU对应的数组元素,但可以随意读写自己的元素而不用担心出现竞争条件,因为它是唯一有资格这么做的CPU。

按我的理解,这项同步技术就是将可能被竞争访问的内核变量声明为每CPU变量,然后每CPU变量只能被一个CPU访问,从而避免出现竞争情况。

但是要注意:在单处理器和多处理器系统中,内核抢占都可能使每CPU变量产生竞争条件,因此总的原则是内核控制路径应该在禁用抢占的情况下访问每CPU变量


原子操作

有不少汇编指令是"读-修改-写"的类型的,也就是说这种指令要访问内存两次,一次读来获取旧的值,一次写来写入新的值。如果有两个或两个以上CPU同时发起了这种类型的操作,最终的结构就可能是错误的(每个CPU都读到了旧的值,然后做修改再写,这样最后的写会取胜,如果是两次加1的话,这种情形下,最终只会加一次1)。

最简单的避免这种问题的方式是在芯片级保证这种操作是原子的。 任何一个这样的操作都必须以单个指令执行(即以单条指令完成对内存的修改),中间不能中断,且避免其它的CPU访问同一存储器单元。


优化屏障和内存屏障

编译器编译源代码时,会将源代码进行优化,将源代码的指令进行重排序,以适合于CPU的并行执行。

然而,内核同步必须避免指令重新排序,优化屏障(Optimization barrier)避免编译器的重排序优化操作,保证编译程序时在优化屏障之前的指令不会在优化屏障之后执行。

也可通过内存屏障强制内存访问次序。内存屏障像一堵墙,所有在设置内存屏障之前发起的内存访问,必须先于在设置屏障之后发起的内存访问之前完成,确保内存访问按程序的顺序完成。

自旋锁

加锁是广泛应用的同步技术。当内核控制路径必须访问共享数据结构或进入临界区时,就需要为自己获取一把“锁”。由锁机制保护的资源类似于闲置房间内的资源,当某人进入房间时,就把门锁上。当内核控制路径释放了锁之后,门就打开,另一个内核控制路径就可以进入房间。

在这里插入图片描述

自旋锁是在多处理器环境中工作的一种特殊锁。如果内核控制路径发现自旋锁开着,就获取锁并继续自己的执行。相反,如果发现锁被另一个CPU上的内核控制路径锁着,就在周围旋转,反复执行一条紧凑的循环指令,直到锁被释放

自旋锁的循环指令表示“忙等”,即无事可做,也在CPU上保持运行。

一般来说,自旋锁保护的每个临界区都是禁止内核抢占的。在单处理器系统上,这种锁本身起不到锁的作用,此时自旋锁原语仅仅是禁止或启用内核抢占。另外需要注意的是在自旋锁忙等期间,内核抢占还是有效的,因此等待自旋锁被释放的任务可能被更高优先级的任务所替代。

读写自旋锁

读写自旋锁的引入是为了增加内核的并发能力。只要没有内核控制路径对数据结构进行修改,读写自旋锁就允许多个内核控制路径同时读同一个数据结构。如果一个内核控制路径想要对这个结构进行写操作,那么它必须获取读写锁的写锁,写锁授权独占这个资源

读写自旋锁核心在于防写不防读,多个读操作可以同时进行,但写操作只能独占资源。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值