Co sprawia, że ​​Erlang nadaje się do miękkich aplikacji w czasie rzeczywistym?

Jakieś tło

Pracuję nad budowaniem języka programowania do programowania mediów cyfrowych, który powinien obsługiwać współbieżność przy przekazywaniu wiadomości bez udostępniania i miękkim czasie rzeczywistym (tj. Staraj się obliczać audio / wideo bez utraty próbek lub klatek i przy stałej przepustowości) .

Okazuje się, że obie te funkcje są zaskakująco trudne do połączenia, głównie z powodu jednego szczególnego ograniczenia: kod czasu rzeczywistego nie powinien dynamicznie przydzielać pamięci.

Mój język powinien ułatwić wdrożenie czegoś takiego:

Jeden wątek oblicza próbki audio na podstawie parametrów. Mogą to być na przykład wartości różnych elementów sterujących syntezatorami. Ten wątek działa „w czasie rzeczywistym”.Jeden wątek otrzymuje dane wejściowe od użytkownika lub z innego komputera w celu zmiany tych wartości. Może to być na przykład wątek GUI, reagujący na przekręcenie pokrętła za pomocą myszy.

Chcę, aby nowe wartości ustawione przez użytkownika były przesyłane przez kolejkę do silnika syntezatora. Teraz problem nie byłby interesujący, gdybym chciał wysłać tylko pływaki i inne wartości atomowe. Właściwie to chcękażdy rodzaj danych umożliwiających przepływ z jednego wątku do drugiego, nawet złożonego obiektu lub struktury danych, co powinno być możliwe dla dowolnej konfiguracji wątków i priorytetów. Bez dynamicznej alokacji pamięci w czasie rzeczywistym staje się to bardzo trudne bez nakładania na programistę czegoś, co wydaje się być arbitralnym ograniczeniem.

Erlang jest często reklamowany jako dobre dopasowanie do systemów czasu rzeczywistego. Rozumiem, że Erlang nigdy jednak nie zabrania przydziału pamięci. Gdybym zrobił to samo, sprawiłoby, że wiele problemów zniknęłoby kosztem wprowadzenia niedeterministycznego taktowania w kodzie, który dokonuje tych alokacji.

Pytanie

Co zatem sprawia, że ​​Erlang jest tak dobrze dopasowany? Czy wdraża specjalne sztuczki, aby ominąć problemy wywołane przydziałem pamięci, czy też całkowicie ignoruje problem? Czy wymaga innego podejścia do czasu rzeczywistego?

Przykład ilustrujący pytanie

Załóżmy, że piszemy syntezator w Erlang, który musi produkować 64 próbki co 50 milisekund, w przeciwnym razie w dźwięku słychać pęknięcia i trzaski. Załóżmy również, że gdy przesuję suwak wokół łańcucha, mały obiekt (powiedzmy, że jest to lista lub krotka zawierająca nazwę parametru i nową wartość) musi zostać wysłany z procesu GUI do procesu audio, gdzie kopia jest tworzona. Wymagałoby to dynamicznej alokacji pamięci. Jak Erlang pomógłby mi upewnić się, że ta alokacja nie opóźnia mojego obliczenia audio?

questionAnswers(4)

yourAnswerToTheQuestion