【问题标题】:Synchronization level (executive or kernel) used by monitors, mutex, and semaphore监视器、互斥体和信号量使用的同步级别(执行或内核)
【发布时间】:2012-11-01 11:51:56
【问题描述】:

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

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

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

【问题讨论】:

  • 用户级同步对象从哪里获得能力?

标签: windows multithreading kernel semaphore executives


【解决方案1】:

这里有几个问题:

我了解内核可以通过 自旋锁方法。然而,当它归结为一个处理器时,如何 它这样做吗?它如何使用同步对象来确保相互 排除?

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

信号量是行政级别的吗?内核是怎么来的 在这里玩吗?

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 大多数软件并非专用于多核或单核系统,因此您不会有不同的版本
    猜你喜欢
    • 2016-11-04
    • 1970-01-01
    • 2011-04-10
    • 2016-08-30
    • 1970-01-01
    • 2021-11-18
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多