Chinaunix首页 | 论坛 | 博客
  • 博客访问: 224774
  • 博文数量: 39
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 584
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-18 20:24
个人简介

学习总结,分享快乐。 望指正错误, 共同提高!!!

文章分类

全部博文(39)

分类: 嵌入式

2015-06-14 16:50:30

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

 

 

 

阅读(2221) | 评论(0) | 转发(0) |
0

上一篇:中断 2》上下半部

下一篇:锁 2> 自旋锁

给主人留下些什么吧!~~