Tôi muốn phân bổ và khởi tạo một phần khá lớn của bộ nhớ tiếp giáp (~ 1GB), sau đó đánh dấu nó là chỉ đọc và ngã ba nhiều (nói vài chục) quy trình con sẽ sử dụng nó, mà không tạo bản sao của bộ nhớ (máy sẽ không có đủ bộ nhớ cho việc này).Đây có phải là cách an toàn để chia sẻ bộ nhớ chỉ đọc với các tiến trình con không?
Tôi có nghĩ rằng nếu tôi malloc
bộ nhớ như bình thường, thì đánh dấu nó là chỉ đọc với mprotect(addr, size, PROT_READ)
và sau đó fork
, điều này sẽ cho phép trẻ xử lý an toàn bộ nhớ mà không làm sao chép? (Cung cấp cho tôi đảm bảo không có gì cố gắng ghi vào bộ nhớ được cấp phát sau cuộc gọi mprotect
).
chỉnh sửa: Cảm ơn tất cả các câu trả lời.
Câu hỏi tiếp theo - Tôi đã lên kế hoạch sử dụng shmget
, nhưng tôi nghĩ nó đã sử dụng mm
và do đó sẽ bị giới hạn ở phân bổ nhỏ hơn (xem Restrictions section of this page). ví dụ: /proc/sys/kernel/shmmax
là 32MB trên máy chủ Tôi đang sử dụng cái này. Nhưng tôi muốn 1GB bộ nhớ tiếp giáp. Tôi có sai về giới hạn này không?
Ah cảm ơn, tôi rõ ràng là không đọc trang người bảo vệ mprotect đủ chặt chẽ. –
@therefromhere 'MAP_SHARED | MAP_ANONYMOUS' tại đây hoạt động để chia sẻ từ cha mẹ trước khi chia tay cho bất kỳ trẻ em nào. Nếu bạn muốn chia sẻ giữa các quá trình tùy ý, hãy lấy ra 'MAP_ANONYMOUS' và gán cho nó một FD thực thay vì' -1'; FD này có thể đến từ 'mở' một tệp trên đĩa hoặc từ 'shm_open'. – ephemient
Trang người quản lý linux cho mprotect không lưu ý "Trên Linux, luôn luôn là hợp pháp để gọi mprotect() trên bất kỳ địa chỉ nào trong không gian địa chỉ quy trình ..." http://linux.die.net/man/2/mprotect –