码迷,mamicode.com
首页 > 系统相关 > 详细

Linux 内核同步机制

时间:2015-01-27 08:08:45      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

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

    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

Linux 内核同步机制

标签:

原文地址:http://www.cnblogs.com/cherishui/p/4251832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!