share your ideas
分类: LINUX
2013-08-27 16:23:23
(1) 并发(concurrrncy):多个执行单元同时,并行被执行,并发的执行单元对共享资源(硬件资源和软件的全局变量,静态变量),的访问容易造成竞态。
(2) 对称多处理器(smp的多个cpu):cmp是紧耦合的共享存储介质的系统模型,多个cpu 使用共同的系统总线,因此,可以访问共同的外设和存储器。
(3) 单 cpu 内进程与抢占他的进程:linux 2.6 内核支持抢占调度,一个进程在内核中执行时可能被另外的一个高优先级的进程打断,抢占他的进程访问的共享资源,类似于smp的多个cpu。
(4) 中断(硬中断,软中断,tasklet,低半部)与进程之间:中断可以打断正在执行的进程,中断进程又访问前一个中断的资源,竞态也会发生,中断也有可能被高优先级的中断打断,多个中断可能产生竞态。
总结:Smp 是真正意义上的并行,其他都是宏观并行,微观的串行。解决途径是保证对共享资源的互斥访问。互斥是指一个执行单元在访问时,其他的单元禁止访问。访问共享资源的代码区成为临界区,临界区需要被一某种互斥机制加以保护,(中断屏蔽,原子操作,自旋锁,信号量)
中断屏蔽
1. 单cpu 范围内避免竞态简单方法是:进入临界区之前,屏蔽系统中断。Cpu 一般都具备屏蔽中断和打开中断的功能。这项功能保障内核执行路径不被打断,防止竞态,缺点: 数据丢失,系统崩溃。不能解决smp 的问题,适宜的和自旋锁来配合使用。
自旋锁:
1. 典型的对临界资源进行互斥的访问的手段,不断测试一块内存区域,是否可以访问,若空闲则表明可以继续执行,若被占用,则重复测试和设置,原地打转。变量看待,主要应用在smp 和 单cpu 中内核可以抢占。单cpu和抢占进程中,自旋锁持有期间,内核的抢占被禁止。自旋锁是忙等待,不可用时,一直循环等待。可能导致死锁。(递归使用枷锁,),获得锁期间不能调用可能引起进程调度的函数(copy_form_user。。。),可能内核崩溃。
读写自旋锁:
1. 允许读的并发。可以有多个读执行单元。
信号量 :
1. 保护临界区的一种方法,只有得到信号量的进程才能执行临界代码。当获取不到信号量时,进程不会原地打转,而是进入休眠状态。
自旋锁 vs 互斥量
1. 信号量和互斥锁都是解决互斥问题的手段。只是层次不同,前者的实现依赖后者。多cpu 中需要自旋锁来互斥。
2. 信号量是进程级别的,多个进程之间的资源互斥,内核执行路径是代表进程来争夺资源的,竞争失败,会发生进程切换,当前的进程睡眠。Cpu 将运行其他的进程。鉴于进程上下文切换开销很大,只有当占用资源时间较长时才用信号量。
3. 保护临界资源的访问时间较短时,用自旋锁较方便。节省切换时间。
4. 信号量所保护的临界区可能包含引起阻塞的代码,自旋锁内绝对要避免阻塞的代码,阻塞将导致进程的切换,进程切换出去后另一个进程企图获取本自旋锁。死锁将会发生。
5. 信号量存在于进程上下文中,如果被保护的共享资源需要在中断或软中断的情况下使用,只能选择自旋锁。如果要使用信号量,这能通过down_trylock 的方式进行,不能获取就立即返回。