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% оперативної пам'яті - значення розміру = варіант для tmpfs . Ядро не встановлює інше значення для внутрішніх tmpfs, тому воно використовує розмір за замовчуванням 50%.
Тому я думаю, що ми, як правило, можемо очікувати, що процеси, які займають велику memfd, але жодне інше значне розподілення пам'яті, не буде знищено OOM. Це правильно?