spin-lock技术与应用

spin-lock技术与应用

ID:33977524

大小:108.30 KB

页数:9页

时间:2019-03-02

spin-lock技术与应用_第1页
spin-lock技术与应用_第2页
spin-lock技术与应用_第3页
spin-lock技术与应用_第4页
spin-lock技术与应用_第5页
资源描述:

《spin-lock技术与应用》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、Spin-lock技术及应用在LinuxKernel里有着许多重要的资料结构,这些资料在作业系统的运作中扮演着举足轻重的角色。然而,Linux是个多任务的作业系统,也就是在同一时间里可以同时有许多的行程在执行,所以,很有可能某个行程在依序读取inodelist,同时却又有另一个在inodelist里加入新的inode,这会造成什幺情形呢?这会造成inodelist的不稳定。所以,在Kernel里,我们需要一个机制,可以使得当我们在修改某个重要的资料结构时,不能被中断,即使被中断了,这个资料结构由于还没修改完,别的行程也都不能去读取和修改它。

2、LinuxKernel提供了spinlock这个机制可以使我们做到这样的功能。有的人会想到当我们在修改某个重要的资料结构时,将中断都disable掉就好了,等修改完了再将中断enable不就得了,何必还要再提供一个spinlock来做同样的事。在uni-processor的环境底下,的确是如此。所谓uni-processor就是指只有一个CPU的电脑,但是在SMP的环境下就不是这幺一回事了。我们知道现在Linux已经有支持SMP,也就是可以使用多颗CPU来加快系统的速度,如果当我们在修改重要的资料结构时,将执行修改工作的CPU中断disab

3、le掉的话,只有目前的这个CPU的执行不会被中断,在SMP环境下,还有别的CPU正同时运作,如果别的CPU也去修改这个资料结构的话,就会造成同时有两个CPU在修改它,不稳定性就会产生。解决方法是将全部的CPU中断都disable掉,等修改完之后,再全部都enable起来。但是这样的做法其cost会很大,整个系统的效能会down下来。因此,LinuxKernel才会提供spinlock这样的机制,它不会将全部CPU的中断disable掉,所以效率比上述的方法好,但同时却又能确保资料的稳定性,不会有某个行程在修改它,另外又有一个行程在读取或修改

4、它的情形发生。在这篇文章中,我将会介绍Kernel提供用来使用spinlock的function。除此之外,我还会告诉各位,为何在SMP的环境里,使用spinlock会比将所有CPU的中断disable这个方法来的有效率,我也会告诉各位如何针对不同的使用需求,使spinlock的cost再降低,进而使系统的效能更好。spinlock的资料结构spinlock的资料结构在Linux底下是以spinlock_t来表示的,在SMP和UP环境底下两者的栏位有一些差异,其实在UP底下spinlock_t可以说是一个空的结构,空就是空的,为何要说"可以

5、说是空的"呢?这是因为gcc版本的问题,gcc在2.8版以前结构的内容必须不能是空的,而在2.8版之后就可以,所以在UP环境底下,会根据gcc的版本而设定不同的spinlock_t结构栏位,但基本上,在UP环境底下,是根本不会用到spinlock_t结构里的栏位的,详情请见以下诸节即可了解。由于spinlock主要是用在SMP的环境底下,所以,以下我们就只针对在SMP环境底下的spinlock_t结构来讨论,它的结构内容是这样子的:      typedef struct {          volatile unsigned int l

6、ock;      } spinlock t;说穿了,不过就是一个unsignedint型别的变数而已,但可不要小看这小小的变数,螺丝钉虽小,功能却是不可忽视的。使用spinlock      spinlock t xxx lock = SPIN_LOCK_UNLOCKED;      unsigned long flags;      spin lock irqsave (&xxx lock, flags)          ...critical section...      spin unlock irqrestore (&xxx 

7、lock, flags)这一组的函式在使用上是最保险的,用的频率也算是最多的。首先在使用前,必须先宣告一个spinlock_t型别的变数,并把初始值设为SPIN_LOCK_UNLOCKED。除此之外,还必须有一个unsignedlong型别的变数,这个变数是用来将CPU的flag(旗标)储存起来的,等criticalsection执行完了,再把flag的值设回到系统里。使用上是很简单明白的。这两个function除了可以在SMP的环境下使用外,在UP的环境里也是同样可行的,接下来,我们来看看它们程序码是怎幺写的。在这个档案里定义了spin_

8、lock_irqsave()及spin_lock_irqrestore()这两个function。      #define spin_lock_irqsave(lock,fla

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。