5

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

Для простоты давайте предположим, что машина с одним ЦП, и предположим, что ЦП является единственным релевантным ресурсом.

Теперь у нас есть два разных процесса, работающих на нашем одном ЦП на 64-битной машине с Windows 7 с одинаковым приоритетом ЦП. Мы будем называть их P1 и P2 . И P1 и P2 используют по 20% ЦП каждый.

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

  2. Если ответ на вопрос 1. да: в какой момент они начнут мешать друг другу?
    Будут ли они создавать помехи друг другу только после того, как они попытаются использовать более 50% общей мощности ЦП, или же они начнут мешать гораздо раньше по какой-либо причине?

  3. Будут ли отличаться ответы на предыдущие вопросы, если речь идет о более чем двух процессах или процессах разного типа (например, с несколькими потоками в каждой), и как они будут различаться?

1 ответ1

7

Игнорирование накладных расходов от других процессов (вы пометили Windows 7). Ядро будет ставить в очередь каждый поток в том порядке, в котором они готовы. Там намного больше, но это основной смысл.

Каждая программа будет делать много вещей, например, выполнять чтение или запись на диск или в память, каждая из которых является ее собственной задачей. Если каждый процесс когда-либо будет использовать только 20% процессора; P1 выполнит одну задачу, затем P2 выполнит одну. Если P2 становится готовым первым во втором раунде, P2 запускает один, а затем P1 . Это будет продолжаться до тех пор, пока каждый не завершит работу и не завершится.

Теперь использование процесса на 100% означает, что каждое измеренное время (в данном примере 1 секунда), поэтому каждую секунду процессор ВСЕГДА занят, и он всегда вычисляет. В вашем примере 40% использования каждую секунду процессор работает, делая расчеты, в течение 400 миллисекунд. Таким образом, через 10 секунд процессор находился в режиме ожидания всего 6 секунд. (Игнорируя другие программы и накладные расходы)

  1. Эффективно да. Если вы выполняете только один запуск за раз, накладные расходы на переключение вперед и назад не будут применяться, но если процессор только на 40%, это не проблема.

  2. Если бы каждой программе требовалось 100% процессора, вы заметили бы некоторое время задержки для переключения вперед и назад. Помните, одно ядро действительно может делать только одну вещь за один раз, кажется, что оно делает больше, потому что оно очень быстро переключается вперед и назад. Каждый при 50% плюс около 0,01% накладных расходов означает 100,01%, поэтому вы будете "ждать" 10 миллисекунд.

  3. Да, во вступлении у каждой программы было несколько задач, причем с несколькими потоками каждая задача, которую должна была выполнить программа (чтение, а затем запись), быстрее попадала в очередь, поэтому время ожидания было бы меньше, и вы бы быть в состоянии упаковать 40% загрузки ЦП в первые 400 миллисекунд, вместо того, чтобы включать время ожидания, заставляющее работу распределяться примерно на 600 миллисекунд. Это фактически то же самое с большим количеством программ, есть больше накладных расходов для каждой, но это все еще незначительно. (Если вы не попадаете в системы реального времени.)

Опять же, это супер общее, но более или менее то, как несколько программ используют один процессор. Проблемы возникают, когда логика / программа / планировщик не справляются с упорядочением очереди задач, это приводит к большим издержкам, чем больше накладных расходов, тем больше время ожидания, поэтому даже если вашей программе требуется только 40% каждая, накладные расходы на переключение вызовут 30% больше времени на переключение задач или ожидание.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .