正在阅读:

linux服务器性能调优-锁的使用

279

一. 目的

总结linux高性能服务器调优手段 - pthreads 锁的使用。

Pthreads提供了多种锁机制:

(1) Mutex(互斥量):pthread_mutex_***

(2) Spin lock(自旋锁):pthread_spin_***

(3) Condition Variable(条件变量):pthread_con_***

(4) Read/Write lock(读写锁):pthread_rwlock_***

二. 总结

1.  锁之 mutex

Pthreads提供的Mutex锁操作相关的API主要有:

pthread_mutex_lock (pthread_mutex_t *mutex);

pthread_mutex_trylock (pthread_mutex_t *mutex);

pthread_mutex_unlock (pthread_mutex_t *mutex);

从 实现原理上来讲,Mutex属于sleep-waiting类型的锁。

例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上。

假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,

而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),

Core0 会在此时进行上下文切换(Context Switch)将线程A置于等待队列中,

此时Core0就可以运行其他的任务(例如另一个线程C)而不必进行忙等待。

而Spin lock则不然,它属于busy-waiting类型的锁,

如果线程A是使用pthread_spin_lock操作去请求锁,

那么线程A就会一直在 Core0上进行忙等待并不停的进行锁请求,

直到得到这个锁为止。

2.  锁之 spin_lock

Pthreads提供的与Spin Lock锁操作相关的API主要有:

pthread_spin_lock (pthread_spinlock_t *lock);

pthread_spin_trylock (pthread_spinlock_t *lock);

pthread_spin_unlock (pthread_spinlock_t *lock);

自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,

如果自旋锁已经被别的执行单元保持,调用者就一直循环在

那里看是 否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名。

其作用是为了解决某项资源的互斥使用。

因为自旋锁不会引起调用者睡眠,所以自旋锁的效率远 高于互斥锁

虽然它的效率比互斥锁高,但是它也有些不足之处:

1、自旋锁一直占用CPU,他在未获得锁的情况下,一直运行--自旋,

所以占用着CPU,如果不能在很短的时 间内获得锁,这无疑会使CPU效率降低。

2、在用自旋锁时有可能造成死锁,当递归调用时有可能造成死锁,

调用有些其他函数也可能造成死锁,如 copy_to_user()、copy_from_user()、kmalloc()等。

因此我们要慎重使用自旋锁,自旋锁只有在内核可抢占式或SMP的情况下才真正需要,

在单CPU且不可抢占式的内核下,自旋锁的操作为空操作。

自旋锁适用于锁使用者保持锁时间比较短的情况下

3.  锁之 cond

每个进程都拥有自己独立的进程空间,

4.  锁之 rwlock

三. 使用场景

需求                             建议的加锁方法  

低开销加锁                                优先使用自旋锁

短期锁定                                    优先使用自旋锁

长期加锁                                    优先使用信号量

中断上下文中加锁                    使用自旋锁

持有锁是需要睡眠, 调度          使用信号量

对于single-core/single-CPU,spinlock将一直浪费CPU资源,如果采用mutex,

反而可以立刻让其他的thread运行,可能去释放mutex lock。

对于multi-core/mutil-CPU,会存在很多短时间被占用的lock,

如果总是去让thread sleep,紧接着去wake up,这样会浪费很多CPU资源,

从而降低了系统性能,所以应该尽量使用spinlock。

四. 其他锁优化场景

1.  大锁拆小锁

2.  构造无锁操作

留下脚印,证明你来过。

*

*

流汗坏笑撇嘴大兵流泪发呆抠鼻吓到偷笑得意呲牙亲亲疑问调皮可爱白眼难过愤怒惊讶鼓掌
关闭