https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/
Теоретически, вы можете достичь
memfd_create()
поведения [ ], не вводя новые системные вызовы, например:
int fd = open("/tmp", O_RDWR | O_TMPFILE | O_EXCL, S_IRWXU);
(Обратите внимание, что для более переносимой гарантии tmpfs мы можем использовать " /dev/shm
" вместо " /tmp
").
Поэтому самый важный вопрос - какого черта нам нужен третий путь?
[...]
- Резервная память учитывается процессом, которому принадлежит файл, и не подлежит квотам монтирования.
^ Прав ли я, полагая, что на первую часть этого предложения нельзя положиться?
Код memfd_create () буквально реализован как « несвязанный файл, находящийся в [a] tmpfs, который должен быть внутренним ядром ». Отслеживая код, я понимаю, что он отличается отсутствием реализации проверок LSM, также создаются memfds для поддержки «печатей», как поясняется в сообщении в блоге. Однако я крайне скептически отношусь к тому, что memfds в принципе учитываются иначе, чем в tmpfile.
В частности, когда OOM-киллер приходит в стук, я не думаю, что он будет учитывать память, хранящуюся в memfds. Это может составить до 50% оперативной памяти - значение параметра size = для tmpfs . Ядро не устанавливает другое значение для внутренних tmpfs, поэтому оно будет использовать размер по умолчанию 50%.
Поэтому я думаю, что в целом мы можем ожидать, что процессы, которые содержат большой memfd, но никакие другие значительные выделения памяти, не будут уничтожены OOM. Это верно?