关于Linux自旋锁

一段驱动程序的代码,主要是借助自旋锁来实现对一个全局变量的保护,进而实现使用自旋锁使设备只能被一个进程打开:引用intxxx_count=0;/*定义文件打开次数*/st... 一段驱动程序的代码,主要是借助自旋锁来实现对一个全局变量的保护,进而实现使用自旋锁使设备只能被一个进程打开:

引用
int xxx_count = 0; /*定义文件打开次数*/

static int xxx_open (struct inode *inode, struct file *filp)
{
...
spin_lock (&xxx_lock); /*获取自旋锁*/

if (xxx_count){ /*获得自旋锁,但已有别的进程打开设备*/
spin_unlock (&xxx_lock); /*设备忙,释放自旋锁返回*/
reurn (-EBUSY);
}

xxx_count++; /*没有别的进程使用设备,增加使用计数*/
spin_unlock (&xxx_lock); /*已经成功打开设备,释放自旋锁*/
...
return (0); /*打开成功*/
}

static int xxx_release (struct inode *inode, struct file *filp)
{
...
spin_lock (&xxx_lock); /*获得自旋锁*/
xxx_count--; /*减少使用计数*/
spin_unlock (&xxx_lock);

return (0);
}
上面,使用自旋锁修改了全局变量 xxx_count 。程序段保证了一个设备仅能被一个进程打开。
但是本人刚刚入门,存在诸多疑惑
1.这段代码中究竟有几个自旋锁是一个还是两个呢,诸位大虾不要笑我,我一开始倾向于两个因为在函数open和release中都有被 spin_lock (&xxx_lock); 和 spin_unlock (&xxx_lock); 包围的临界区,按照本人的最初理解自旋锁的任务就是保证cpu在执行这段临界区时禁止其它cpu访问这段临界区,可是我想如果这样的话open和release被同时访问的话,那个全局变量岂不是被。。。。所以这样一想两个自旋锁的说法好像不成立,可是如果一个自旋锁的话,又怎么或有 if (xxx_count){ /*获得自旋锁,但已有别的进程打开设备*/
spin_unlock (&xxx_lock); /*设备忙,释放自旋锁返回*/
reurn (-EBUSY);
}
这段代码呢?这段代码清晰的表明即使。。。。我有点乱
不好意思,就是想问一下这个代码中定义了几个自旋锁,还有open和release究竟是否可以被同时访问(起码在多cpu体系中是可能的)?谢谢!!!
最后问一下,您的意思是不是说在访问open的时候如果有进程在访问release,那么访问release的进程会一直处于忙等待即自旋的状态,知道open函数里对锁释放为止呢?
展开
 我来答
西安阿呆
2010-10-08 · TA获得超过147个赞
知道答主
回答量:209
采纳率:0%
帮助的人:186万
展开全部
既然是对一个变量进行保护,当然是一个自旋锁了,还没见过一个变量能当两个用的。
我觉得你对这段代码的理解有问题,用 spin_lock 和 spin_unlock 的目的是保证程序在对 xxx_lock 进行操作的时候,不会有其它进程改变这个值,是为了保证数据的准确性。
你可以设想一下,如果没有自旋锁,代码运行起来会有什么问题。假设 A,B两个进程同时访问 open , 没有使用自旋锁,此时 xxx_lock=0, A 进程在判断 if (xxx_count) 时,会认为设备没有被使用,那么它会继续后面的 xxx_count++ 操作,但假如这时 CPU 切换进程, A 进程还没有来得及把 xxx_count 变成 1 的时候, B 进程开始运行,那么 B 进程此时也会认为设备没有被使用,它也会进行后继操作,这样就会出现两个进程同时访问设备的错误。

open 和 release 当然可以同时访问,只不过在运行 spin_lock 的时候,后访问的进程会被阻塞而已。假设有 A 进程访问 open ,B 进程访问 release ,你可以把这种情况理解为 A , B 进程同时访问 open 函数,这样或许能更好的理解这段代码。因为 open 和 release 在使用自旋锁的时候,方法是一样的。

spin_lock 和 CPU 系统无关,不管是单 CPU 还是多 CPU ,运行结果都是一样的。

这个逻辑关系比较难解释,不知道你看懂我的意思没。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式