Какова именно нагрузка на ЦП, если инструкции выполняются по очереди?

Я знаю, что этот вопрос задавали много раз по-разному, но мне все еще не ясно, что означает процент загрузки процессора.

Я начну объяснять, как я воспринимаю эти концепции сейчас (конечно, я могу и наверняка ошибаюсь):

  • Ядро ЦП может выполнять только одну инструкцию за раз. Он не выполнит следующую инструкцию, пока не закончит выполнение текущей.
  • Предположим, в вашей коробке один процессор с одним ядром. Следовательно, параллельные вычисления невозможны. Планировщик вашей ОС выберет процесс, установит IP для точки входа и отправит эту инструкцию в ЦП. Он не перейдет к следующей инструкции, пока ЦП не закончит выполнение текущей инструкции. Через некоторое время он переключится на другой процесс и так далее. Но он никогда не переключится на другой процесс, если ЦП в настоящее время выполняет инструкцию. Он будет ждать, пока процессор не освободится, чтобы переключиться на другой процесс. Поскольку у вас есть только одно ядро, у вас не может быть двух процессов, выполняющихся одновременно.
  • Ввод-вывод стоит дорого. Всякий раз, когда процесс хочет прочитать файл с диска, он должен ждать, пока диск не выполнит свою задачу, и до этого момента текущий процесс не может выполнить свою следующую инструкцию. ЦП ничего не делает, пока диск работает, и поэтому наша ОС переключится на другой процесс, пока диск не завершит свою работу, чтобы не тратить время зря.

Следуя этим принципам, я пришел к выводу, что загрузка процессора в определенный момент времени может быть только одним из следующих двух значений:

  • 0% - холостой ход. CPU вообще ничего не делает.
  • 100% - занято. ЦП в настоящее время выполняет инструкцию.

Это явно неверно, поскольку taskmgr сообщает о значениях использования ЦП% 1, 12%, 15%, 50% и т. Д.

  • Что означает, что данный процесс в данный момент времени использует 1% заданного ядра ЦП (по данным taskmgr)? Что происходит с 99%, пока этот процесс выполняется?
  • Что это означает, что общая загрузка ЦП составляет 19% (по данным Rainmeter на данный момент)?

person Ander Juaristi    schedule 13.01.2014    source источник
comment
Ядро ЦП может выполнять только одну инструкцию за раз. Он не выполнит следующую инструкцию, пока не закончит выполнение текущей. Это неверно. Введите суперскаляр в свою любимую поисковую систему.   -  person David Schwartz    schedule 30.10.2017


Ответы (2)


Если вы посмотрите в диспетчер задач в Windows, есть Idle process, который делает именно это, он просто показывает количество циклов, не выполняющих ничего полезного. Да, ЦП всегда занят, но он может просто зацикливаться, ожидая появления полезных вещей.

Поскольку у вас есть только одно ядро, у вас не может быть двух процессов, выполняющихся одновременно.

Это не совсем так. Да, настоящий параллелизм невозможен с одним ядром, но вы можете создать его иллюзию с помощью вытесняющей многозадачности. Да, невозможно прервать инструкцию, но это не проблема, потому что большинство инструкций требует крошечного времени для завершения. ОС разделяет время с временными интервалами, которые значительно длиннее, чем время выполнения отдельной инструкции.

What does it mean that a given process, at a given time, is utilizing 1% of a given CPU core

В большинстве случаев приложения не делают ничего полезного. Подумайте о приложении, которое ждет, пока пользователь нажмет кнопку, чтобы начать что-то обрабатывать. Этому приложению не требуется ЦП, поэтому оно большую часть времени спит или каждый раз, когда получает временной отрезок, оно просто переходит в спящий режим (см. цикл обработки событий в Windows). GetMessage блокируется, поэтому это означает, что поток будет спать, пока не придет сообщение. Так что же на самом деле означает загрузка процессора? Итак, представьте, что приложение получает какие-то события или данные, чтобы что-то делать, оно будет выполнять операции, а не спать. Таким образом, если оно использует X% процессора, это означает, что за период выборки это приложение использовало X% процессорного времени. Использование времени ЦП - это средний показатель.

PS: Чтобы обобщить понятие загрузки процессора, подумайте о скорости (с точки зрения физики). Существуют мгновенные и средние скорости, поэтому, говоря о загрузке процессора, есть также мгновенные и средние измерения. Мгновенное значение всегда равно 0% или 100%, потому что в какой-то момент процесс либо использует ЦП, либо нет. Если процесс использовал 100% ЦП в течение 250 мс и не использовал следующие 750 мс, то мы можем сказать, что процесс загружал ЦП на 25% с периодом выборки в 1 секунду (среднее измерение может быть применяется с определенным периодом выборки).

person Andrey    schedule 13.01.2014

http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages

Одноядерный процессор подобен единственной полосе трафика. Представьте, что вы оператор моста ... иногда ваш мост настолько загружен, что машины выстраиваются в очередь, чтобы перейти. Вы хотите, чтобы люди знали, как движется трафик на вашем мосту. Достойным показателем будет количество автомобилей, ожидающих в конкретное время. Если машины не ждут, прибывающие водители знают, что могут сразу проехать. Если машины поддерживаются, водители знают, что их ждут задержки.

Это в основном загрузка процессора. «Машины» - это процессы, использующие часть времени ЦП («переход через мост») или стоящие в очереди для использования ЦП. В Unix это называется длиной очереди выполнения: сумма количества запущенных в данный момент процессов плюс количество ожидающих (поставленных в очередь) запуска.

См. Также: http://en.wikipedia.org/wiki/Load_(computing)

person mustafa.0x    schedule 13.01.2014
comment
Как он отвечает на вопрос о состояниях простоя? - person Andrey; 13.01.2014
comment
Да, CPU может (теоретически) простаивать. - person mustafa.0x; 13.01.2014