kernel互斥锁mutex
来源:互联网 发布:weka 自定义 分类算法 编辑:程序博客网 时间:2024/05/17 21:55
互斥锁主要用于实现内核中的互斥访问功能。内核互斥锁是在原子 API 之上实现的,但这对于内核用户是不可见的。对它的访问必须遵循一些规则:同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。互斥锁不能进行递归锁定或解锁。一个互斥锁对象必须通过其API初始化,一个任务在持有互斥锁的时候是不能结束的,互斥锁所使用的内存区域是不能被释放的,使用中的互斥锁是不能被重新初始化的,并且互斥锁不能用于中断上下文。互斥锁比内核信号量更快,并且更加紧凑,因此如果它们满足您的需求,那么它们将是您明智的选择。
/linux/include/linux/mutex.h
/* 1: unlocked, 0: locked, negative: locked, possible waiters */
atomic_t count;
spinlock_t wait_lock;
struct list_head wait_list;
#ifdef CONFIG_DEBUG_MUTEXES
struct thread_info *owner;
const char *name;
void *magic;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
};
1 没有上锁,可以获得
0 被锁定,不能获得
负数 被锁定,且可能在该锁上有等待进程,初始化为没有上锁。
wait_lock等待获取互斥锁时使用的自旋锁。在获取互斥锁的过程中,操作会在自旋锁的保护中进行。初始化为为锁定。
wait_list等待互斥锁的进程队列。
相关API:
1、定义并初始化:
struct mutex mutex;
mutex_init(&mutex);
2、获取互斥锁:
(1)具体参见linux/kernel/mutex.c
void inline fastcall __sched mutex_lock(struct mutex *lock);
首先取得count的值,在将count置-1,判断如果原来count的置为1,也即互斥锁可以获得,则直接获取然后跳出。否则进入循环反复测试互斥锁的状态。在循环中,同样先取得互斥锁原来的状态,在将其-1,如果可以获取(等于1),则退出循环,否则设置当前进程的状态为不可中断状态,解锁自身的自旋锁,进入睡眠状态,待被再调度唤醒时,再获得自身的自旋锁,进入新一次的查询其自身状态(该互斥锁的状态)的循环。
(2)具体参见linux/kernel/mutex.c
int fastcall __sched mutex_lock_interruptible(struct mutex *lock);
和mutex_lock()一样,在获得了互斥锁后会返回0。如果在等待获取锁的时候进入睡眠状态并收到一个信号(被信号打断睡眠),则返回-EINIR。
(3)具体参见linux/kernel/mutex.c
int fastcall __sched mutex_trylock(struct mutex *lock);
试图获取互斥锁,如果成功获取则返回1,否则返回0,不等待。
3、释放互斥锁:
具体参见linux/kernel/mutex.c
void fastcall mutex_unlock(struct mutex *lock);
释放被当前进程获取的互斥锁。该函数不能用在中断上下文中,而且不允许去释放一个没有上锁的互斥锁。
- kernel互斥锁mutex
- Mutex(WaitFor..)Kernel Mode
- 互斥锁mutex
- 互斥锁mutex
- 互斥锁mutex
- 设备驱动中的mutex(kernel-4.7)
- Linux kernel: How to debug mutex deadlock 如何调试mutex死锁
- mutex 互斥锁线程控制
- mutex 互斥锁线程控制
- 【多线程学习】:互斥锁Mutex
- C# 互斥锁 Mutex
- golang sync mutex 互斥锁
- C# 互斥锁(Mutex)
- Mutex(互斥锁)
- 互斥锁mutex的使用方法
- linux之mutex(互斥锁)
- Linux内核互斥锁--mutex
- 互斥锁mutex的使用方法
- 紫书例题 10-26 UVa 11440
- Math类中包含基本的数字操作,如指数、对数、平方根和三角函数。
- Redis集群搭建与简单使用
- 6 抽象工厂模式
- 年纪大的程序员有何出路?
- kernel互斥锁mutex
- IOS 国际化设置(i18n)
- 谈谈互联网后端基础设施
- qw
- Android异常IndexNotReadyException: Please change caller according to .....
- eclipse maven 插件的安装和配置
- Android系统Root与静默安装
- Android中HttpClient请求https的验证过程
- KMP算法转载http://www.tuicool.com/articles/e2Qbyyf