Size: a a a

WebAssembly — русскоговорящее сообщество

2020 May 11

lp

lil pep in WebAssembly — русскоговорящее сообщество
самое главное не делать предположения что все что от __heap_base до memory.size во владении этого аллокатора ))
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
дада
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
чтобы каждый запомнил текущий memory.size
не обязательно его запоминать
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
ну разницу точнее, чтобы запомнить
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
потому что разница - это количество доступного места
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
есть два случая:

1. __heap_base до __heap_base.round_up_one_page()
2. это новую страницу
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
ее можно высчитать всегда по heap_base
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
ну да, можно сделать как ты сказал, но лучше сразу несколько васм страниц выделить
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
да можно и так. Тут уже хозяин барин
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
т.е. я бы сделал алгоритм инстанцирования памяти нового модуля примерно так:
1. Выставляем heap_base равный memory.size (считаем, что если других модулей нет, то memory.size вернёт __data_end).
2. Аллокатор модуля инициализируется и сам сдвигает memory_limit на N (параметр аллокатора) страниц

Далее если места не хватает, то аллокатор берёт запоминает текущий memory.size и выполняет memory.grow  с числом T (второй параметр) и добавляет это в список своих регионов (то, что в dlmalloc называется mstate) и т.д. до тех пор, пока память не закончится. И это всё работает хорошо в одном потоке.
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
а как memory.size может вернуть __data_end , если __data_end байты, а memory.size - страницы?
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
мы выставляем heap_base на препроцессинге васм кода же
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
а там можем всё, что угодно сделать
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
помимо стека ещё проблема и в куче будет, если менеджер кучи вкомпилирован в каждый модуль. Можно сделать malloc/free/... импортируемыми и загрузить третий модуль, который будет отвечать за управление кучей и экспортировать malloc/free/...
кстати, интересно в контексте этого подхода - в васмтайм насколько большой оверхед для вызова функций из другого модуля?
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
самый маленький оверхед, который я видел, был в asmble: там всё компилировалось в jvm классы и вызов функции из другого модуля - это просто вызов функции из другого jvm класса.
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
ну все относительно
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
в wasmtime сейчас впринципе довольно неэффективная calling convention
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
вот в васмере оверхед сравнительно большой
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
но оверхеад поверх этого не слишком большой
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
lil pep
в wasmtime сейчас впринципе довольно неэффективная calling convention
а в чём она заключается? есть, где почитать кроме исходников?
источник