Commit 2f110f4
Процессы flang поехали на настоящей BEAM: печать в Elixir и сверка по набору исходов
Процесс flang печатается в GenServer, надзор — в дерево супервизоров OTP,
почтовый ящик — в почтовый ящик процесса BEAM. Своей машины под конкурентность
не пишется: контракт (flang/conc/SPEC.md, «Свою BEAM писать не надо») решает
печатать в чужую, и вытеснение по счёту редукций, куча со своим сборщиком у
каждого процесса, планировщик на каждое ядро и горячая загрузка достаются в
настоящем виде, а не в приблизительном.
ТРИ СУПЕРВИЗОРА OTP НА ОДИН НАДЗОР FLANG — не нагромождение, а перевод. У OTP
интенсивность перезапусков принадлежит супервизору, а в flang стратегия названа
за каждым ребёнком по отдельности, и «передать выше» настройкой ребёнка не
выражается вовсе. Поэтому дети «перезапустить» живут под супервизором с порогом
отказов, дети «передать выше» — под супервизором с интенсивностью 0 (первое же
падение обязывает его перезапустить, а перезапускать нельзя — он умирает и
уносит надзор наверх), дети «остановить» — :temporary напрямую. Процесс при этом
:transient, а не :permanent: остановка «норма» обязана оставить его
остановленным. Вложенный надзор наоборот :permanent: умирает он с причиной
:shutdown, а её :transient считает нормальным концом.
«Продолжить» совпало с BEAM точно: handle_continue выполняется перед любым
сообщением из ящика, но уже после возврата обработчика — ровно «в голову ящика,
отдав управление». Притворяться не пришлось ничем.
Ящик, переживающий перезапуск, пришлось печатать руками: на BEAM он умирает
вместе с процессом, а контракт обещает обратное. Умирающий процесс вычерпывает
остаток в хранилище, следующее воплощение забирает его в init. Без этого прогон
«третий отказ в окне» дал бы один отказ вместо трёх.
Запас витков остался, и это решение, а не инерция. Вытеснение спасает соседей, а
не сам процесс: незавершающийся обработчик на BEAM не остановится никогда — он
съест память узла, и никакого исхода из этого не следует, а контракт требует
именно исхода. Счётчик при этом лежит в словаре процесса, а словарь у процесса
BEAM свой: два обработчика не мешают друг другу по устройству, а не по
договорённости.
СВЕРКА. Сравнивать значения нельзя: семантика — любое чередование атомарных
пробегов, а семени у планировщика BEAM нет. Поэтому эталон гоняется на тысяче
семян, из итогов собирается множество исходов и множество журналов доставки, и
каждый запуск на настоящей BEAM обязан в них попасть. Отдельно проверено, что
множество насыщено (половина сетки даёт тот же набор) и узко (изменение одного
числа выводит исход из набора; наборы разных прогонов не пересекаются).
Измерение, которого в контракте не было: редукционный квант BEAM много больше
пробега обработчика. На race.flang сорок запусков дают одно чередование, а
триста — четыре, и все четыре лежат в наборе эталона из 84. Значит сверка
доказывает включение, а не покрытие, и перебор семян прогоном на настоящей
машине не заменяется.
Что не влезло и записано в контракт: остальные семь целей процессов не печатают;
порог отказов у OTP считает только перезапуски одной группы, а окно измеряется
секундами, а не пробегами; таймер идёт по настоящим часам, и журнал программы с
таймером поэтому не сверяется; «покой» на BEAM — вывод из наблюдения, а не
знание; между смертью процесса и регистрацией нового воплощения есть окно, в
котором сообщение пропадает; ожидания прогона в напечатанный код не едут, потому
что они про одно чередование, а на BEAM законно любое.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P6ehGNnEcrkCK1V5iMHNYi1 parent 5bfdce0 commit 2f110f4
8 files changed
Lines changed: 2132 additions & 47 deletions
File tree
- flang
- conc
- src
- emit
- elixir
- test
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
658 | 658 | | |
659 | 659 | | |
660 | 660 | | |
661 | | - | |
| 661 | + | |
662 | 662 | | |
663 | 663 | | |
664 | 664 | | |
| |||
699 | 699 | | |
700 | 700 | | |
701 | 701 | | |
702 | | - | |
703 | | - | |
704 | | - | |
705 | | - | |
706 | | - | |
707 | | - | |
| 702 | + | |
| 703 | + | |
| 704 | + | |
| 705 | + | |
| 706 | + | |
708 | 707 | | |
709 | 708 | | |
| 709 | + | |
| 710 | + | |
| 711 | + | |
| 712 | + | |
| 713 | + | |
| 714 | + | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
710 | 728 | | |
711 | 729 | | |
712 | 730 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
671 | 671 | | |
672 | 672 | | |
673 | 673 | | |
674 | | - | |
| 674 | + | |
675 | 675 | | |
676 | 676 | | |
677 | 677 | | |
| |||
712 | 712 | | |
713 | 713 | | |
714 | 714 | | |
715 | | - | |
716 | | - | |
717 | | - | |
718 | | - | |
719 | | - | |
720 | | - | |
721 | | - | |
| 715 | + | |
| 716 | + | |
| 717 | + | |
| 718 | + | |
| 719 | + | |
| 720 | + | |
| 721 | + | |
| 722 | + | |
| 723 | + | |
| 724 | + | |
| 725 | + | |
| 726 | + | |
| 727 | + | |
| 728 | + | |
| 729 | + | |
| 730 | + | |
| 731 | + | |
| 732 | + | |
| 733 | + | |
| 734 | + | |
| 735 | + | |
| 736 | + | |
| 737 | + | |
| 738 | + | |
722 | 739 | | |
723 | 740 | | |
724 | 741 | | |
| |||
0 commit comments