0

我知道内核可以通过自旋锁方法同步进程。但是,当涉及到一个处理器时,它是如何做到的呢?它如何使用同步对象来确保互斥?

信号量是行政级别的吗?内核如何在这里发挥作用?

互斥锁是否仅在内核级别实现?当资源空闲时,它们不会发出信号或消息。

4

2 回答 2

1

你在这里有几个问题:

我知道内核可以通过自旋锁方法同步进程。但是,当涉及到一个处理器时,它是如何做到的呢?它如何使用同步对象来确保互斥?

在单处理器机器上,获取自旋锁只会将 IRQL 提升到 >DISPATCH_LEVEL - 无法抢占处于这种提升 IRQL 的线程,因此可以保证同步。

信号量是行政级别的吗?内核如何在这里发挥作用?

信号量、互斥体(以及大多数可等待的对象)是内核调度对象。此类对象由内核实现,并通过 KERNEL32.DLL (CreateEvent/Mutex/Semaphore 等) 导出的各种函数提供给用户模式应用程序。此外,“内核发挥作用”通过调度线程等待和唤醒正在等待同步对象的线程。

互斥锁是否仅在内核级别实现?

Mutex 对象确实是内核调度对象(KMUTEX)。互斥对象未拥有时会发出信号。当一个线程获得一个互斥体时,它的状态变为非信号状态,这意味着任何其他试图获得它的线程都将进入等待状态,直到获得互斥体或等待超时。

有关内核调度程序对象以及一般 Windows 同步的更详细说明,请查看最新版本的“ Windows Internals ”——恕我直言,每个 Windows 开发人员都应该在他们的办公桌上拥有一份此副本。

于 2012-11-13T01:42:12.130 回答
0

“当资源空闲时,它们不会发出信号或消息”——当然会——它们是线程间信号机制!当受保护的资源被释放时,等待互斥锁的线程会收到信号并准备好,因此获取互斥锁。

自旋锁通常不在单核处理器上使用——没有意义。TBH,自旋锁在多核和集群系统上也需要非常小心,如果它们的使用不会适得其反。

于 2012-11-13T10:15:24.573 回答