|
|
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
Многопоточность - исследование длительности квантов времени В развлекательных целях разработал программу для измерения длительности квантов времени. В программе необходимо указать количество запускаемых потоков, а в диспетчере задач выполнить привязку процесса к одному ядру. Затем нажать кнопку "Запустить потоки на 5 секунд". Код метода TCalcQuantThread.Execute: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. Ссылка на архив с программой (исходники + исполняемый файл): Вот такие выводы у меня получились: 1) привязка потока к ядру процессора не является постоянной. Это хорошо видно, если запустить только один поток и не привязывать его к ядру в диспетчере задач. При этом часто оказываются загружены несколько ядер (суммарная загрузка не более 100%). 2) ОС старается распределить загрузку по всем доступным ядрам. Если запущены 4 вычислительных потока, то ОС распределит нагрузку по 4-м ядрам (у меня 4-ядерный процессор без гипертрединга). 3) если за одном ядре запущен только один такой поток (вычислительный), то определить длительность кванта времени не удаётся. Предполагаю, что поток отработал свой квант (предположим 50 мс), затем ОС его усыпила, но поскольку нет других потоков, которым нужен процессор, ОС тут же его пробуждает. 4) квант времени - не такая уж маленькая величина. Типичная длительность кванта времена на моём ноутбуке с Intel Core i3 (поколение не знаю) составляет 95мс. Подчеркну - именно для потоков, выполняющих тяжёлые вычислительные задачи (т.е. грузят процессор на 100% и сами по своей воле не засыпают). 5) если запускать потоки с максимальным приоритетом на одном ядре, то происходит их последовательное выполнение. Т.е. если мы создадим 10 потоков с максимальным приоритетом на одном ядре, то будем ждать их завершения 50 сек (примерно так, но тут я недостаточно исследовал :) 6) с помощью функции GetTickCount невозможно решить данную задачу (пытался с ней вначале), т.к. она начинает возвращать новое значение лишь спустя 16 мс. Такая у неё разрешающая способность. А у функции QueryPerformanceCounter точность гораздо выше: менее 1 микросекунды. Разработанный пример может оказаться полезен начинающим программистам, изучающим тему многопоточности. Особенности программы следующие: 1) За уничтожение объекта потока отвечает форма TForm1. Объект потока не уничтожается автоматически при завершении работы метода Execute. При завершении работы потока выставляется поле "IsFinish := True", которое анализируется в событии таймера "TForm1.Timer1Timer". 2) Программа может создать любое количество потоков, которое укажет пользователь (в разумных пределах). Каждому потоку назначается порядковый номер, который передаётся при создании объекта потока с помощью конструктора "TCalcQuantThread.Create" 3) Для хранения ссылок на созданные объекты потоков используется список FList: TList. 4) При срабатывании таймера осужествляется обход списка FList в обратном порядке и для всех потоков, у которых выставлено IsFinish=True, осуществляется вывод собранной информации в компонент Memo1: TMemo, после чего объект потока уничтожается (T.Free), а соответствующий ему элемент удаляется из списка FList. 5) В том случае, если пользователь решил закрыть программу раньше, чем окончатся 5 секунд, в событии TForm1.FormDestroy произойдёт обход списка FList и для каждого объекта потока последовательно будет вызван метод Free. Посколько все потоки выполняются 5 секунд и заканчиваются почти в одно время, то вызов метода Free займет время только для самого первого элемента списка FList. Остальные вызовы Free выполнятся моментально, т.к. к этому времени все потоки уже завершат свою работу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 19:56 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
Приятное исследование, спасибо. DmSer 6) с помощью функции GetTickCount невозможно решить данную задачу (пытался с ней вначале), т.к. она начинает возвращать новое значение лишь спустя 16 мс. Такая у неё разрешающая способность. См. SetSystemTimeAdjustment Это разрешение можно задавать, начиная со 100 нс. Вроде бы. Так написано, можете попробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 21:44 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
DmSer она начинает возвращать новое значение лишь спустя 16 мс. Это если не ставить на десятке красивые анимационные темы и не запускать вижуал студии. Майкросовтские (и не только) поделия играют этим показателем как им хочется. Эксперимент показал, что сферический конь в вакууме ведет себя всегда одинаково. ЗЫ. Я тоже этим игрался, когда мне нужна была быстрая реакция при общении с чувствительной железкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 22:10 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
DmSer, на сайте MS пишут, что промежуток времени, который выделяется потоку (time slice) - примерно 20 мс. https://docs.microsoft.com/en-us/windows/win32/procthread/multitasking ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 22:15 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
DmSer, все это можно было прочитать в книге Руссиновича и без экспериментов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 22:19 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
shalamyansky См. SetSystemTimeAdjustment Это разрешение можно задавать, начиная со 100 нс. Вроде бы. Так написано, можете попробовать. Эта функция совсем для других целей. Чтобы изменить точность GetTickCount нужно использовать функцию timeBeginPeriod. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 22:19 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
s62 DmSer, на сайте MS пишут, что промежуток времени, который выделяется потоку (time slice) - примерно 20 мс Я тоже ожидал примерно такого значения. А по факту чаще 95 мс наблюдаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 22:24 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 22:26 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
DmSer, в догонку. Безобидная на первый взгляд функция timeSetEvent (создание мультимедийного таймера) вторым параметром принимает точность таймера в миллисекундах. Так вот, это значение, как оказалось, становится длительностью кванта глобально для всей системы пока работает этот таймер. P.S. Хех, опоздал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 22:27 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
Barmaley57, Кстати, ты там про QIP писал. Он мог не сам менять точность, а просто использовать компонент, который меняет, TVirtualTreeView, например ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 22:35 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
Kazantsev Alexey Barmaley57, Кстати, ты там про QIP писал. Он мог не сам менять точность, а просто использовать компонент, который меняет, TVirtualTreeView, например ;) про QIP и я писал лет более 10-ти назад, что он размер кванта меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 23:01 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
Я QIP случайно идентифицировал, как виновника, когда разбирался с "поехавшим" планированием потоков. Тогда меня этот прикол сильно удивил. Из-за одного приложения меняются механизмы планирования во всей системе! Мелкософты - они такие)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2020, 23:31 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
Barmaley57 Из-за одного приложения меняются механизмы планирования во всей системе! Мелкософты - они такие)) А вы можете предложить иной способ надежного программного отсчета малых интервалов, кроме перенастройки шедулера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 03:11 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
misha mike, Чем вас QueryPerformanceCounter не устраивает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 03:16 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
rgreat, всем устраивает, но измерять малый интервал -- это не то же самое, что выполнять некое действие с этим интервалом. Таймер дергает обработчик, а чтобы исполнять код каждую миллисекунду, нужно уметь переключать задачи как минимум с таким интервалом (а лучше чаще). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 03:27 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
misha mike, Запроектируйте алгоритм так что бы это было не важно. Как уже было сказано выше Windows это не система реального времени. Тот кто всерьез рассчитывает на обратное - любовно раскладывает сам себе грабли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 03:37 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
rgreat Запроектируйте алгоритм так что бы это было не важно. Дело не в алгоритме, а в том, что в составе WinAPI есть таймер, который умеет срабатывать с периодом вплоть до миллисекунды. Реализовать такой таймер иным способом, кроме ускорения системного шедулера, -- невозможно. Microsoft не виноваты в том, что этот таймер работает именно так. Если они и виноваты в чем-то, то в том, что не написали об этом большими красными буквами в документации к безобидной на первый взгляд функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 03:49 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
misha mike, Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. Таймер можно сделать цикличным а вместо WaitForSingleObjectEx заюзать каллбэк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 04:08 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 04:27 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
misha mike rgreat Запроектируйте алгоритм так что бы это было не важно. Дело не в алгоритме, а в том, что в составе WinAPI есть таймер, который умеет срабатывать с периодом вплоть до миллисекунды. Реализовать такой таймер иным способом, кроме ускорения системного шедулера, -- невозможно. Microsoft не виноваты в том, что этот таймер работает именно так. Если они и виноваты в чем-то, то в том, что не написали об этом большими красными буквами в документации к безобидной на первый взгляд функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 10:45 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
DmSer в диспетчере задач выполнить привязку процесса к одному ядру DmSer привязка потока к ядру процессора не является постоянной. DmSer При этом часто оказываются загружены несколько ядер DmSer ОС старается распределить загрузку по всем доступным ядрам DmSer Предполагаю, что поток отработал свой квант (предположим 50 мс), затем ОС его усыпила, но поскольку нет других потоков, которым нужен процессор, ОС тут же его пробуждает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 12:24 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_ Чтобы не перегревать одно ядро _Vasilisk_ Смотри выше. Равномерный разогрев Нагрев проца это не забота ОС. Процы сейчас сами умеют даже частоты поднимать для отдельных ядер, если есть нагрузка и не превышается TDP. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 12:47 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan), и каким образом прерывание от таймера противоречит сказанному мной? Что вы вообще сказать хотели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 16:52 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 16:57 |
|
||
|
Многопоточность - исследование длительности квантов времени
|
|||
|---|---|---|---|
|
#18+
great, блокирующие функции типа WaitForSingleObject все равно завязаны на разрешающую способность шедулера. Они отпускают поток не мгновенно после изменения состояния ожидаемого объекта, а в лучшем случае тогда, когда отработает текущий поток, висящий на том же ядре. Да и то не факт, на ядро могут быть завязаны и другие потоки, которые тоже дождались разблокировки и квант получит один из них. Сами сказали, что Windows -- не система реального времени, а значит не просто мгновенного, а вообще детерменированного по времени переключения контекста быть не может. В оптимистическом среднем случае это половина интервала работы шедулера. А в пессимистическом -- вообще многие секунды. Что касается частой генерации события в цикле, то это детский сад. Мало того, что работа цикла будет прерываться другими потоками на неопределенное время, так еще и динамическое изменение частоты процессора сделает такой "таймер" неюзабельным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2020, 17:03 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39966261&tid=2038187]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 392ms |

| 0 / 0 |
