锁 1>互斥锁

2210阅读 0评论2015-06-14 lsxuan驱动
分类:嵌入式

0>   概述:

2种实现: 1》semaphore

                   2》mutex

都属于睡眠锁。

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

1>互斥锁:用值为1的信号量实现

 

/linux-3.5/include/linux/semaphore.h

1>定义信号量:struct semaphore sema;

2>初始化:

void sema_init(struct semaphore *sem,

                                                         int val    //信号量赋值

)

 

/linux-3.5/kernel/semaphore.c

临界区保护

3> p操作:- 1  

    void down(struct semaphore *sem);

    int down_interruptible(struct semaphore *sem);//可中断

4> v操作:+ 1

    void up(struct semaphore *sem);

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

实现思路:

互斥锁相等于定义了一个全局的标记flag = 1,假设有A和B,2个进程,

A访问临界资源 时flag -1 = 0, B访问临界资源flag -1 = -1,失败,又把flag+1 = 0,睡眠等待。

A访问临界资源完成,flag+1 = 1; B接着访问。

 

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

实现本质:

利用自旋锁的机制保护down()和up(),这???????

/*保存当前状态,禁止本地所有中断,因为进程也是通过定时中断完成进程调度,所以进程与进程,进程与中断都实现了互斥*/

raw_spin_lock_irqsave() ;

raw_spin_unlock_irqrestore();//打开中断

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

2>互斥锁:互斥体

    1>>定义:struct mutex mx;

    2>>初始化:mutex_init(&mx);
    /*定义并初始化*/
        #define DEFINE_MUTEX(mutexname) \
                struct mutex mutexname = __MUTEX_INITIALIZER(mutexname)

    3>>//类似于down()但不等于。它的实现机制是利用原子操作。

                void mutex_lock(struct mutex *lock)

    4>>/*This function is similar to (but not equivalent to) up().*/

                void mutex_lock(stuct mutex *loc);

Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

 

 

 

上一篇:中断 2》上下半部
下一篇:锁 2> 自旋锁