更改Windows线程sheduler timeslice


1

这个问题是关于将Windows内核调整为像ose一样实时的可能性,以及实现它的方法。这是一个非常具体的狭隘主题,需要深层次的知识 - 你要么知道,要么不知道。

我在WS2016 x64平台上,我可以将定时器分辨率设置为500us(0.5ms),NtSetTimerResolution()ntdll.dll库中调用函数。我猜这个价值与sheduler时间片有关。

但是,我想将它增加到100us。测量可能涉及在循环内多次调用NtDelayExecution()包含在QueryPerformanceCounter()调用中,然后分析抖动,标准偏差等统计信息。

这应该怎么做?是否有任何注册表/文件调整,我可以在哪里设置arbiraty windows sheduler timeslice?


PS。有些人可能会问“ 你为什么需要它? ”,或者说“不要做,不对! ”。我预见到那种想法,并会提前回答。

  • 这只是软件实验。它只是用于测试这样做的可能性和实际结果。
  • 我知道它可能导致潜在的问题,例如在上下文切换时浪费额外的CPU时间,系统不稳定,不负责任,数据丢失以及它可能导致的任何问题。我接受提前做出并承担全部责任的任何负面后果。即使我的机器会冒出烟雾和火花:)
  • 根据谷歌搜索或在这里搜索 - ofc我alredy做了它,并没有找到有用的信息,因为这个主题非常狭窄,与OS shedulers功能有关。在任何Windows机器上做几乎没有意义。我知道我不能把它变成实时。这个网站搜索“sheduler timeslice”没有结果。

Answers:


0

调度器时间间隔不受定时器分辨率的直接影响。对于客户端SKU上的大多数进程,它是20毫秒; 对于拥有前景窗口的进程,它是60毫秒。服务器SKU上的这些值通常都是120毫秒。

无论您使用NtSetTimerResolution做什么,这些值都是相同的。无论定时器分辨率如何,在检测到20毫秒间隔之前计数适当数量的定时器时钟中断,并且调度器递减当前线程的“量子”计数器等。

因此,如果您设法将计时器分辨率提高到100 usec,则不会影响线程调度。然而,它会产生额外的开销,即前一次调用例程的5倍,检查是否有任何定时器已过期。

没有注册表或其他调整来改变这一点。

有一个注册表黑客可以用来打败客户端SKU上发生的“时间段延伸”,或者使服务器系统的行为像客户端一样,反之亦然,就时间片长度而言。有时候(由于Thread-> Quantum的一点点,当线程从等待中完成时),时间片可能比它“应该”的时间短一些。但是没有办法将时间片设置为小于20毫秒,或者除了20毫秒的倍数之外的任何东西,并且没有多少不同的倍数可用。

请注意,调度程序时间间隔对抢占没有影响。当线程的等待被解决时,如果线程的优先级高于新线程的理想处理器上当前运行的线程的优先级,则后一个线程立即被抢占。在被预先设定之前,它不会运行到其时间片的末尾。只有当多个线程以相同的优先级竞争时,时间片才是重要的。

资料来源:大多数是在Solomon,Russinovich 等人的Windows Internals中


即使通过十六进制编辑一些二进制文件,如果它意外地被编译为Windows内核中的某个常量?然后成为找到4或8个字节并调整它的问题。这不可能是不可能的,因为它不是硬件问题,而是软件问题。它定义了某种操作系统调整,尽管可能没有通过注册表直接暴露。我应该在哪里开始搜索?
xakepp35

据我所知,在reactos源代码中(最好猜测我们从源代码打开)NtQueryTimerResolution()只返回一些KeSetTimeIncrement()函数
xakepp35
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.