linux 原子操作,信号量,互斥锁mutex,自旋锁splock

avatar
作者
猴君
阅读量:0

1:内核中的竞争状态和互斥

1)竞争状态(竞争)
2)临界段(可能会引起并发),在临界点加互斥锁以保护,死锁。
3)同步 并发(多cpu, 多任务,中断)查阅百度多去了解这些概念

2:解决竞争状态的方法
1)原子操作 automic_t 执行过程中间不可被打断
2)信号量,互斥锁,当一个进程执行这段代码时,把自己锁上,别的进程是不能进行访问的,执行完时,才打开锁,所以叫互斥锁
3)自旋锁,当执行一段代码时,缺乏一个信号量,可以进入休眠,自己挂起,不把cpu交出去,在这段短时间一直在等待,

信号量适合等待时间的长的,自旋锁适合等待时间短的;

1)自旋锁不能递归,获取了一个自旋锁,不能再次获取自旋锁,好比,或得了钥匙,进去后,把钥匙扔出去了。只有等待别人来解开锁

2)自旋锁可以用在中断上下文(信号量不可以用在中断上下文,因可能进入睡眠,交出cpu,)在中断上下文中获取自旋锁之前要先禁用本地中断。中断上下文不参与调度,所以如果退出中断,是回不来的。

3)自旋锁的核心是,拥有自旋锁的代码必须不能睡眠,要一直拥有cpu直到释放自旋锁

4)信号量和读写信号量适合保持时间较长的情况,会导致调用者进入睡眠,因此只能在进程上下文使用,而自旋锁适合保持是啊金非常短的情况,他可以在任何上下文使用,如果被保护的共享资源只在进程上下文访问,使用信号量保护该共享资源很适合,
如果对共享资源的访问非常短,自旋锁也可以,但是如果被保护的共享资源需要中断上下文访问*(包括底半部即中断处理句柄,和顶半部即软中断,)就必须使用自旋锁,自旋锁保持时间抢占是失效的,而信号量和读写信号量保持期间是可以被抢占的,

自旋锁只有在内核可抢占或多处理器的情况下才真正需要,在单cpu且不可抢占的内核下,自旋锁的所有操作都是空操作

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!