https://dvdhrm.wordpress.com/2014/06/10/memfd_create2/
Về mặt lý thuyết, bạn có thể đạt được
memfd_create()
hành vi [ ] mà không cần giới thiệu các tòa nhà mới, như thế này:
int fd = open("/tmp", O_RDWR | O_TMPFILE | O_EXCL, S_IRWXU);
(Lưu ý, để đảm bảo một cách hợp lý hơn một tmpfs ở đây, chúng ta có thể sử dụng " /dev/shm
" thay vì " /tmp
").
Do đó, câu hỏi quan trọng nhất là tại sao chúng ta cần một cách thứ ba?
[...]
- Bộ nhớ sao lưu được tính vào quá trình sở hữu tệp và không phải chịu hạn ngạch gắn kết.
^ Tôi có đúng khi nghĩ phần đầu của câu này không thể dựa vào không?
Mã memfd_create () được triển khai theo nghĩa đen là " tệp không được liên kết sống trong [a] tmpfs phải là kernel bên trong ". Theo dõi mã, tôi hiểu nó khác nhau khi không thực hiện kiểm tra LSM, cũng có các memfds được tạo để hỗ trợ "con dấu", khi bài đăng trên blog tiếp tục giải thích. Tuy nhiên, tôi cực kỳ nghi ngờ rằng các memfds được hạch toán khác với một tmpfile về nguyên tắc.
Cụ thể, khi kẻ giết người OOM đến gõ cửa, tôi không nghĩ rằng nó sẽ chiếm bộ nhớ do các memfds nắm giữ. Điều này có thể tổng cộng lên tới 50% RAM - giá trị của tùy chọn size = cho tmpfs . Hạt nhân không đặt giá trị khác cho các tmpfs nội bộ, do đó, nó sẽ sử dụng kích thước mặc định là 50%.
Vì vậy, tôi nghĩ rằng chúng ta thường có thể mong đợi các quy trình chứa một memfd lớn, nhưng không có phân bổ bộ nhớ quan trọng nào khác, sẽ không bị OOM giết. Đúng không?