Подтвердить что ты не робот

В чем разница между многоядерным программированием в Erlang и другим языком?

Я прочитал Joe Armstrong "Программирование Erlang" и "n раз быстрее в теории n основных машин". Эффективный способ многоядерного программирования в Erlang - использовать множество процессов (потоков).

Я программист на С++, поэтому мне интересно узнать разницу между созданием большого количества потоков на С++ и большим количеством процессов в Erlang. Я понимаю, что работа с потоками в C/С++ не так проста. Также я знаю, что блокировка/разблокировка замедляет работу системы. Но это не невозможно, верно?

Итак, почему Эрланг - дружелюбный язык muticore? Это просто потому, что легко программировать?

Я делаю онлайн-сервер для MMORPG, поэтому меня интересует Erlang как альтернативный серверный язык.

(Я уже читал этот вопрос, но я думаю, что это не тот вопрос, который я ищу.)

4b9b3361

Ответ 1

Нет, это не невозможно, но Эрланг делает это намного проще. Ключ не разделяет состояние между процессами. Эрланг достигает этого благодаря тому, что он является функциональным языком. Функция не должна иметь побочных эффектов и не должна обращаться к любому состоянию переменной (кроме аргументов, переданных в стек). С помощью этих свойств вычисление любой функции в системе может быть перенесено на другой процессор с отдельным пространством памяти, и Erlang сделает это за вас. Erlang нужно только реплицировать аргументы функции и результаты между пространствами памяти (обратите внимание: это не подходит для всех видов приложений... функция, которая должна работать в очень большом объеме входного состояния, может представлять производительность проблемы при копировании этого состояния).

Наивное использование потоков в приложении С++ может иметь разные процессоры (в многоядерной системе), пытающиеся одновременно получить доступ к одной и той же общей памяти. Затем система должна выполнить большую работу, чтобы убедиться, что локальные кеши, связанные с каждым ядром, остаются неизменными. Здесь вы можете столкнуться с огромными хитами производительности. У нас есть приложение на работе, которое ухудшает производительность, когда по этой причине у вас больше двух ядер. Фактически, я бы зашел так далеко, чтобы сказать, что вам будет лучше разрабатывать приложения, чтобы использовать только потоки, где вам нужно делать асинхронные операции ввода-вывода, но там, где вам нужно, чтобы процессы выполняли реальную работу и не блокировались для I/O, используйте полные процессы. Используя полные процессы, вы гарантируете, что каждый процесс имеет собственное пространство памяти, и ни один из двух потоков не будет использовать одну и ту же память одновременно (конечно, тогда вам нужно придумать хороший способ общения между этими процессами). Благодаря такой системе и дисциплине вокруг управления состоянием и распределением обработки вы могли бы добиться аналогичных результатов, которые предоставляет Erlang, но вам нужно сделать много объектов инфраструктуры, которые Erlang уже делает для вас.

Ответ 2

Это сводится к потокам и процессам.

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

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

Процессы - это зрелая парадигма (мой процесс не может разрушить ваш). Когда мы начинаем видеть потоки, все начинает сильно отличаться. Здесь у нас есть программы, которые имеют внешние блокирующие действия (ожидание на диске, ожидание io, ожидание в памяти), которые хотят быть в состоянии ждать, с одной стороны, и работать над другим, а потоки позволяют вам это сделать и преодолевать две проблемы:

  • вы не можете получить достаточное количество процессов, потому что операционная система не может его обрабатывать

  • каждый процесс дорог, потому что он дает пользователю полную мощность операционной системы

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

В тех случаях, когда Эрланг отличается от других, существует ряд замечаний. Joe Armstrong PhD Thesis называется Создание надежных распределенных систем при наличии ошибок в программном обеспечении.

Надежность означает, что процессы лучше, чем потоки. Проблема в том, что процессы в операционной системе слишком дороги, потому что они предназначены для людей (у вас есть машина), а не для одновременных модулей. В VM Erlang VM обладает всеми возможностями многопользовательской системы (она работает в процессе операционной системы), и каждый процесс Erlang имеет гораздо меньший квант параллельной мощности - если он хочет использовать "большую машину" разговаривает с VM, которая делает это за это. Таким образом, процессы Erlang намного дешевле, чем рабочие процессы (и потоки). Вы просто порождаете, икру, икру. Из коробки Erlang VM начинаются с 2 ** 8 процессов, но вы можете увеличить ее до миллиона (если у вас достаточно ОЗУ).

Кроме того, как Джо поставил его в первой части первого раздела своей кандидатской диссертации, чтобы иметь надежное программное обеспечение, которое нужно начинать с двух компьютеров. С Erlang/OTP во время записи вы не знаете, на каком компьютере будет работать ваше программное обеспечение. Кластер Erlang/OTP во время выполнения выделит вашу вычислительную работу. Таким образом, процесс Erlang является нативным, а iswn() (Erlang for fork()) и повторяет семантику.

Поскольку у Erlang есть свои собственные процессы, у него есть свой собственный планировщик и его собственный загрузчик/двоичный формат кода (Erlang может быть интерпретирован или он может скомпилировать исходные двоичные файлы). Это дает дополнительный выигрыш - перед тем, как вы напишете свое приложение Erlang/OTP, он уже может "горячую" замену своих двоичных файлов и т.д. И т.д.

Итак, вы можете писать многопоточные приложения на С++, но вы несете ответственность за предотвращение распространения ошибок и создание стабильности системы.

И конечно, вы можете создать надежное программное обеспечение в C - посмотреть на Erlang (VM написано на C), почему именно вы хотите? В прежние времена компании писали свои собственные "операционные системы", теперь вы можете написать свою собственную операционную систему, но зачем вам это нужно? Есть миллионы строк надежного проверенного кода, который "делает это", точно так же, как в системе Erlang/OTP есть 1,5-миллиметровые строки надежного тестируемого кода, который "делает это".

Использование Erlang - это использование тех вещей, которые были написаны другими людьми, и создания только битов, которые делают вашу компанию эффективной.

Ответ 3

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

Ответ 4

Гордон Гатри ответ отлично. Где большая разница - это личное предпочтение. С моей точки зрения, большая разница в Erlang - надежность и масштабируемость. В Erlang вы можете создавать параллельные процессы естественным образом без больших проблем с производительностью, и это будет масштабируемо масштабируемым распределяемым. Есть ловушки в больших сообщениях, и поэтому, но в большинстве случаев ваш дизайн будет изящным и хорошо работает без особого ухода. Когда ваш дизайн элегантен, вы делаете меньше ошибок, он будет лучше управляемым, и, кстати, вы можете распределять и масштабировать с минимальными усилиями, и результат будет надежным.

Чтобы быть кратким, в Erlang вы можете проектировать свою программу иначе, чем на С++, потому что вы можете сделать это без большой проблемы с производительностью и promises хорошей масштабируемостью и надежностью без больших усилий. Никто не идеален, но для интересного большого количества задач Эрланг - лучший выбор.

Изменить: Nice презентация о разнице между Erlang и С++ - Erlang 2.5x больше максимальной производительности, в 3 раза меньше латентность и на 18 раз меньше SLOC - я полагаю, что разработчики Motorola имеют опыт работы на С++, чтобы писать хорошее программное обеспечение.

Ответ 5

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

Я не знаю много о erlang помимо этих двух фактов, так что может быть и что-то еще. Но это не означает, что вы не можете сделать С++-программу масштабируемой, но вы, вероятно, пройдете много для достижения производительности, масштабируемости и стабильности, которые принесут без затрат, если вы напишете в erlang.