内核竞争与互斥的实现(信号量&锁)

1.内核中信号量的使用

    a.信号量对应的头文件:

        <asm/semaphore.h>

    b.定义信号量:                 

        struct semaphore sem;

    c.初始化信号量:

        void sema_init(struct semaphore *sem, int val)  // 将信号量sem值设置为val

        void init_MUTEX(struct semaphore *sem)  // 初始化一下互斥锁,并把sem设置为1

        void init_MUTEX_LOCKED(struct semaphore *sem)  // 初始化一下互斥锁,并把sem设置为0

        DECLARE_MUTEX(name) // 定义一个名字为name的信号量,并初始化为1

        DECLARE_MUTEX_LOCKED(name) // 定义一个名字为name的信号量,并初始化为0

    d.获取信号量:

       void down(struct semaphore *sem)  // 该函数将sem减1.如果减1后为非负数时

                                                                     // 会直接返回;如果为负否则调用者被挂起

       void down_interruptible(struct semaphore *sem)  // 获取信号量失败时,TASK_INTERRUPTIBLE睡眠

                                                                      // 返回值:0 -> 实信号唤醒; -EINTR -> 被中断唤醒

       void down_killable(struct semaphore *sem)  // 获取信号量失败时,TASK_KILLABLE睡眠

    e.释放信号量:

       void up(struct semaphore *sem) // 把sem的值加1.可唤醒等待该信号的任务

        

2.内核中自旋锁的使用

    a.定义自旋锁: 

       void spin_lock_init(x)      // 该宏用于初始化自旋锁x

    b.获取自旋锁: 

       int spin_lock(x)                // 获取锁x.成功则立即返回,否则一直等待

       int spin_trylock(x)            // 获取锁x.立即返回.返回真-获取成功;返回假-失败

    c.释放自旋锁: 

       void spin_unlock(x)        // 与spin_lock()或者spin_trylock成对使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章