Страницы

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

воскресенье, 5 января 2020 г.

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

#erlang #cpp


Вопрос несет сугубо академический характер.
Собственно:

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++ невозможно, во что мне верится с трудом.    


Ответы

Ответ 1



Будем считать, что речь идет о 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, можно сказать, никогда толком и не трогал).

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

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