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