快速业务通道

深入浅出Linux设备驱动编程--设备驱动中的并发控制

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-16
宋宝华 [email]21cnbao@21cn.com[/email] yesky 4.设备驱动中的并发控制 在驱动程序中,当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源),可能会引发“竞态”,因此我们对共享资源进行并发控制.Linux内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用). 自旋锁与信号量“类似而不类”,类似说的是它们功能上的相似性,“不类”指代它们在本质和实现机理上完全不一样,不属于一类. 自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环查看是否该自旋锁的保持者已经释放了锁,“自旋”就是“在原地打转”.而信号量则引起调用者睡眠,它把进程从运行队列上拖出去,除非获得锁.这就是它们的“不类”. 但是,无论是信号量,还是自旋锁,在任何时刻,最多只能有一个保持者,即在任何时刻最多只能有一个执行单元获得锁.这就是它们的“类似”. 鉴于自旋锁与信号量的上述特点,一般而言,自旋锁适合于保持时间非常短的情况,它可以在任何上下文使用;信号量适合于保持时间较长的情况,会只能在进程上下文使用.如果被保护的共享资源只在进程上下文访问,则可以以信号量来保护该共享资源,如果对共享资源的访问时间非常短,自旋锁也是好的选择.但是,如果被保护的共享资源需要在中断上下文访问(包括底半部即中断处理句柄和顶半部即软中断),就使用自旋锁.与信号量相关的API主要有: 定义信号量 struct semaphore sem; 初始化信号量 void sema_init (struct semaphore *sem, int val); 该函数初始化信号量,并设置信号量sem的值为val void init_MUTEX (struct semaphore *sem); 该函数用于初始化一个互斥锁,即它把信号量sem的值设置为1,等同于sema_init (struct semaphore *sem, 1); void init_MUTEX_LOCKED (struct semaphore *sem); 该函数也用于初始化一个互斥锁,但它把信号量sem的值设置为0,等同于sema_init (struct semaphore *sem, 0); 获得信号量 void down(struct semaphore * sem); 该函数用于获得信号量sem,它会导致睡眠,因此不能在中断上下文使用; int down_interruptible(struct semaphore * sem); 该函数功能与down类似,不同之处为,down不能被信号打断,但down_interruptible能被信号打断; int down_trylock(struct semaphore * sem); 该函数尝试获得信号量sem,如果能够立刻获得,它就获得该信号量并返回0,否则,返回非0值.它不会导致调用者睡眠,可以在中断上下文使用.释放信号量 void up(struct semaphore * sem); 该函数释放信号量sem,唤醒等待者. 与自旋锁相关的API主要有: 定义自旋锁 spinlock_t spin; 初始化自旋锁 spin_lock_init(lock) 该宏用于动态初始化自旋锁lock 获得自旋锁 spin_lock(lock) 该宏用于获得自旋锁lock,如果能够立即获得锁,它就马上返回,否则,它将自旋在那里,直到该自旋锁的保持者释放; spin_trylock(lock) 该宏尝试获得自旋锁lock,如果能立即获得锁,它获得锁并返回真,否则立即返回假,实际上不再“在原地打转”; 释放自旋锁 spin_unlock(lock) 该宏释放自旋锁lock,它与spin_trylock或spin_lock配对使用; 除此之外,还有一组自旋锁使用于中断情况下的API. 下面进入对并发控制的实战.,在globalvar的驱动程序中,我们可以通过信号量来控制对int global_var的并发访问,下面给出源代码:#include <linux/module.h> #include <linux/init.h> #include <linux/fs.h> #include <asm/uaccess.h> #include <asm/semaphore.h> MODULE_LICENSE("GPL"); #define MAJOR_NUM 254 static ssize_t globalvar_read(struct file *, char *, size_t, loff_t*);

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号