作者 : cjc86 在这篇文章中,我将会介绍 Kernel 提供用来使用 spinlock 的 function。除此之外,我还会告诉各位,为何在 SMP 的环境里,使用 spinlock 会比将任何 CPU 的中断 disable 这个方法来的有效率,我也会告诉各位如何针对不同的使用需求,使 spinlock 的 cost 再降低,进而使系统的效能更好...

Spinlock 简介



作者 : cjc86

在这篇文章中,我将会介绍 Kernel 提供用来使用 spinlock 的 function。除此之外,我还会告诉各位,为何在 SMP 的环境里,使用 spinlock 会比将任何 CPU 的中断 disable 这个方法来的有效率,我也会告诉各位如何针对不同的使用需求,使 spinlock 的 cost 再降低,进而使系统的效能更好...

前言

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

有的人会想到当我们在修改某个重要的资料结构时,将中断都 disable 掉就好了,等修改完了再将中断 enable 不就得了,何必还要再提供一个 spinlock 来做同样的事。在 uni-processor 的环境底下,的确是如此。所谓 uni-processor 就是指只有一个 CPU 的电脑,但是在SMP的环境下就不是这幺一回事了。

我们知道现在 Linux 已有支持 SMP,也就是能够使用多颗 CPU 来加快系统的速度,假如当我们在修改重要的资料结构时,将执行修改工作的 CPU 中断 disable 掉的话,只有现在的这个 CPU 的执行不会被中断,在 SMP 环境下,更有别的 CPU 正同时运作,假如别的 CPU 也去修改这个资料结构的话,就会造成同时有两个 CPU 在修改他,不稳定性就会产生。解决方法是将全部的 CPU 中断都 disable 掉,等修改完之后,再全部都 enable 起来。但是这样的做法其 cost 会很大,整个系统的效能会 down 下来。因此,Linux Kernel 才会提供 spinlock 这样的机制,他不会将全部 CPU 的中断 disable 掉,所以效率比上述的方法好,但同时却又能确保资料的稳定性,不会有某个行程在修改他,另外又有一个行程在读取或修改他的情形发生。

在这篇文章中,我将会介绍 Kernel 提供用来使用 spinlock 的 function。除此之外,我还会告诉各位,为何在 SMP 的环境里,使用 spinlock 会比将任何 CPU 的中断 disable 这个方法来的有效率,我也会告诉各位如何针对不同的使用需求,使 spinlock 的 cost 再降低,进而使系统的效能更好。

spinlock的资料结构

spinlock 的资料结构在 Linux底下是以 spinlock_t 来表示的,在 SMP 和 UP 环境底下两者的栏位有一些差异,其实在 UP 底下 spinlock_t 能够说是个空的结构,空就是空的,为何要说"能够说是空的"呢?这是因为 gcc 版本的问题,gcc 在 2.8 版以前结构的内容必须不能是空的,而在 2.8 版之后就能够,所以在 UP 环境底下,会根据 gcc 的版本而设定不同的 spinlock_t 结构栏位,但基本上,在 UP 环境底下,是根本不会用到 spinlock_t 结构里的栏位的,详情请见以下诸节即可了解。

由于 spinlock 主要是用在SMP的环境底下,所以,以下我们就只针对在SMP环境底下的 spinlock_t 结构来讨论,他的结构内容是这样子的:


typedef struct {
volatile unsigned int lock;
} spinlock t;

说穿了,但是就是个 unsigned int 型别的变数而已,但可不要小看这小小的变数,螺丝钉虽小,功能却是不可忽视的。

使用 spinlock


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!