Схема переключения потоков, называемая "карусель".
И чем больше потоков, тем больше времени уходит на их переключение.
Так зачем же были нужны потоки до появления многоядерных процессоров?
Все просто. Многие программы выполняют несколько задач асинхронно. Даже когда вы просто листаете эту страничку в браузере, ему нужно рендерить ее, при этом не забывая своевременно обрабатывать то, что вы вводите, выполнять скрипты на странице и прочее прочее.
Казалось бы, несколько ядер должны были просто очень увеличить производительность компьютера.
Но на практике все не так хорошо. Потоки в не адаптированной для многоядерных машин программе выполняют разные задачи, с разной скоростью, и зачастую зависят друг от друга.
Вот и выходит, что горшочек не варит, а ядра простаивают.
Каким критериям должна отвечать программа, способная эффективно выполняться на многоядерной машине? Ее потоки не должны зависеть друг от друга, и иметь приблизительно одинаковую вычислительную сложность. Есть задачи, которые сравнительно легко поддаются такому препарированию, например, обработка изображений, видео, архивирование, рендеринг. С определенным оговорками, конечно. А есть и такие, с которыми приходится сильно попотеть, прежде всего это любимые многими компьютерные игры. Разработчику приходится практически с самого момента написания движка серьезно думать над его архитектурой, чтобы несколько не зависящих друг от друга потоков рисовали слаженную картинку. Не у всех выходит.
Теперь поговорим о компоновках и технологиях многоядерных CPU на десктопах. Благо, есть о чем.
Классические многоядерные процессоры появились в домашних компьютерах в 2005 году.
Опуская историю, современные процессорные ядра - это практически полноценные процессоры на одном кристалле, тем не менее, делящие некоторые общие ресурсы - память, кеши, контроллеры, и даже GPU на одном кристалле. Но с точки зрения пользователя это несущественно.
Hyper-Threading (HT).
Революционная технология от Intel, и те самые виртуальные ядра, которые все так хотят видеть в своем компьютере. На самом деле, люди часто сами вводят себя в заблуждение, считая, что двухядерный процессор будет работать как четырехядерный. На самом деле вся соль заключается в том, что каждое ядро имеет удвоенный набор регистров, два контроллера прерываний и может хранить два контекста потока одновременно. Тем самым экономится время планировщика на переключение потоков, и блоки процессора загружаются более равномерно, что иногда дает неплохое ускорение. Однако, если программа спроектирована так, что способна гибко адаптироваться к количеству ядер, вполне возможно, HT только навредит, увеличивая накладные расходы. Хотя его всегда можно отключить. Полезная штука, если вы знаете, за что переплачиваете.
Модульная архитектура AMD.
Многие ошибочно полагают, что это аналог HT от Intel, и что AMD льет нам в уши про 8 ядер в своих процессорах FX. Некоторых даже бывает крайне сложно переубедить.
На самом деле, это принципиально иная технология, впрочем, не снискавшая особой популярности. Посмотрим на блок-схему модуля:
Что здесь можно заметить? Да, на нем два целочисленных кластера, 4 блока декодирования, один FPU, общий кеш L2. Он действительно может выполнять два потока одновременно, но будет стопориться на операциях с плавающей точкой. Впрочем, немногие помнят, что когда-то FPU был отдельной микросхемой и не входил в состав CPU. Технология была довольно интересной для серверов, но на десктопах АМД подвела плохая оптимизация софта и слабый FPU, и, вероятно, они откажутся от нее в будущем поколении процессоров. Но это уже совсем другая история.
Вы прослушали краткий курс лекций по компьютерной грамотности.