Linux 内核同步机制
本文将就自己对内核同步机制的一些简要理解,做出一份自己的总结文档。
Linux内部,为了提供对共享资源的互斥访问,提供了一系列的方法,下面简要的一一介绍。
中断屏蔽
使用方法:
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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。