Size: a a a

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

2020 May 11

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
lil pep
ванильная вм
Но аллокатор-то нужно пропатчить именно тот, который в ВМ — нет?
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
Alexander Tchitchigin
Но аллокатор-то нужно пропатчить именно тот, который в ВМ — нет?
погоди, не сбивай)
источник

AT

Alexander Tchitchigi... in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
погоди, не сбивай)
Блин, похоже действительно сбил... 😞
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
кароче, давайте ребята придумаем как бы мы могли бы простой wasm аллокатор сделать, который бы можно было бы использовать в васм любом васм бинарике

аллокатор совсем простой, вроде бамп аллокатора

у нас была бы функция malloc(size)

эта функция бы проверяла бы сколько места осталось до конца текущего доступного пространства. При инитиализации это было бы от heap_base до конца страницы. Если места хватает для аллокации размером size - мы увеличиваем bump ptr, и возвращаем его предыдущее значение.
Если места не хватает - мы запрашиваем новую страницу при помощи memory.grow и обновляем данные о доступном пространстве ) Считаем что места хватает и увеличиваем bump pr и возвращаем его предыдущее значение
источник

lp

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

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
ага, ты про васм страницы, я подумал про системные. Кажется, что так можно сделать - в dlmalloc как раз есть удобная но неиспользуемая сейчас абстракция. Тогда при расширении каждого аллокатора нам не нужен bump ptr, нужно просто от текущего memory.size считать. А memory.size учтёт размер всех остальных областей других аллокаторов.
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
lil pep
по моей информации обычно malloc приводит к mmap
в ptmalloc (т.е. в libc) mmap происходит, если аллоцируемый размер превышает параметр MMAP_THRESHOLD. И mmap нужны для mmap областей других арен, но там сразу выделяется много памяти, чтобы работать по принципу top chunk, т.е. не каждый запрос mmap. Вообще аллокатор можно воспринимать как кеш для оптимизаций количества вызовов mmap/brk/madvice.
источник

lp

lil pep in WebAssembly — русскоговорящее сообщество
bump ptr я ввел только потому что это bump allocator )
источник

lp

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

lp

lil pep in WebAssembly — русскоговорящее сообщество
echo 'int main(int argc, char** argv) { printf("%p\n", malloc(128)); }' | clang -x -g c - ; strace -k ./a.out
источник

lp

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

lp

lil pep in WebAssembly — русскоговорящее сообщество
Mikhail Voronov
в ptmalloc (т.е. в libc) mmap происходит, если аллоцируемый размер превышает параметр MMAP_THRESHOLD. И mmap нужны для mmap областей других арен, но там сразу выделяется много памяти, чтобы работать по принципу top chunk, т.е. не каждый запрос mmap. Вообще аллокатор можно воспринимать как кеш для оптимизаций количества вызовов mmap/brk/madvice.
ну вот да, именно поэтому я говорил разделение больших блоков на маленькие
источник

MV

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

lp

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

lp

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

lp

lil pep in WebAssembly — русскоговорящее сообщество
самое главное что он может до-заполнить первую страницу, а потом аллоцировать новую
источник

MV

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

lp

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

MV

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

MV

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