Как считается загрузка процессора?
От: PaulMinelly  
Дата: 12.01.09 16:33
Оценка:
Возник вдруг такой вопрос: что такое загрузка процессора которую мы видим в виндовом Task Manager и как она узнается?

Я понимаю так: процессор в самом простом случае — это сумматор, которому на вход подаются два числа, дается инструкция что сделать с этими числами и куда записать результат. Инструкция — может быть сложение, вычитание, деление и т.п. и т.п. Возьмем простейший процессор, у которого всего одно ядро, два регистра. Который не умеет выполнять несколько инструкций за такт, а делает всего одну. Если правильно я понимаю, то такой процессор может выполняет все входящий инструкции последовательно. Такой процессор или выполняет в данный момент инструкцию, или нет. Т.е. они или загружен, или нет. Что в данном случае будет означать загрузка процессора 31% и как она высчитывается?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как считается загрузка процессора?
От: Sergey Chadov Россия  
Дата: 12.01.09 17:33
Оценка:
Здравствуйте, PaulMinelly, Вы писали:

PM>Возник вдруг такой вопрос: что такое загрузка процессора которую мы видим в виндовом Task Manager и как она узнается?


система, упрощенно говоря, выделяет каждому процессу процессорное время квантами по n миллисекунд(на самом деле не все так просто, но не будем на этом останавливаться. Если интересно — подробности у Руссиновича). Процесс может использоавть весь квант времени и тогда по его истечении система отберет у него управление или добровольно отдать управление системе до завершения кванта. Загрузка процессора для данного процесса определяется как отношение количества полностью использованных квантов времени к общему их числу на некотором промежутке.
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re: Как считается загрузка процессора?
От: Кодт Россия  
Дата: 12.01.09 18:08
Оценка:
Здравствуйте, PaulMinelly, Вы писали:

PM>Я понимаю так: процессор в самом простом случае — это сумматор, которому на вход подаются два числа, дается инструкция что сделать с этими числами и куда записать результат. Инструкция — может быть сложение, вычитание, деление и т.п. и т.п. Возьмем простейший процессор, у которого всего одно ядро, два регистра. Который не умеет выполнять несколько инструкций за такт, а делает всего одну. Если правильно я понимаю, то такой процессор может выполняет все входящий инструкции последовательно. Такой процессор или выполняет в данный момент инструкцию, или нет. Т.е. они или загружен, или нет. Что в данном случае будет означать загрузка процессора 31% и как она высчитывается?


Если планировщик обнаруживает, что ни один поток в данный момент времени не готов (все чего-то ждут), то процессор останавливается до прихода ближайшего системного сигнала (от таймера или от контроллера периферии). Хорошие процессоры имеют для этого инструкцию halt, а хорошие ОС её используют. (Windows95 не использовала, а сидела в спинлоке; специально против этого писались всякие программные кулеры, которые исполняли в низком приоритете поток с циклом, содержащим halt).

Соотношение работы и простоя в среднем, скажем, за секунду, можно посчитать и показать. 31% — значит, 310мс процессор работал, 690мс ждал.
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re: Как считается загрузка процессора?
От: subdmitry Россия  
Дата: 12.01.09 19:58
Оценка: -3 :)))
Здравствуйте, PaulMinelly, Вы писали:

PM>Возник вдруг такой вопрос: что такое загрузка процессора которую мы видим в виндовом Task Manager и как она узнается?


Винда так устроена, что обычные оконные приложения могут работать только когда к ним приходят какие-то сообщения (обрабатывать их), а когда обрабатывать уже нечего, оставшееся время Винда крутит пустой цикл. Вот длительность работы этого пустого цикла по отношению ко всему времени работы процессора и есть его незагруженность. Естественно, если какое-то приложение запустит поток, который постоянно будет что-то считать (например, архиватор сжимать какие-то данные), то свободного времени (на однопроцессорной машине) уже не остается.
And if you listen very hard the alg will come to you at last.
Re[2]: Как считается загрузка процессора?
От: Mr.Cat  
Дата: 12.01.09 20:02
Оценка:
Здравствуйте, subdmitry, Вы писали:
S>Винда так устроена, что обычные оконные приложения могут работать только когда к ним приходят какие-то сообщения (обрабатывать их), а когда обрабатывать уже нечего, оставшееся время Винда крутит пустой цикл.

У Соломона с Руссиновичем вроде что-то говорилось про процесс (или процессы? — не помню) — который крутится на минимальном приоритете и занимается всякой хренью, типа зануления данных в неиспользуемых страницах.
Re[3]: Как считается загрузка процессора?
От: subdmitry Россия  
Дата: 13.01.09 05:08
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>У Соломона с Руссиновичем вроде что-то говорилось про процесс (или процессы? — не помню) — который крутится на минимальном приоритете и занимается всякой хренью, типа зануления данных в неиспользуемых страницах.


Често говоря, подробностей устройства idle process'а в Винде не знаю, но думаю, что занулить ту пару-тройку свободных гигабайт памяти можно где-то за секунду, а дальше остается только крутить пустой цикл.
And if you listen very hard the alg will come to you at last.
Re: Как считается загрузка процессора?
От: Roman Odaisky Украина  
Дата: 13.01.09 16:36
Оценка: 35 (3)
Здравствуйте, PaulMinelly, Вы писали:

PM>Возник вдруг такой вопрос: что такое загрузка процессора которую мы видим в виндовом Task Manager и как она узнается?


Гугл молчит про Windows, поэтому расскажу лучше про Unix, наверняка в других ОС похоже. Основная юниксовая метрика — это Load Average, которая вычисляется как усредненное (с экспоненциальным скольжением) количество процессов, готовых к исполнению. Процессы в планировщике могут находиться, грубо говоря, в двух состояниях: ожидание (В/В, например) и готовность. Если средняя длина очереди больше единицы, то процессор не справляется с нагрузкой.

В отличие от других метрик, предложенных в соседних сообщениях, load average предоставляет осмысленные значения при загрузке >100%, и исходит из того, много ли еще работы процессор может исполнить (в противопоставление подсчету времени, проведенного за теми или иными инструкциями, которое само по себе нерепрезентативно).

Подробности, включая черную магию:
http://www.teamquest.com/resources/gunther/display/5/index.htm
http://www.linuxjournal.com/article/9001
До последнего не верил в пирамиду Лебедева.
Re[2]: Как считается загрузка процессора?
От: Аноним  
Дата: 13.01.09 20:29
Оценка: :))
S>Винда так устроена, что обычные оконные приложения могут работать только когда к ним приходят какие-то сообщения (обрабатывать их), а когда обрабатывать уже нечего, оставшееся время Винда крутит пустой цикл. Вот длительность работы этого пустого цикла по отношению ко всему времени работы процессора и есть его незагруженность. Естественно, если какое-то приложение запустит поток, который постоянно будет что-то считать (например, архиватор сжимать какие-то данные), то свободного времени (на однопроцессорной машине) уже не остается.

Если бы Винда крутила пустой цикл, то загрузка процессора всегда была бы 100%.
Re[3]: Как считается загрузка процессора?
От: subdmitry Россия  
Дата: 14.01.09 01:29
Оценка:
Здравствуйте, Аноним, Вы писали:

S>>Винда так устроена, что обычные оконные приложения могут работать только когда к ним приходят какие-то сообщения (обрабатывать их), а когда обрабатывать уже нечего, оставшееся время Винда крутит пустой цикл. Вот длительность работы этого пустого цикла по отношению ко всему времени работы процессора и есть его незагруженность. Естественно, если какое-то приложение запустит поток, который постоянно будет что-то считать (например, архиватор сжимать какие-то данные), то свободного времени (на однопроцессорной машине) уже не остается.


А>Если бы Винда крутила пустой цикл, то загрузка процессора всегда была бы 100%.


Это если считать загрузка процессора = процент времени, которое он работает. А если считать, что загрузка процессора = процент времени работы на нем запущенных программ и полезных функций системы, то загрузка может быть и меньше 100%.
And if you listen very hard the alg will come to you at last.
Re[4]: Как считается загрузка процессора?
От: subdmitry Россия  
Дата: 14.01.09 01:47
Оценка:
Здравствуйте, subdmitry, Вы писали:

S>Это если считать загрузка процессора = процент времени, которое он работает. А если считать, что загрузка процессора = процент времени работы на нем запущенных программ и полезных функций системы, то загрузка может быть и меньше 100%.


Разработчикам Винды, как несложно догадаться, было ближе второе определение.
And if you listen very hard the alg will come to you at last.
Re[5]: Как считается загрузка процессора?
От: PaulMinelly  
Дата: 14.01.09 03:49
Оценка:
Здравствуйте, subdmitry, Вы писали:

S>Здравствуйте, subdmitry, Вы писали:


S>>Это если считать загрузка процессора = процент времени, которое он работает. А если считать, что загрузка процессора = процент времени работы на нем запущенных программ и полезных функций системы, то загрузка может быть и меньше 100%.


S>Разработчикам Винды, как несложно догадаться, было ближе второе определение.


Сложно понять вот это: что если бы пустой цикл работал все время и грузил проц на 100% (хотя бы даже если бы винда и не показывала это в менеджере, умно этот момент вычитая) — то проц бы грелся нормально, что я бы увидел по системным алертам и по гулу вентилятора. Такого нет, выходит пустой цикл проц не грузит совсем. Более того, в длительные моменты когда я ничего не делаю — температура проца падает до 37 градусов (это с 60-то с лишним). Выходит пустой цикл вообще проц не грузит. Так? Это ведь просто наблюдения и логические рассуждения.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Как считается загрузка процессора?
От: subdmitry Россия  
Дата: 14.01.09 04:34
Оценка:
Здравствуйте, PaulMinelly, Вы писали:

PM>Сложно понять вот это: что если бы пустой цикл работал все время и грузил проц на 100% (хотя бы даже если бы винда и не показывала это в менеджере, умно этот момент вычитая) — то проц бы грелся нормально, что я бы увидел по системным алертам и по гулу вентилятора. Такого нет, выходит пустой цикл проц не грузит совсем. Более того, в длительные моменты когда я ничего не делаю — температура проца падает до 37 градусов (это с 60-то с лишним). Выходит пустой цикл вообще проц не грузит. Так? Это ведь просто наблюдения и логические рассуждения.


Честно говоря, я не знаю, какие именно энергосберегающие инструкции Винда выполняет в этом цикле. Может быть какие-то "легкие" для поцессора команды, которые его мало задействуют и греют. Может быть тот самый halt.
And if you listen very hard the alg will come to you at last.
Re[6]: Как считается загрузка процессора?
От: Sergey Chadov Россия  
Дата: 14.01.09 17:38
Оценка:
Здравствуйте, PaulMinelly, Вы писали:

PM>Сложно понять вот это: что если бы пустой цикл работал все время и грузил проц на 100% (хотя бы даже если бы винда и не показывала это в менеджере, умно этот момент вычитая) — то проц бы грелся нормально, что я бы увидел по системным алертам и по гулу вентилятора. Такого нет, выходит пустой цикл проц не грузит совсем. Более того, в длительные моменты когда я ничего не делаю — температура проца падает до 37 градусов (это с 60-то с лишним). Выходит пустой цикл вообще проц не грузит. Так? Это ведь просто наблюдения и логические рассуждения.


Ответ очень простой — винда не крутит никаких пустых циклов. Когда процессору нечем заняться винда делает ему hlt
--
Sergey Chadov

... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[7]: Как считается загрузка процессора?
От: subdmitry Россия  
Дата: 15.01.09 03:39
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>Здравствуйте, PaulMinelly, Вы писали:


PM>>Сложно понять вот это: что если бы пустой цикл работал все время и грузил проц на 100% (хотя бы даже если бы винда и не показывала это в менеджере, умно этот момент вычитая) — то проц бы грелся нормально, что я бы увидел по системным алертам и по гулу вентилятора. Такого нет, выходит пустой цикл проц не грузит совсем. Более того, в длительные моменты когда я ничего не делаю — температура проца падает до 37 градусов (это с 60-то с лишним). Выходит пустой цикл вообще проц не грузит. Так? Это ведь просто наблюдения и логические рассуждения.


SC>Ответ очень простой — винда не крутит никаких пустых циклов. Когда процессору нечем заняться винда делает ему hlt


http://www.nationmaster.com/encyclopedia/Idle-loop

"On modern processors, where a HLT (halt) instruction saves significant amounts of power and heat, the idle task almost always consists of a loop which repeatedly executes HLT instructions."

Таким образом, там есть и цикл, и hlt инструкции.
And if you listen very hard the alg will come to you at last.
Re[8]: Как считается загрузка процессора?
От: Sergey Chadov Россия  
Дата: 15.01.09 06:29
Оценка: 2 (1)
Здравствуйте, subdmitry, Вы писали:


S>"On modern processors, where a HLT (halt) instruction saves significant amounts of power and heat, the idle task almost always consists of a loop which repeatedly executes HLT instructions."


S>Таким образом, там есть и цикл, и hlt инструкции.


цикл там несомненно есть, но он далеко не пустой. Команда hlt останавливает процессор до того момента как придет прерывание(от таймера например).
Обработчик прерывания смотрит, грубо говоря, есть ли чем заняться и если нет, опять вызывает hlt.
Это все же совсем не то же самое, что "крутить пустые циклы"

Более подробно:

When no runnable thread exists on a CPU, Windows 2000 dispatches the per-CPU idle thread. Each CPU is allotted one idle thread because on a multiprocessor system one CPU can be executing a thread while other CPUs might have no threads to execute. Windows 2000 reports the priority of the idle thread as 0. In reality, however, such threads don't have a priority level because they run only when there are no threads to run. (Remember, only one thread per Windows 2000 system is actually running at priority 0—the zero page thread.) In fact, the idle loop runs at DPC/dispatch level, polling for work to do: deferred procedure calls (DPCs) to deliver or threads to dispatch to. Although some details of the flow vary between architectures, the basic flow of control of the idle thread is as follows:

Enables and disables interrupts (allowing any pending interrupts to be delivered).
Checks whether any DPCs (described in Chapter 3) are pending on the processor. If DPCs are pending, clears the pending software interrupt and delivers them.
Checks whether a thread has been selected to run next on the processor, and if so, dispatches that thread.
Calls the HAL processor idle routine (in case any power management functions need to be performed).

(с) Соломон-Руссинович
Re[9]: Как считается загрузка процессора?
От: subdmitry Россия  
Дата: 15.01.09 14:10
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:

SC>цикл там несомненно есть, но он далеко не пустой. Команда hlt останавливает процессор до того момента как придет прерывание(от таймера например).

SC>Обработчик прерывания смотрит, грубо говоря, есть ли чем заняться и если нет, опять вызывает hlt.
SC>Это все же совсем не то же самое, что "крутить пустые циклы"

Спасибо за уточнение, не знал.

Насчет исходного вопроса "как узнает?" Я так понимаю, что Винда использует инструкцию rdtsc, возвращающую количество прошедших тактов с момента старта системы, с помощью которой нетрудно очень точно узнать время исполнения временного интервала, выданного тому или иному процессу. Переключение между процессами (кроме случаев их явной сдачи полномочий посредством функций типа Sleep, GetMessage и всякими синхонизационными вроде EnterCriticalSection, WaitForSingleObject и т.д.), насколько я понимаю, делается по прерыванию таймера?
And if you listen very hard the alg will come to you at last.
Re: Как считается загрузка процессора?
От: gear nuke  
Дата: 17.01.09 08:49
Оценка:
Здравствуйте, PaulMinelly, Вы писали:

PM>Возник вдруг такой вопрос: что такое загрузка процессора которую мы видим в виндовом Task Manager и как она узнается?


Можно посмотреть исходники ReactOS base/applications/taskmgr/perfdata.c
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[2]: Как считается загрузка процессора?
От: PaulMinelly  
Дата: 22.01.09 21:51
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, PaulMinelly, Вы писали:


PM>>Возник вдруг такой вопрос: что такое загрузка процессора которую мы видим в виндовом Task Manager и как она узнается?


RO>Гугл молчит про Windows, поэтому расскажу лучше про Unix, наверняка в других ОС похоже. Основная юниксовая метрика — это Load Average, которая вычисляется как усредненное (с экспоненциальным скольжением) количество процессов, готовых к исполнению. Процессы в планировщике могут находиться, грубо говоря, в двух состояниях: ожидание (В/В, например) и готовность. Если средняя длина очереди больше единицы, то процессор не справляется с нагрузкой.


RO>В отличие от других метрик, предложенных в соседних сообщениях, load average предоставляет осмысленные значения при загрузке >100%, и исходит из того, много ли еще работы процессор может исполнить (в противопоставление подсчету времени, проведенного за теми или иными инструкциями, которое само по себе нерепрезентативно).


RO>Подробности, включая черную магию:

RO>http://www.teamquest.com/resources/gunther/display/5/index.htm
RO>http://www.linuxjournal.com/article/9001

Скажите, вот если есть достаточно быстрый процессор, есть один поток занимающийся интенсивными вычислениями. Но кэш очень медленный и обращение к кэшу занимает десять тактов. Т.е. процессор 2 такта тратит на полезные вычисления, другие 8 тактов — на доступ к кэшу (или памяти). Таким образом получается ратио количества_тактов_на_инструкцию = 4.

Скажите, будет ли показываться загрузка процессора 100% в данном случае или будет 20%?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Как считается загрузка процессора?
От: Roman Odaisky Украина  
Дата: 23.01.09 13:54
Оценка:
Здравствуйте, PaulMinelly, Вы писали:

PM>Скажите, вот если есть достаточно быстрый процессор, есть один поток занимающийся интенсивными вычислениями. Но кэш очень медленный и обращение к кэшу занимает десять тактов. Т.е. процессор 2 такта тратит на полезные вычисления, другие 8 тактов — на доступ к кэшу (или памяти). Таким образом получается ратио количества_тактов_на_инструкцию = 4.


PM>Скажите, будет ли показываться загрузка процессора 100% в данном случае или будет 20%?


100%, что означает, что процессор всё время занят.

А если запустить 5 таких потоков, то load average будет 500%.
До последнего не верил в пирамиду Лебедева.
Re[4]: Как считается загрузка процессора?
От: PaulMinelly  
Дата: 23.01.09 15:17
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, PaulMinelly, Вы писали:


PM>>Скажите, вот если есть достаточно быстрый процессор, есть один поток занимающийся интенсивными вычислениями. Но кэш очень медленный и обращение к кэшу занимает десять тактов. Т.е. процессор 2 такта тратит на полезные вычисления, другие 8 тактов — на доступ к кэшу (или памяти). Таким образом получается ратио количества_тактов_на_инструкцию = 4.


PM>>Скажите, будет ли показываться загрузка процессора 100% в данном случае или будет 20%?


RO>100%, что означает, что процессор всё время занят.


RO>А если запустить 5 таких потоков, то load average будет 500%.


Т.е. процессор занят, даже если он ничего не делает и ожидает загрузки данных из памяти?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.