Эффективное управление памятью с JIT? - PullRequest
0 голосов
/ 18 ноября 2018

Я пишу программу, которая выполняет JIT, и в настоящее время я настраиваю исполняемую память следующим образом:

void *mem = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
// write the JIT output to mem
mprotect(mem, len, PROT_READ|PROT_EXEC);

Затем я очищаю ее так:

munmap(mem, len);

Это довольно неэффективно, так как я выделяю целую страницу (4 КБ) для всего, что я JIT, большинству из которых требуется всего несколько байтов.(Обратите внимание, что меня больше беспокоит количество отображений страниц и, возможно, падение на vm.max_map_count, чем просто необработанный объем используемой оперативной памяти.) Для регулярного выделения памяти malloc позаботится об этом, обернув (s)brkи mmap и отслеживание того, какие части страницы используются.Я, очевидно, не могу просто использовать malloc, потому что он выделяет неисполняемую память.Есть ли простой способ получить подобное поведение при выделении исполняемой памяти, или мне придется использовать пользовательскую замену для malloc, чтобы сделать это?

...