Тактовая частота современных процессоров перестала расти из-за физических ограничений. И теперь для того, чтобы нарастить мощность программного комплекса требуется использование нескольких процессоров одновременно. В принципе этот способ совершенно не нов и история объединения нескольких процессоров в единый комплекс длинная. Я не слышал про использование многопроцессорных систем в 50-х годах прошлого века, но уже в 60-х вопрос стоял в полный рост.

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

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

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

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

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