linux内核同步方式--信号量


Linux的信号量是一种睡眠锁,这个不同于自旋锁.如果有一个任务试图获得一个已经被占用的信号量时,信号量会将其推进一个等待队列(具体可以参考进程的活动状态),然后让其睡眠,此时处理器能重获自由,而去执行其他代码.当持有信号量的进程将信号量释放后,处于等待队列中的那个进程会被唤醒,并获得该信号量.
所以和自旋锁的区别是:
1)信号量适用于锁会被长时间持有的情况
2)持有信号量锁的线程可以睡眠,而持有自旋锁的线程是不允许睡眠的
3)信号锁不会禁止内核抢占
4)最重要的信号锁同时允许任意数量的锁持有者,而自旋锁在同一时刻最多只允许一个任务持有他
因为不受睡眠的限制,所以信号量锁用起来要方便一些.

信号量锁的持有者数目可以在声明信号量时指定.当信号量的持有者被声明为只允许一个持有者时,此时的信号量又被称为互斥信号量.
在适用信号量的时候基本上用到的都是互斥信号量.

信号量的接口:
信号量的实现是与体系结构相关,具体实现定义在<asm/semaphore.h>文件中.
struct semaphore类型用来表示信号量:
static DECLARE_SEMAPHORE_GENERIC(name,count);//name为信号量的名字,count为持有者数目.
创建更为普通的互斥信号量:
static DECLARE_MUTEX(name);

当动态创建信号量时,可是使用:
sema_init(sem,count);//初始化,sem是指针变量,count是持有者数目
初始化一个动态创建的互斥信号量时使用以下函数:
init_MUTEX(sem);//同样sem是指针

使用down_interruptible()试图获得指定的信号量,如果失败,进程会以TASK_INTERRUPTIBLE状态进入睡眠.
使用down_trylock(),可以尝试以非堵塞的方式来获得指定的信号量,在信号量已被占用时,立刻返回非0值;否则返回0,并立刻让你成功持有信号量锁.
使用up(),则是可以释放指定的信号量.

与自旋锁一样,信号量也有读写信号量,读写信号在内核中是由rw_semaphore结构表示,定义在<linux/rwsem.h>文件中.具体接口就不细说了.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值