Linux 设备驱动中的并发控制

来源:互联网 发布:java http json接口 编辑:程序博客网 时间:2024/04/30 10:08

一)并发与竞争

并发:是指几个进程同时在一个处理机上运行

竞争:是指两个或者以上的进程同时访问同一个资源而产生的。

并发的控制机制:原子变量操作、自旋锁、信号量、完成量。

 

二)原子变量操作

原子变量操作原理:原子操作,意思是,要么不执行,要执行就要执行完,在执行的过程中不被打断。需要硬件的支持,是架构相关的,类型和操作在 include/asm/atomic.h里定义,是用汇编语音来实现的。

原子变量的定义

typedef struct{

 volatile int counter;

} atomic_t;

使用volatile,编译器就不要对该类型进行优化,对该变量的访问只能是基于内存的,不要缓冲到寄存器。通过这样的类型定义的变量,不能直接加1或者减1,而要利用linux的对应的函数

 

三)自旋锁

原子操作不能满足复杂的内核设计需求,因此有必要提供别的机制,锁就是方式。Linux一般认为有2种锁:自旋锁和信号量。

自旋锁使用:

 首先定义: spinlock_t lock;

初始化: spin_lock_init(lock);

锁定:spin_lock(&lock);

临界区

解锁:spin_unlock(&lock);

注意事项:自旋锁是一种忙等待;自旋锁不能递归使用

 

四)信号量

信号量也是一种锁,有两种信号量:一种用于内核程序中,一种用于应用程序中。

信号量与自旋锁的区别在于:自旋锁是一种循环等待的机制;而信号量发现被锁了,就睡眠,直到被唤醒。这就要求能睡眠的进程才能使用信号量。

信号量是基于自旋锁来实现的

信号量的使用:

定义:semaphore sem;

初始化: init_MUTEX(sem);

锁定:down(&sem)

解锁:up(&sem);

0 0