标题:spinlock与mutex的区别


用于系统内核同步的机制包括:SpinlockEventTimerMutexSemaphoreRead/Write LockERESOURCE等。应该说,除了运行的级别不一样,它们的使用方法与应用层的同步与互斥机制使用方法区别不大。一般应用态的同步与互斥变量都有对应的内核对象(CriticalSection除外)。需要特别指出的是,在内核态同步机制中引入了Spinlock机制,在WindowsLinux/UNIX内核中,关于SpinlockMutex是控制内核线程同步的两种机制,它们的区别是:

 

1 Spinlock之所以叫Spinlock就因为它是忙等,不会阻塞系统对忙等线程的调度则该线程会占着 CPU不放,一直轮循,因此Spinlock适用于等待时间不会太长(例如不要超过25微秒)的情况。而Mutex不是,它会系统阻塞请求线程。如果你需要长时间串行化访问一个对象,应该首先考虑使用互斥量而不是自旋锁。

2 Spinlock请求成功之后,CPU的执行级别会提升到DLMutex不会。

3 DL及以下级别都可以请求SpinlockMutex只能在PL请求。

4 Spinlock是“非递归锁”,即不能递归获得该锁,而Mutex是“递归锁”。

5 Spinlock主要用于多CPU。在单CPU中,为了保持各个执行路径之间的数据访问互斥,主要是中断和Bottom_half问题,只需关闭中断即可,但是在多CPU中,又加上了其他CPU的影响,因此需要Spinlock达到串行访问数据目的。

此外,Spinlock对效率影响较大,在多CPU上一般建议使用资源执行体ERESOURCE

上面提到了DLPL运行级别,可能有的朋友不是很熟悉。在Windows系统中,系统为CPU运行定义了如下几个中断级别:

无中断:            PASSIVE_LEVE         常规线程执行

软中断:            APC_LEVEL               异步过程调用执行

                         DISPATCH_LEVEL      线程调度,延时过程调用执行

硬中断:            DIRQL                         设备中断请求级处理程序执行

                         PROFILE_LEVEL        配置文件定时器

                         CLOCK2_LEVEL 时钟

                         SYNCH_LEVEL          同步级

                         IPI_LEVE                   处理器之间中断级

                         POWER_LEVEL          电源故障级

线程可以运行在上述不同的CPU级别上。不同的级别,调用的API有不同的要求。比如有的API只能执行在PASSIVE_LEVEL上,那么就不能在DISPATCH_LEVEL或者APC_LEVEL上调用。



看文字不过瘾?点击我,进入腾讯课堂视频教学
麦洛科菲长期致力于IT安全技术的推广与普及,我们更专业!我们的学员已经广泛就职于BAT360等各大IT互联网公司。详情请参考我们的 业界反馈 《周哥教IT.C语言深学活用》视频

我们的微信公众号,敬请关注