Trả lời mọi thứ theo thứ tự:
- Nó trả về một con trỏ tới vị trí trong bộ nhớ ảo và không gian địa chỉ bộ nhớ ảo được phân bổ, nhưng tệp không bị khóa theo bất kỳ cách nào trừ khi bạn khóa nó một cách rõ ràng (cũng lưu ý rằng việc khóa bộ nhớ không giống như khóa vùng trong tập tin). Việc triển khai hiệu quả mmap () thực tế chỉ có thể thực hiện được từ góc độ thực tế vì phân trang và bộ nhớ ảo (nếu không, nó sẽ yêu cầu đọc toàn bộ vùng vào bộ nhớ trước khi cuộc gọi hoàn thành).
- Không chính xác, điều này liên quan đến câu trả lời tiếp theo, vì vậy tôi sẽ trình bày nó ở đó.
- Loại. Điều thực sự xảy ra trong hầu hết các trường hợp là mmap () đang cung cấp quyền truy cập sao chép vào dữ liệu của tệp đó trong bộ đệm của trang. Do đó, các hạn chế bộ đệm thông thường đối với tuổi thọ dữ liệu được áp dụng (nếu hệ thống cần dung lượng, các trang có thể bị hủy (hoặc bị xóa vào đĩa nếu chúng bị bẩn) khỏi bộ đệm và cần phải sửa lại.
- Không, vì cách bộ nhớ ảo hoạt động. Mỗi quy trình có không gian địa chỉ ảo riêng, với ánh xạ ảo riêng. Mọi chương trình muốn truyền dữ liệu sẽ phải gọi mmap () trên cùng một tệp (hoặc phân đoạn bộ nhớ dùng chung) và tất cả chúng đều phải sử dụng
MAP_SHARED
cờ.
Điều đáng chú ý là mmap () không chỉ hoạt động trên các tệp, bạn cũng có thể làm những việc khác với nó như:
- Ánh xạ trực tiếp bộ nhớ thiết bị (nếu bạn có đủ đặc quyền). Điều này thực sự được sử dụng trên nhiều hệ thống nhúng để tránh phải viết trình điều khiển chế độ kernel cho phần cứng mới.
- Bản đồ phân chia bộ nhớ.
- Rõ ràng bản đồ các trang lớn.
- Phân bổ bộ nhớ mà sau đó bạn có thể gọi madvise (2) (điều này cho phép bạn thực hiện những việc hữu ích như ngăn chặn dữ liệu được sao chép vào tiến trình con trên ngã ba (2) hoặc đánh dấu dữ liệu cho KSM (tính năng sao chép bộ nhớ của Linux)).
mmap
nhưng bạn đang sử dụng nó