четверг, 18 июня 2015 г.

Модели паралельного программирования в разных языках

C/C++ - нативный подход, используются механизмы многопоточности предоставляемые ядром.

JDK     - по-умолчанию потоки виртуальной машины мапятся  на нативные потоки ОС 1:1, но можно переключить JVM на зеленые потоки - реализацию JDK, которая работатет по факту только в одном системном потоке по-очередно переключаясь между потоками виртуальной машины, симулируя многопоточность, иногда за счет економии на переключениях на уровне ядра, это может быть оправдано.

Python - (CPython) хоть и используется манипулирование нативными потоками, но в этот момент происходит GIL(Global Interpreter Lock), что означает, что в одно и тоже время, только один поток может использовать интерпретатор питона для выполнения его команд, при истечении лимита команд на один поток, происходит переключение на другой. Поэтому паралельной работы в одно и тоже время не происходит. В питон подключаются библиотеки Си, они чаще всего потоконебезопасны, поэтому подход с GIL пытается это обезопасить. В рамках проекта PyPy (в котором компилятор питона пишется на самом питоне) пытаются реализовать модель "Транзакционной памяти"(Software Transactional Memory, SТМ). На данный момент даже в многопоточных вычислениях интерпретатор с STM работает в разы медленней, чем с GIL. Но за счёт JIT PyPy-STM всё равно быстрее, чем CPython.

Erlang - реализут в многопоточности модель "ничего общего"(shared nothing), используются микропроцессы(юзерспес виртуальной памяти), а не потоки, что очень быстро.


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

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