Op maandag 17 september 2001 02:11 schreef Yarvieh het volgende:
vraag me af wat er dan nog op een hoger prio loopt dan mijn process?!
Idee: de NT task scheduler?
Ik denk dat je veels te moeilijk aan het doen bent met die job objects... zit net een stuk in MSDN door te lezen ('Real-Time Systems and Microsoft Windows NT') en volgens dat stuk zijn realtime processen best mogelijk, maar dan moet je priorityclass 31 hebben. En om dat te bereiken waren we sowieso de locale threadpriority nog vergeten in die benchmarkcode (en jij ook in bovenstaande code). Het process moet op REALTIME, en de thread moet op TIME_CRITICAL. Oftewel:
code:
1
2
| SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); |
Volgens MSDN houdt Time Critical thread priority het volgende in:
'Indicates a base priority level of 15 for IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS processes, and a base priority level of 31 for REALTIME_PRIORITY_CLASS processes.
Oftewel met deze code komen we uit op priority 31, wat volgens eerdergenoemd artikel het hoogst mogelijke is op een NT-systeem. Zolang deze code niet 'yield' oftewel een kernelmode wait ergens doet, KAN hij niet switchen, er is immers geen hogere prioriteitsactiviteit (buiten de kernel zelf).
Ook interessant: in MSDN de pagina 'Scheduling Priorities' over de relatieve impact van priority classes en thread priorities. Deze meldt dat we bij de oude code uitkwamen op:
24 : REALTIME_PRIORITY_CLASS + THREAD_PRIORITY_NORMAL
Op 22-26 hangen de systemlevel tasks zoals muis en disk syncing rond, wat dus zou verklaren dat we soms inderdaad nog een task switch kregen.