С 1970 по 2002 год производительность процессоров удваивалась примерно каждые 18 месяцев. Поэтому, как программисту, все, что вам нужно было сделать, это ждать, и ваша программа будет работать быстрее. Проблема в том, что примерно в 2002 году правила изменились. Теперь они не делают большие быстрые процессоры, они делают меньшие более медленные процессоры, а раздают их по группам. Компьютер, на котором я сейчас работаю, имеет 4 ядра, и существуют чипы с 8 ядрами (и 4 потоками на ядро). Достаточно скоро у нас появятся чипы с гораздо большим количеством ядер.
Так что, если вы напишите программу, которая не является одновременно параллельной, вы обнаружите, что вы используете 1 ядро или поток, но остальная часть CPU сидит там и ничего не делает. Так что, если у вас 16 ядер, 1 будет запускать вашу программу, а остальные 15 будут сидеть там!
Проблема с параллелизмом заключается в том, что он недетерминирован. То есть вы не знаете точно, в каком порядке будут работать разные потоки. Традиционно программисты пытались решить эту проблему с помощью блокировок и тому подобного. Это привело к МНОГО боли. Наличие некоторой формы изменчивого состояния, к которому более чем один поток может получить свободный доступ, часто является формулой боли и неприятных ошибок!
В последнее время наблюдается тенденция к переходу на функциональные языки, которые жестко контролируют изменяемое состояние. Есть два основных способа, которыми функциональные языки обрабатывают параллелизм. Первый - с помощью передачи сообщений. Это лучше всего показывает Эрланг. В Erlang вообще нет общего состояния между процессами. Они общаются не разделяя память, а мои мимолетные сообщения. Это должно иметь смысл для вас, поскольку мы делаем это прямо сейчас. Я посылаю вам эту информацию, отправляя вам сообщение, а не вспоминая его из моего мозга! При переключении на передачу сообщений большинство блокирующих ошибок просто исчезают. Кроме того, сообщения могут передаваться как по сети, так и внутри одного узла.
Другим методом является STM, который обозначает программную транскрипционную память, которая присутствует в clojure и Haskell (и других). В STM память разделяется, но изменения могут быть сделаны только через транзакцию. Поскольку люди из базы данных выяснили все эти вещи в 1970-х годах, довольно легко убедиться, что мы правильно поняли.
На самом деле я немного упростила, Clojure и Haskell могут выполнять передачу сообщений, а Erlang может выполнять STM.
Отказ от ответственности Я являюсь автором веб-службы программирования с Erlang , которая будет выпущена в раннем выпуске в ближайшие несколько недель.