В чем разница между многоядерным программированием на Erlang и других языках? - PullRequest
17 голосов
/ 13 марта 2009

Я прочитал теорию Джо Армстронга 'Программирование на Erlang' , и теорию 'n раз быстрее в n ядро' Эффективный способ многоядерного программирования в Erlang - это использование множества процессов (потоков).

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

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

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

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

Ответы [ 5 ]

25 голосов
/ 13 марта 2009

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

Операционные системы были специально разработаны таким образом, чтобы каждый «пользователь» думал, что у него есть целый компьютер, поэтому вы запускаете apache как пользователь wwwrun , например.

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

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

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

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

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

Если Эрланг отличается от других, это во многих отношениях. Докторская диссертация Джо Армстронга называется Создание надежных распределенных систем при наличии программных ошибок .

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

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

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

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

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

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

15 голосов
/ 13 марта 2009

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

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

3 голосов
/ 13 марта 2009

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

2 голосов
/ 13 марта 2009

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

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

Редактировать : Отличная презентация о разнице между Erlang и C ++ - Erlang в 2,5 раза выше максимальной производительности, в 3 раза меньше задержки и в 18 раз меньше SLOC - я предполагаю, что разработчики Motorola имеют опыт работы на C ++ достаточно, чтобы написать хорошее программное обеспечение.

1 голос
/ 13 марта 2009

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

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

...