Hiểu MMAP


9

Tôi đã đi qua các tài liệu liên quan đến mmap ở đây và cố gắng thực hiện nó bằng cách sử này

Tôi có một vài nghi ngờ về việc thực hiện nó.

  1. MMAP có cung cấp ánh xạ của tệp và trả về một con trỏ của vị trí đó trong bộ nhớ vật lý hay nó trả về với một địa chỉ của bảng ánh xạ? và nó có phân bổ và khóa không gian cho tập tin đó không?

  2. Khi tệp được lưu trữ trên vị trí đó trong bộ nhớ, nó có ở đó cho đến khi munmap được gọi không?

  3. Là tập tin thậm chí được chuyển sang bộ nhớ hay nó chỉ là một bảng ánh xạ đóng vai trò chuyển hướng và tập tin thực sự nằm trong bộ nhớ ảo - (đĩa)?

  4. Giả sử nó được chuyển vào bộ nhớ, các quá trình khác có thể truy cập vào không gian đó để đọc dữ liệu nếu chúng có địa chỉ không?


2
Bạn không thực hiện mmap nhưng bạn đang sử dụng
Basile Starynkevitch

Câu trả lời:


12

Trả lời mọi thứ theo thứ tự:

  1. 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).
  2. 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ó ở đó.
  3. 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.
  4. 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_SHAREDcờ.

Đ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)).

Cảm ơn cho một câu trả lời chi tiết. Chỉ cần làm rõ ở điểm 1. Nếu tôi cố truy cập vào địa chỉ bộ nhớ ảo được trả về. Đầu tiên, nó sẽ đi qua bản đồ địa chỉ được tạo cho quy trình và sau đó được chuyển hướng đến vị trí thực tế - có thể là đĩa, bộ đệm hoặc bộ nhớ Thứ hai nếu cờ MAP_SHARED được bật và bảng cho cả hai quá trình trả về cùng một giá trị cho địa chỉ vật lý thì tập tin có thể được chia sẻ?
john

1. Có, nó sẽ sử dụng bảng ánh xạ bộ nhớ ảo. 2. Địa chỉ trong mỗi quy trình không thành vấn đề, thực tế là họ đã ánh xạ cùng một vùng của cùng một tệp với MAP_SHARED.
Austin Hemmelgarn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.