https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/
Teoricamente, potresti ottenere un
memfd_create()
comportamento [ ] senza introdurre nuovi syscall, come questo:
int fd = open("/tmp", O_RDWR | O_TMPFILE | O_EXCL, S_IRWXU);
(Nota, per garantire in modo più portabile un tmpfs qui, possiamo usare " /dev/shm
" invece di " /tmp
").
Pertanto, la domanda più importante è: perché diavolo abbiamo bisogno di una terza via?
[...]
- La memoria di supporto viene contabilizzata nel processo proprietario del file e non è soggetta a quote di montaggio.
^ Ho ragione nel pensare che la prima parte di questa frase non possa essere invocata?
Il codice memfd_create () è letteralmente implementato come " file non collegato che vive in [a] tmpfs che deve essere interno al kernel ". Tracciando il codice, capisco che differisce nel non implementare i controlli LSM, anche i memfds sono creati per supportare i "sigilli", come spiega il post sul blog. Tuttavia, sono estremamente scettico sul fatto che i memfds siano considerati in modo diverso rispetto a un tmpfile in linea di principio.
In particolare, quando il killer OOM viene a bussare, non penso che spiegherà la memoria trattenuta dai memfds. Questo potrebbe raggiungere il 50% della RAM, ovvero il valore dell'opzione size = per tmpfs . Il kernel non imposta un valore diverso per i tmpfs interni, quindi userebbe la dimensione predefinita del 50%.
Quindi penso che generalmente possiamo aspettarci che processi che contengono un memfd di grandi dimensioni, ma nessun'altra allocazione significativa di memoria, non vengano uccisi da OOM. È corretto?