2012-01-15 28 views
20

Những nhược điểm của việc cấp phát bộ nhớ bằng cách sử dụng mmap (với MAP_PRIVATE và MAP_ANONYMOUS) là gì khi sử dụng malloc? Đối với dữ liệu trong phạm vi chức năng, tôi sẽ sử dụng bộ nhớ ngăn xếp anyway và do đó không phải malloc.Nếu tôi cấp phát bộ nhớ bằng mmap thay vì malloc thì sao?

Một bất lợi mà bạn quan tâm là dành cho cấu trúc dữ liệu động như cây và danh sách liên kết, nơi bạn thường xuyên phân bổ và xử lý khối dữ liệu nhỏ . Sử dụng mmap sẽ tốn kém vì hai lý do, một cho phân bổ ở mức chi tiết 4096 byte và một cho việc yêu cầu thực hiện cuộc gọi hệ thống.

Nhưng trong các trường hợp khác, bạn có nghĩ rằng malloc tốt hơn mmap không? Thứ hai, tôi có đánh giá quá cao bất lợi của mmap đối với cấu trúc dữ liệu động không?

Một ưu điểm của mmap qua malloc tôi có thể nghĩ đến là nhớ được ngay lập tức quay trở lại hệ điều hành, khi bạn làm munmap, trong khi với malloc/free, tôi đoán bộ nhớ uptil điểm break phân đoạn dữ liệu là không bao giờ trở lại, nhưng vẫn giữ cho reusage .

+9

malloc sẽ gọi mmap cho bạn, nếu cần thiết ... Chỉ cần dính vào malloc. – Macmade

+2

Một bất lợi là nếu bạn xả mã của bạn với các cuộc gọi đến 'mmap', nó trở nên ít cầm tay. –

+3

Và tại sao làm cho cuộc sống trở nên phức tạp hơn cần thiết? –

Trả lời

26

Có, malloc là tốt hơn mmap. Nó dễ sử dụng hơn, nhiều chi tiết hơn và di động hơn nhiều. Cuối cùng, nó sẽ gọi mmap.

Nếu bạn bắt đầu thực hiện quản lý bộ nhớ hàng ngày với mmap, bạn sẽ muốn thực hiện một số cách để chuyển nó ra thành các phần nhỏ hơn các trang và bạn sẽ kết thúc lại việc thực hiện malloc - theo cách tối ưu.

+1

Câu trả lời chuyên sâu vì nó đề cập đến 'malloc' gọi' mmap'. –

17

Trước hết, mmap() là một cấu trúc nền tảng cụ thể, vì vậy nếu bạn có kế hoạch viết di động C, nó đã hết.

Thứ hai, malloc() về cơ bản được triển khai theo điều khoản mmap(), nhưng đó là loại trình bao bọc thư viện thông minh xung quanh cuộc gọi hệ thống: nó sẽ yêu cầu bộ nhớ mới từ hệ thống khi cần thiết, nhưng cho đến lúc đó nó sẽ chọn một bộ nhớ một khu vực đã cam kết với quy trình.

Do đó, nếu bạn muốn phân bổ bộ nhớ động thông thường, hãy sử dụng malloc(), kết thúc câu chuyện. Sử dụng mmap() để phân bổ bộ nhớ nên được dành riêng cho các tình huống đặc biệt (ví dụ: nếu bạn thực sự muốn toàn bộ trang cho chính mình, căn chỉnh ở ranh giới trang) và luôn được trừu tượng thành một đoạn mã thư viện để người khác có thể dễ dàng hiểu được bạn ' đang làm.

+1

Thậm chí nếu bạn muốn toàn bộ trang cho chính mình thì có lẽ tốt hơn nên sử dụng 'posix_memalign', nó sẽ nhanh hơn để phân bổ, nhanh hơn và miễn phí hạt nhân khỏi sự phức tạp của việc theo dõi một vma khác. Lý do duy nhất để sử dụng 'mmap' là nếu bạn muốn ánh xạ một bộ mô tả tập tin vào bộ nhớ (sử dụng phổ biến nhất) hoặc đang thực hiện một bộ cấp phát bộ nhớ (và thậm chí có những lý do tốt để thích' sbrk'). – jleahy

3

Một tính năng mà mmap có mà malloc không, là mmap cho phép bạn phân bổ sử dụng trang lớn (argument cờ có MAP_HUGETLB bộ), trong khi malloc không có tùy chọn đó.

Các vấn đề liên quan