关于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函数里对锁释放为止呢? 展开
引用
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函数里对锁释放为止呢? 展开
1个回答
展开全部
既然是对一个变量进行保护,当然是一个自旋锁了,还没见过一个变量能当两个用的。
我觉得你对这段代码的理解有问题,用 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 ,运行结果都是一样的。
这个逻辑关系比较难解释,不知道你看懂我的意思没。
我觉得你对这段代码的理解有问题,用 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 ,运行结果都是一样的。
这个逻辑关系比较难解释,不知道你看懂我的意思没。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询