linux信号量简介(内核态)

一、什么是信号量
    1、概念
        内核的信号量在概念和原理上与用户态的信号量是一样的,但是它不能在内核之外使用。
        信号量又称为信号灯(semaphore),本质上是一种睡眠锁。如果有一个任务试图获得一个不可用(已经被占用)的信号量时,信号量会将其推进一个等待队列,然后让其睡眠。这时处理器能重获自由,从而去执行其他代码。当持有的信号量可用(被释放后),处于等待队列中的那个任务将被唤醒,并将获得该信号量。
        信号量一个有用的特性是它可以同时允许任意数量的锁持有者,而自旋锁和互斥锁在一个时刻最多允许一个任务持有它。信号量同时允许的持有者数量可以在声明信号量时指定。这个值称为使用者数量(usage count)或简单的叫做数量(count)。通常情况下,信号量和自旋锁一样,在一个时刻仅允许有一个锁持有者。这时计数等于1,这样的信号量被称为二值信号量或者称为互斥信号量。另一方面,初始化时也可以把数量设置为大于1的非0值。这种情况,信号量被称为计数信号量(counting semaphore),它允许在同一时刻至多有count个锁持有者。

    2、数据结构
struct semaphore {
	raw_spinlock_t		lock;
	unsigned int		count;
	struct list_head	wait_list;
};
        结构体成员说明:
        count:相当于信号量的值,大于0,资源空闲;等于0,资源忙,但没有进程等待这个保护的资源;小于0,资源不可用,并至少有一个进程等待资源。
        wait:存放等待队列链表的地址,当前等待资源的所有睡眠进程都会放在这个链表中。
        sleepers:存放一个标志,表示是否有一些进程在信号量上睡眠
        
二、信号量的使用
    1、初始化
        void sema_init (struct semaphore *sem, int val);
        void init_MUTEX (struct semaphore *sem); //将sem的值置为1,表示资源空闲
        void init_MUTEX_LOCKED (struct semaphore *sem); //将sem的值置为0,表示资源忙
    2、加锁
        void down(struct semaphore * sem); // 可引起睡眠
        int down_interruptible(struct semaphore * sem); // down_interruptible能被信号打断
        int down_trylock(struct semaphore * sem); // 非阻塞函数,不会睡眠。无法锁定资源则马上返回
    3、解锁
        void up(struct semaphore * sem);
        
三、为什么使用信号量
    1、用于线程间的同步。
    2、当同一时刻,有多个对象需要同时持有锁的情况下,可以使用信号量。
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值