用于系统内核同步的机制包括:Spinlock,Event,Timer,Mutex,Semaphore,Read/Write Lock,ERESOURCE等。应该说,除了运行的级别不一样,它们的使用方法与应用层的同步与互斥机制使用方法区别不大。一般应用态的同步与互斥变量都有对应的内核对象(CriticalSection除外)。需要特别指出的是,在内核态同步机制中引入了Spinlock机制,在Windows或Linux/UNIX内核中,关于Spinlock或Mutex是控制内核线程同步的两种机制,它们的区别是:
1) Spinlock之所以叫Spinlock就因为它是忙等,不会阻塞系统对忙等线程的调度则该线程会占着 CPU不放,一直轮循,因此Spinlock适用于等待时间不会太长(例如不要超过25微秒)的情况。而Mutex不是,它会系统阻塞请求线程。如果你需要长时间串行化访问一个对象,应该首先考虑使用互斥量而不是自旋锁。
2) Spinlock请求成功之后,CPU的执行级别会提升到DL,Mutex不会。
3) DL及以下级别都可以请求Spinlock。Mutex只能在PL请求。
4) Spinlock是“非递归锁”,即不能递归获得该锁,而Mutex是“递归锁”。
5) Spinlock主要用于多CPU。在单CPU中,为了保持各个执行路径之间的数据访问互斥,主要是中断和Bottom_half问题,只需关闭中断即可,但是在多CPU中,又加上了其他CPU的影响,因此需要Spinlock达到串行访问数据目的。
此外,Spinlock对效率影响较大,在多CPU上一般建议使用资源执行体ERESOURCE。
上面提到了DL与PL运行级别,可能有的朋友不是很熟悉。在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上调用。
Copyright 2011-2020 © MallocFree. All rights reserved.