Я читал много о том, как Scala и Erlang делают легкие потоки и их модель параллелизма (агенты).
Однако у меня есть свои сомнения.
Scala и Erlang используют подход, подобный старой модели потока, используемой Java (зеленые потоки)?
Например, предположите, что существует машина с 2 ядрами, таким образом, среда Scala/Erlang разветвит один поток на процессор? Другие потоки будут запланированы пространством пользователя (Scala VM / Erlang VM) среда. Это корректно?
Под капотом, как это действительно работает?
Erlang использует многозадачность в пространстве пользователя, задачи выполняются до тех пор, пока они не заблокируются или пока они не израсходуют свою долю "сокращений". Редукция нечетко определяется как единица вычисления.
До появления SMP-планировщика существовал только один поток ядра, принимающий выполняемые задачи. С SMP-планировщиком у вас есть несколько потоков ядра, принимающих задания и, таким образом, выполняющих код параллельно на многоядерных машинах. Количество потоков планировщика должно соответствовать количеству ядер. См. переключатель -smp [enable|auto|disable]
в manpage erl.
Также был создан пул потоков ядра для загружаемых драйверов для выполнения блокирующих системных вызовов. Он называется пулом асинхронных потоков. См. +A size
в manpage erl.
Дальнейшее чтение
Для получения последней информации о деталях реализации Erlang проверьте свежий доклад ( слайды ]).
Scala 2.8 использует пулы потоков Java. Облегченные акторы ( Reactor
) и более тяжелые акторы в облегченном режиме ( react {...}
) не используют свой собственный поток; скорее, когда у них есть сообщение, они берут поток, пока не закончат обработку сообщения, затем возвращают поток и не запускаются вообще, пока не появится следующее сообщение.
Эта статья дает достойное описание Актеров в 2.7; 2.8 ничем не отличается.
Scala использует базовую реализацию потока Java, которая использует собственные потоки .
Не могу сказать об Эрланге.