linux驱动之 信号量 自旋锁 互斥体
2015-05-28 10:40
106 查看
0 原子操作
原子操作就是单位操作,也就是说操作过程不能被中断
下面代码中每条语句看起来是原子操作,其实不是原子操作;
int main(0
{
int i=2;//两天汇编语句组成
i=i+3;//三条汇编语句组成
}
这两条C语句度不是原子操作,某条汇编语句可能会被其他进程或者线程打断
使对整形数据(int)操作变成原子操作,要依靠一个数据类型:atomic_t
atomic_t n; //定义一个原子变量
atomic_set(&n,2);//将变量初始值设为2
atmoic_add(5,&n);//将变量加5
atomic_dec(&n);//将变量减1
ptink(“n%d\n”,atomic_read(&n));//输出n的值
实现原子操作方法;
1 自旋锁
自旋锁它是为为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似
,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
使用;
定义:
spinlock_t lock;//定义
spin_lock_init(&lock);//初始化
spin_lock(&lock);//获取,没获取就被阻塞 spin_trylock(&lock)不阻塞 立即返回 成功返回非0 不成功返回0
.......
.......
临界区代码
.........
spin_unlock(&lock);//释放
2 信号量
信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:
(1) 测试控制该资源的信号量。
(2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。
(3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。
(4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
使用:
struct semaphore sem;//定义
static inline void sema_init(struct semaphore *sem,int val);//初始化
void down (struct semaphore *sem) ;// 获取信号量,没获取到就使当前进程睡眠
另外一个 downtrylock(struct semaphore *sem); 不睡眠 立即返回
.......
.......
临界区代码
.........
extern void up (struct semaphore *sem);//释放信号量
3 互斥体
互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体
(mutex))。互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section)。因此,在任意时刻,只有一个线程被允许进入这样的代码保护区。任何线程在进入临界区之前,必须获取(acquire)与此区域相关联的互斥体的所有权。如果已有另一线程拥有了临界区的互斥体,其他线程就不能再进入其中。这些线程必须等待,直到当前的属主线程释放(release)该互斥体。
使用;
struct mutex my_mutex;//定义
mutex_init(&my_mutex);//初始化
mutex_lock(struct mutex *lock) ;//另获取外一个 mutex_trylock(struct mutex *lock)(没获取到也补睡眠,立即返回)
.......
.......
临界区代码
.........
void mutex_unlock(struct mutex *lock);//释放
原子操作就是单位操作,也就是说操作过程不能被中断
下面代码中每条语句看起来是原子操作,其实不是原子操作;
int main(0
{
int i=2;//两天汇编语句组成
i=i+3;//三条汇编语句组成
}
这两条C语句度不是原子操作,某条汇编语句可能会被其他进程或者线程打断
使对整形数据(int)操作变成原子操作,要依靠一个数据类型:atomic_t
atomic_t n; //定义一个原子变量
atomic_set(&n,2);//将变量初始值设为2
atmoic_add(5,&n);//将变量加5
atomic_dec(&n);//将变量减1
ptink(“n%d\n”,atomic_read(&n));//输出n的值
实现原子操作方法;
1 自旋锁
自旋锁它是为为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似
,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。
使用;
定义:
spinlock_t lock;//定义
spin_lock_init(&lock);//初始化
spin_lock(&lock);//获取,没获取就被阻塞 spin_trylock(&lock)不阻塞 立即返回 成功返回非0 不成功返回0
.......
.......
临界区代码
.........
spin_unlock(&lock);//释放
2 信号量
信号量又称为信号灯,它是用来协调不同进程间的数据对象的,而最主要的应用是共享内存方式的进程间通信。本质上,信号量是一个计数器,它用来记录对某个资源(如共享内存)的存取状况。一般说来,为了获得共享资源,进程需要执行下列操作:
(1) 测试控制该资源的信号量。
(2) 若此信号量的值为正,则允许进行使用该资源。进程将信号量减1。
(3) 若此信号量为0,则该资源目前不可用,进程进入睡眠状态,直至信号量值大于0,进程被唤醒,转入步骤(1)。
(4) 当进程不再使用一个信号量控制的资源时,信号量值加1。如果此时有进程正在睡眠等待此信号量,则唤醒此进程。
使用:
struct semaphore sem;//定义
static inline void sema_init(struct semaphore *sem,int val);//初始化
void down (struct semaphore *sem) ;// 获取信号量,没获取到就使当前进程睡眠
另外一个 downtrylock(struct semaphore *sem); 不睡眠 立即返回
.......
.......
临界区代码
.........
extern void up (struct semaphore *sem);//释放信号量
3 互斥体
互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体
(mutex))。互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section)。因此,在任意时刻,只有一个线程被允许进入这样的代码保护区。任何线程在进入临界区之前,必须获取(acquire)与此区域相关联的互斥体的所有权。如果已有另一线程拥有了临界区的互斥体,其他线程就不能再进入其中。这些线程必须等待,直到当前的属主线程释放(release)该互斥体。
使用;
struct mutex my_mutex;//定义
mutex_init(&my_mutex);//初始化
mutex_lock(struct mutex *lock) ;//另获取外一个 mutex_trylock(struct mutex *lock)(没获取到也补睡眠,立即返回)
.......
.......
临界区代码
.........
void mutex_unlock(struct mutex *lock);//释放
相关文章推荐
- Linux 驱动之并发控制 (信号量、原子锁和自旋锁)
- 信号量,互斥体,自旋锁 && linux进程优先级、进程nice值
- Linux 设备驱动 ====> 并发控制 --- 信号量与互斥体
- Linux驱动编程 step-by-step (七) 并发 竞态 (信号量与自旋锁)
- linux 驱动编程___竞态/并发问题___信号量和互斥体
- Linux 设备驱动 ====> 并发控制 --- 信号量与互斥体
- Linux 设备驱动 ====> 并发控制 --- 信号量与互斥体
- 对linux驱动编程中的“信号量”和“自旋锁”的一些理解
- Linux驱动编程 step-by-step (七) 并发 竞态 (信号量与自旋锁)
- linux的几种锁:信号量、互斥体、自旋锁
- linux驱动学习(3)--同步、信号量和自旋锁
- 非常精简的Linux线程池实现(二)——使用信号量和自旋锁进一步简化程序
- 信号量、互斥体和自旋锁
- linux驱动开发--字符设备:信号量
- 信号量、互斥体和自旋锁
- Linux 线程信号量,进程信号量和内核驱动程序信号量(线程同步信号量,进程同步信号量和设备驱动同步信号量)
- 设备驱动之一 - linux 信号量semaphore
- Linux下原子操作(信号量 自旋锁)的实现原理和底层代码分析
- 互斥体、原子操作、自旋锁、信号量
- 07-S3C2440驱动学习(一)嵌入式linux字符设备驱动-按键驱动程序之异步通知机制+原子操作+互斥信号量+阻塞与非阻塞+定时器去抖