内核同步机制

1,Semaphores
跟应用程序的信号量用法差不多,一般把value初始化为1,当做mutex用。sema_init(&sem, 1);
在执行等待时(down),如果value<1, 线程将阻塞。因此semaphores不能用在禁止sleep的环境,比如中断处理。
普通semaphores只允许一个线程进入临界区,而Reader/Writer Semaphores运行多个读线程进入,但只有一个写线程可以进入

2,Completions
Completions与semaphores作用差不多,都可以实现同步的功能。不同的环境,两者的效率不同:
semaphores适用这样的情况:临界资源经常是有效的,即value值大于0,所以down操作不需要阻塞,能立刻获得资源;
completions适用这样的情况:临界资源经常是被占用的,执行wait_for_completion时需要阻塞等待其他线程释放资源。

3, spinlocks
与semaphores相比,spinlocks可以用在禁止sleep的环境,比如中断处理;
执行spin_lock时不能被中断
内核获取spinlock后将禁止内核抢占相应处理器
获取spinlock的临界区要注意一下几点:
处理尽可能简短,也不要执行睡眠等所有会放弃cpu资源的操作(中断处理除外),以防其他处理器长时间自旋等待这个被占用的锁
获取spinlock后,禁止相应cpu的中断可以预防死锁

Reader/Writer Spinlocks

ps:
提供给外部的接口,必须明确的占用和释放锁;
内部接口可以假设调用者会进行上锁。但最好留下注释备忘。

posted @ 2013-05-02 16:56  datetree  阅读(158)  评论(0编辑  收藏  举报