手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

Spinlock 简介

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
spinlock t xxx lock = SPIN_LOCK_UNLOCKED;
unsigned long flags;

spin lock irqsave (&xxx lock, flags)
...critical section...
spin unlock irqrestore (&xxx lock, flags)

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

这个档案里定义了 spin_lock_irqsave() 及 spin_lock_irqrestore() 这两个 function。


#define spin_lock_irqsave(lock,flags)
do while (0)

#define spin_unlock_irqrestore(lock,flags)
do while (0)

local_irq_save(flags) 做的事就是将 CPU 的 flag 值先储存到 flags 变数里,然后将 CPU 的中断 diable 掉。这里将 CPU 的中断 disable 是指将执行这段 code 的 CPU,并不是指全部的 CPU。 也就是说他只会 disable local CPU 的中断。我们能够在里看到这样的程式码:

#define local_irq_save(x) __asm__ __volatile__("pushfl ; popl %0 ;
cli":"=g" (x): /* no input */ :"memory")
#define local_irq_restore(x) __asm__ __volatile__("pushl %0 ; popfl"
/* no output */ :"g" (x):"memory")

至于 local_irq_restore(flags) 从字面上能够很清楚的看出来,只是将 flags 里的值再设回 CPU 的 flag 里而已。至于 spin_lock(lock) 和 spin_unlock(lock) 这两个函式,在 SMP 和在 UP 的环境底下则会扩展成不同的样子。首先先看到这个档案的下半部。

#ifdef __SMP__
#include <asm/spinlock.h>

#else /* !SMP */
.......
#endif

在 SMP 的环境底下,SMP 这个constant被会 set。而在 UP 底下则不会,所以,假如要看 UP 底下 spin_lock(lock) 会变成怎幺样子,就必须来看看 #else /* !SMP */#endif 之间的程式码。

UP 环境下的 Implementation

我们先来看看在 UP 的环境下, spin_lock(lock) 会变成什幺样子。


#define spin_lock(x) (void)lock
#define spin_unlock(x) do {} while(0)

简单吧,根本什幺事都没有做,所以,在 UP 的环境底下,我们假如将上面那段 spinlock 的使用扩展开来的话,会变成下面这个样子。

spinlock_t xxx_lock = SPIN_LOCK_UNLOCKED;
unsigned long flags;

local_save_flags(flags); cli();
... critical section ...
local_restore_flags(flags);

而这也正是在 UP 环境下,用来保护重要资料结构的写法。这也就是为什幺在介绍spinlock_t 的结构内容时,我们说在UP环境底下这个结构就算是空的也不会影响到 spinlock 的功效,因为根本没用到里面的栏位,但是在 SMP 底下,这就很重要了。

SMP 环境下的 Implementation

在 SMP 的环境底下, spin_lock() 和 spin_unlock() 这两个函式的源代码是放在 中。

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