5

Я знаю, смутное название вопроса, но мой главный вопрос: нужно ли одному ядру одновременно выполнять только одну программу? Работает ли "многозадачность" на уровне процессора при переключении между задачами, и если да, то почему? Почему процессоры не могут работать над несколькими задачами одновременно? У них миллиарды транзисторов, почему некоторые транзисторы не могут работать над одной проблемой, а другие работают над другой? это аппаратное ограничение или просто ограничение ОС?

4 ответа4

2

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

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

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

Технически, "программа" - это процесс, разделенный на один или несколько потоков, каждый из которых является независимым в своем исполнении, у всех них есть свой собственный стек, контекст ЦП (регистры и т.д.) И другие вещи, хотя они все еще могут взаимодействовать между собой в процессе, очевидно.

2

Классический цикл, за которым следует процессор:

Инструкция по извлечению -> Расшифровка -> Выполнение

Причина в том, что большинство проблем, которые люди исторически хотели решить с помощью компьютеров, связаны с выполнением ряда шагов, по одному за раз и по порядку, когда результат некоторых из этих шагов может повлиять на последующие шаги. С такими проблемами прыгать вокруг и атаковать его с середины, используя несколько "рабочих", не очень хорошо. Таким образом, эта модель хорошо подходит для тех типов программ, которые все еще широко распространены. (То есть, пока рендеринг трехмерной графики не стал обычным ...)

Вышеуказанная модель была оптимизирована и модифицирована за эти годы, конечно. И работа продвигается, чтобы удостовериться, что меньше ЦП простаивает с течением времени. Даже в 68000 году у вас была "конвейерная обработка", когда несколько команд фактически "в полете" в различных частях ЦП (и именно поэтому было разработано предсказание ветвления, потому что, если у вас есть несколько конвейеризованных команд, а затем придется выбросить результаты из-за ветки, вы потеряете производительность). Сегодня у вас есть дополнительные вещи, которые не позволяют процессору останавливаться или ждать чего-то, например:

  • кэш (иногда CPU не нужно ждать на медленной памяти)
  • внеочередное выполнение (переставляет извлеченные инструкции в порядок, который выполняется более эффективно)
  • переименование регистров (позволяет лучше работать вне порядка, давая инструкции своим собственным копиям регистров, в то время как другие инструкции заканчивают свою работу)

Таким образом, каждый процессор или ядро содержит несколько подсистем, которые работают вместе для интерпретации и выполнения потока команд. В некотором смысле части современных процессоров действительно работают над чем-то, а другие работают одновременно над чем-то другим.

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

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

Я думаю, что что-то вроде идеи, о которой вы говорите, было опробовано с Itanium и его архитектурой VLIW . Прочитайте эту статью в Википедии, она объясняет вещи немного лучше и более подробно, чем я пытаюсь здесь.

1

ОС может одновременно запускать ОДИН поток в одном ОДНО ядре, но как только вы узнаете, что ОС разделяет процесс на несколько потоков, прежде чем они смогут работать в Ядре, и любая современная ОС обычно работает около 100 или больше процессов, вы сможете представить, как быстро происходит переключение, если ядро работает на частоте 1 ГГц, оно будет обновляться около миллиарда раз в секунду, чтобы освободить "пространство" для выполнения предстоящими потоками.

В последнее время в процессорах Intel вы, возможно, слышали об их технологии Multi-Threading, которая позволяет ОДНОМУ ядру работать ДВУХ потоков в одно и то же время, теоретически удваивая производительность ядра.

1

Собственно часть "переключения задач" выполняет ОС. Процессор - это относительно "тупой" аппаратный элемент, который просто "хрустит цифрами". С технической точки зрения процессор не может работать более чем с одной задачей, потому что все задачи написаны в предположении, что они имеют полный контроль над процессором во время выполнения. Это частично наследие из-за необходимой обратной совместимости.

Благодаря многоядерному процессору доступно более одного "полного процессора", поэтому более чем у одной программы на данный момент может быть доступен "полный процессор", поэтому они могут выполняться одновременно.

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