-
Здравствуйте! В нижеследующем коде наблюдаю страное значения возвращаемые функцией - NtQuerySystemInformation:
type
SYSTEM_PROCESSOR_TIMES = record
IdleTime,
KernelTime,
UserTime,
DpcTime,
InterruptTime: Int64;
InterruptCount: Cardinal;
end;
var
TimesStart, TimesEnd: SYSTEM_PROCESSOR_TIMES;
NtQuerySystemInformation(8, TimesStart, SizeOf(SYSTEM_PROCESSOR_TIMES), nil);
Sleep(1000);
NtQuerySystemInformation(8, TimesEnd, SizeOf(SYSTEM_PROCESSOR_TIMES), nil);
Иногда, по не понятным для меня причинам, значение: (TimesEnd.IdleTime - TimesStart.IdleTime) = 10140065, хотя при sleep(1000) оно не может быть больше чем 10000000! Код выполняется с наивышим приоритетом: SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); P.S. Процессор двухядерный (Intel).
-
> Код выполняется с наивышим приоритетом:
Самый Наивысший приоритет имеет сама ОС. Реальный REALTIMЕ может быть только в однозадачной ОС! А ещё лучше когда ОС нет вообще! Как не крути :( P.S. Не помню дословно, но в каждом описании прикладного ПО есть строки о том, что данное ПО не предназначено для использования в системах жизнеобеспечения. В т.ч. и по вышеуказанной причине.
> P.S. Процессор двухядерный (Intel).
Да хоть 2000-ядерный. Дело не в нём.
-
> Германн © (29.10.08 01:12) [1] К слову, есть многозадачная *nix-like ОС реального времени - QNX.
> AndreyRus © (28.10.08 23:14) > (TimesEnd.IdleTime - TimesStart.IdleTime) = 10140065, хотя > при sleep(1000) оно не может быть больше чем 10000000! Кто Вам такое сказал? Sleep(1000) означает только то, что пауза будет не менее 1000 мс, а вот верхняя граница не ограничивается, т.е. пауза может составлять и 1001 и 2000 мс, это будет зависеть от нагруженности ОС процессами.
-
> Да хоть 2000-ядерный. Дело не в нём.
На одноядерном я такой паталогии не наблюдаю.
-
При этой странной ошибке разница (дельта) между TimesEnd и TimesStart выглядит так:
IdleTime = 10140065 KernelTime = 10140065 UserTime = 0 DpcTime = 0 InterruptTime = 0 InterruptCount = 1034
-
Почему Вы считаете, что это ошибка ? Sleep(1000) может выполнятся сколько угодно времени, но не менее 1000мс, т.е. IdleTime будет не менее 10000000, но не равно 10000000, что у Вас и наблюдается.
-
Почему же на однопроцессорной машине этого не наблюдается?
-
> Почему же на однопроцессорной машине этого не наблюдается? Случайность. Еще почитайте, почему часто используется Sleep(0) при написании многопоточных программ. Это немного "из другой оперы", но зато объяснит как работает системный планировщик потоков и что для него означает команда Sleep().
-
-
Мда... оказывает что:
PriorityClass:= REALTIME_PRIORITY_CLASS; ThreadPriority:= THREAD_PRIORITY_TIME_CRITICAL; и timeBeginPeriod(1)
не дает желаемого результата - точность задержки sleep(x). Тему можно закрывать.
-
> slow!alfamoon!com (29.10.08 18:09) [8] Я знаю эту статью. И Sleep(0) не зло, а необходимость.
-
> не дает желаемого результата - точность задержки sleep(x). И не даст, Windows не ОС реального времени.
-
> МистерТ (30.10.2008 8:00:11) [11]
Да конечно, она мастдай.
-
> Anatoly Podgoretsky © (30.10.08 09:15) [12] > Да конечно, она мастдай. ??? Это было сказано с иронией ? С каких пор Windows стала ОС реального времени ?
-
> МистерТ (30.10.2008 12:10:13) [13]
Как минимум начиная с платформы НТ, но точно также можно рассматривать и платформу W9x. Ты скажи на основание чего ты сделал свое утверждение, тебе Микрософт не нравится? Или ты где то прочитал про это?
Я уж молчу про ДОС - система жесткого реального времени.
-
-
> МистерТ (30.10.2008 16:14:15) [15]
Под это описание из статьи, Виндоус полностью подходит. Ты пытаешь спорить с экстенсивной характеристикой, со временем отклика. Ну так я работал на 8 разрядных ОСРВ c тактом 100 мс, которые управляли довольно крупным химическими установками и никто даже не пытался оспаривать.
Все это обычные системы мягкого РВ, отличающие только характеристиками.
Ну или споришь с назначеним ОС, но так почти любая ОС в состоянии менять свое назначение в любую сторону, а не с реалтаймовостью. Я же говорю мастдай. Быть или общей системой или скажем системой управления процессом.
Кстати статья очень грубая, некачественная, поверхностная.
-
> Anatoly Podgoretsky © (30.10.08 16:38) [16]
Windows 2k srv была использована мной для системы управления контактной сваркой в свое время. Работает до сих пор :) Все как всегда - "Не научился готовить собак, не берись за готовку кошек" (С)
-
Sleep(0) необходимость? Странно, хотя раз вам нравится тратить процессорное время на переключение контекстов потоков - ради бога
|