Страницы

Поиск по вопросам

понедельник, 4 февраля 2019 г.

Как именно реализованы процессы в Erlang?

Вопрос несет сугубо академический характер. Собственно: Erlang is designed for massive concurrency. Erlang processes are light-weight (grow and shrink dynamically) with small memory footprint, fast to create and terminate and the scheduling overhead is low. Какие условия должны соблюдаться для того, что-бы было возможно реализовать подобную модель, какое API используется? В общем - как реализовать такого рода поведение средствами C/C++ или других языков? В первую очередь интересует не код, а теория. PS: Когда-то гуглил на эту тему, но, к моему большому удивлению, толкового ответа не нашел. Более того - многие писали о том, что реализовать подобную модель средствами С/C++ невозможно, во что мне верится с трудом.


Ответ

Будем считать, что речь идет о BEAM, потому что, вообще говоря, у Erlang была богатая история Начиная с R13 (см. презентацию Ульфа Вигера, стр. 19), при условии, что BEAM собрано с поддержкой SMP, создается несколько шедулеров (число определяется опцией +S, как они соотносятся с логическими процессорами определяется флагом +sbt), у каждого есть своя очередь процессов. Процесс — всего лишь структура данных, включающая в себя собственную независимую кучу, стек (даже два, в случае с HiPE, см. стр.4) и все положенные процессу регалии (мейлбокс, словарь процесса, тысячи всякого). Собственно, структуру struct process можно посмотреть в исходниках BEAM, в файле erl_process.h И, к вопросу многозадачности — шедулер реализует вытесняющую многозадачность, раз в определенное число редукций (по сути, операций) переключаясь на другой процесс. Какой-нибудь драйвер, как честно предупреждает документация — «this means that all operations in the driver must be non-blocking, and that any crash in the driver will bring the whole emulator down» — может завесить поток или вообще уронить всю VM. Вот, собственно, и все, вроде бы, если не лезть во всякие тонкости и детали (которых я и сам не шибко в курсе, т.к. потроха BEAM, можно сказать, никогда толком и не трогал).

Комментариев нет:

Отправить комментарий