Linux 内核同步机制

    本文将就自己对内核同步机制的一些简要理解,做出一份自己的总结文档。

    Linux内部,为了提供对共享资源的互斥访问,提供了一系列的方法,下面简要的一一介绍。

Technorati 标签:

中断屏蔽

使用方法:

local_irq_disable()  //屏蔽中断                           

critical section  //临界区

local_irq_enable()  //开中断  

原因:Linux内核的进程调度依赖时钟中断实现,如果禁止中断,内核就不会调度其他程序,因此,可以保证正在执行的内核路径不会被中断服务程序打断。

缺点:

1. local_irq_disable 和 local_irq_enable 只能禁止和使能本地CPU内中断,对于多CPU的SMP情况,无法解决此类竞争。

2. 屏蔽中断期间,内部一些异步I/O、进程调度无法进行,有可能造成数据丢失等问题。   

变体:local_irq_save(flags),在屏蔽本地CPU中断的基础上,备份禁止中断之前的CPU标志位,可通过local_irq_restore来恢复。

原子操作

     原子操作是内核实现并且保证的最小执行单元,如果需要保护的临界资源为单一变量,可以考虑这种轻量级的保护方式。

     内核提供 对于整形数的原子操作和 对于某一位的原子操作。

   

自旋锁

     自旋锁,从名字上可以知道,这个函数将会自我原地旋转,直到某一条件符合要求,如符合要求,则说明锁已经打开,可以进入,若不符合要求,则自己原地转个圈,转完后继续判断条件是否符合要求。

最简单的使用方法如下:

    spinlock_t lock; 

    spin_lock_init(&lock); 

    spin_lock (&lock);
    ...   //临界区
     spin_unlock(&lock);

自旋锁,对不可抢占内核,

 

 

 

RCU------读-----------写

        无锁访问           写(向拷贝副本中写)

                             更新(延迟到对该数据的所有读操作完成为止)

 

 

 

wait_event <-----> wake_up

相关变体:

wait_event_interrupitble <----> wake_up_interruptible

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。