linux驱动 并发策略
来源:互联网 发布:韩庚 王凯 知乎 编辑:程序博客网 时间:2024/06/05 19:50
互斥访问:一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。
信号量:在Liunx中的信号量是一种睡眠锁。假如进程A先持有信号量F,然后进程B试图获取已经被进程A持有的信号量F时(假如信号量F资源值为1),信号量会将B进程推入等待队列,然后让
其睡眠。当持有信号量的进程A将信号量F释放后,进程B才会被唤醒,从而获得这个信号量,继续执行进程B代码。
PS:信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况;信号量只能在进程中使用,不能再中断中使用。
信号量基本使用形式:
(1) 定义信号量:struct semaphore sem;
(2) 初始化信号量:void sema_init(struct semaphore *sem, int val);
(3) 初始化互斥信号量:
void init_MUTEX(struct semaphore *sem);
等同于:sema_int(struct semaphore*sem, 1);
获得信号量:
(1) void down(struct semaphore *sem);
此函数用于获得信号量sem,它会导致睡眠,因此不能用于中断上下文
(2) int down_interruptible(struct semaphore *sem);
同down(),差异在于因为down()而进入睡眠状态的进程不能被信号打断,而因为down_interruptible()而进入睡眠状态的进程能被信号打断,而信号会导致该函数返回,这时候函数返回非0;
(3) int down_trylock(struct semaphore *sem);
该函数尝试获得信号量sem,如果能够立即获得,它就获得该信号量返回0,否则,返回非0值,它不能导致调用者睡眠,可以在中断上下文使用。
释放信号量:
void up(struct semaphore *sem);
该函数释放信号量sem,唤醒等待者。
使用信号量的注意事项:
(1)可以长期加锁;
(2)只能用于进程上下文,不能用于中断上下文;
(3)在持有自旋锁的同时,不能持有信号量;
信号量操作:
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);//释放信号量
原子操作:
atomic_t n; //定义一个原子变量
atomic_set(&n,2);//将变量初始值设为2
atmoic_add(5,&n);//将变量加5
atomic_dec(&n);//将变量减1
自旋锁操作:
spinlock_t lock;//定义
spin_lock_init(&lock);//初始化
spin_lock(&lock);//获取,没获取就被阻塞 spin_trylock(&lock)不阻塞 立即返回 成功返回非0 不成功返回0
临界区代码
spin_unlock(&lock);//释放
互斥体
互斥体实现了“互相排斥”(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驱动--并发控制
- linux驱动-并发
- linux驱动中的并发控制
- LINUX驱动中的并发控制
- Linux设备驱动并发控制
- Linux驱动中的并发控制
- Linux内核驱动并发控制
- Linux设备驱动中的并发
- [Linux驱动入门]并发同步
- Linux驱动的并发机制
- Linux驱动--并发和竞争
- linux驱动开发---并发控制
- Linux驱动并发处理---信号量
- 深入浅出Linux设备驱动之并发控制
- Linux设备驱动中的并发控制
- 深入浅出Linux设备驱动之并发控制
- 深入浅出Linux设备驱动之并发控制
- 学习之旅3
- 为什么 react 中要使用 redux
- Android开发 之 activity跳转动画(补间动画跳转)
- Unity中协程方法使用
- Java并发编程基础
- linux驱动 并发策略
- 数组(java)
- 研究外链对seo还有效果
- 【编程题】根据前序中序重建二叉树
- spring 之 自己动手实现IOC
- 10038---web.xml中的contextConfigLocation在spring中的作用
- PAT乙级(Basic)题库---1002
- VBA数据类型和类型转换函数
- HihoCoder