打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
深入浅出Linux设备驱动之并发控制
相关专题:Linux设备驱动程序开发入门
在驱动程序中,当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源),可能会引发"竞态",因此我们必须对共享资源进行并发控制。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。
(作者:宋宝华责任编辑:方舟)
欢迎在新浪微博上关注我们
邬梁迅雷逢兵等154.9万人已关注
相关文章
宁愿编写代码?还是把事情都写下来吧!
技术项目走向失败的五条“捷径”
三星为何要在安卓之外开发Tizen系统?
大数据时代:编程语言真的重要吗?
2014年最热门的IT职位及年薪预测
使用IBM DB2 Recovery Expert工具
评论
社交账号登录:
微博
QQ
人人
豆瓣
更多?
最新最早最热
评论
还没有评论,沙发等你来抢
天极网正在使用多说
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
信号量、互斥体和自旋锁
Linux 设备驱动 ====> 并发控制
信号量与自旋锁
Linux学习第29节,从C语言源码分析,信号量和自旋锁有何区别
linux驱动程序学习4
(LDD) 第五章、并发和竞态
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服