User Mode Scheduling

UMS线程有它们自己的内核线程状态,因此对于内核是可见的,这使得多个UMS线程都可以发出阻塞的系统调用、对资源进行共享或竞争,并且有每个线程特有的状态。然而,只要两个或多个UMS线程需要在用户模式下执行工作,它们可以周期行的切换执行环境(做饭是,一个线程让出执行权给另一个线程)而无需涉及内核调度器:环境切换在用户模式下完成。从内核的角度来看,同样的内核线程仍然在运行,一切都没有发生改变。当UMS线程执行需要进入内核的操作(比如系统调用)时,它切换到它的专属内核模式线程(称为定向环境切换)。

Windows 内核架构师 – Dave Probert – 解释了 UMS 的产生动机: 上下文切换在用户模式会更快,因为它不需要在用户模式和内核模式之间频繁切换。 用户模式调度引入了可提升性能的协作式多任务。现在你可以构想一种线程,除非在内核中被阻塞(例如等待IO操作完成),否则不会其他线程(来自同一组的 UMS)抢占。这有利于如创建更高效的锁。 自定义的调度程序可以更好地控制线程的执行。例如,我们可以编写轮循调度程序以公平的方式逐个选择线程(这对有实时性要求的程序非常有用)。或者调度程序可以针对应用程序的特定事件作出反应 — 这些事件内核模式调度程序一无所知。 有关 UMS API 的详细内容可以在MSDN上找到 概括地说:用户模式调度( User Mode Scheduling – UMS) 是种轻量级的机制,应用程序用它来调度自己的线程。如果 UMS 线程在内核中被阻塞的话,应用程序不需要调用系统调度,就能切换用户态下的 UMS 线程,重新获得处理器控制权 。

因此,对于管理那些数量巨大、不太需要系统调用而且工作时间较短的工作单元,这种在用户态下切换线程的能力使 UMS 比线程池要高效得多。

posted on 2017-05-27 10:05  yifi  阅读(540)  评论(0编辑  收藏  举报

导航