Chinaunix首页 | 论坛 | 博客
  • 博客访问: 162306
  • 博文数量: 29
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 806
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-05 10:31
个人简介

share your ideas

文章分类

全部博文(29)

文章存档

2015年(1)

2013年(28)

分类: 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 的方式进行,不能获取就立即返回。

 

阅读(3476) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~