2010-09-04 25 views
8

Rất nhiều c/malloc() trong một/trong/làm có thể tiêu tốn rất nhiều thời gian vì vậy tôi tò mò nếu bất kỳ hệ điều hành bộ nhớ đệm cho mallocs nhanh.Có hệ điều hành nào thực hiện đệm cho malloc() không?

Tôi đã cân nhắc nếu tôi có thể tăng tốc độ của malloc bằng cách viết một wrapper "tham lam" cho malloc. Ví dụ. khi tôi yêu cầu 1MB bộ nhớ, người cấp phát ban đầu sẽ phân bổ 10MB và vào thứ 2, thứ 3, thứ 4, v.v ... gọi hàm malloc sẽ đơn giản trả về bộ nhớ từ đoạn đầu tiên được phân bổ theo cách "bình thường". Tất nhiên nếu không có đủ bộ nhớ, bạn sẽ cần phải phân bổ một bộ nhớ tham lam mới.

Bằng cách nào đó tôi nghĩ ai đó phải làm điều này hoặc điều gì đó tương tự trước đây. Vì vậy, câu hỏi của tôi chỉ đơn giản là: Đây có phải là cái gì đó sẽ đẩy nhanh quá trình phân bổ bộ nhớ đáng kể. (vâng tôi có thể đã thử nó trước khi đặt câu hỏi nhưng tôi chỉ lười biếng để viết một điều như vậy nếu không cần phải làm điều đó)

+1

Chỉ cần làm rõ, 'malloc' là một phần của thư viện thời gian chạy C, không phải hệ điều hành. Nó phổ biến cho 'malloc' cũng như các dịch vụ bộ nhớ hệ điều hành để làm bộ nhớ đệm và đệm để tăng tốc độ phân bổ. –

Trả lời

3

Tất cả các phiên bản của malloc() làm đệm loại bạn mô tả ở mức độ nào đó - chúng sẽ lấy một đoạn lớn hơn yêu cầu hiện tại và sử dụng đoạn lớn để đáp ứng nhiều yêu cầu, nhưng chỉ với một số kích thước yêu cầu. Điều này có nghĩa là nhiều yêu cầu cho 16 byte tại một thời điểm sẽ chỉ yêu cầu bộ nhớ nhiều hơn từ o/s một lần mỗi 50-100 cuộc gọi, hoặc một cái gì đó dọc theo những dòng chung.

Điều ít rõ ràng hơn là kích thước ranh giới là bao nhiêu. Nó cũng có thể là họ phân bổ một số tương đối nhỏ nhiều của 4 KiB tại một thời điểm. Yêu cầu lớn hơn - Yêu cầu kích thước MiB - sẽ quay trở lại hệ thống để có thêm bộ nhớ mỗi khi yêu cầu không thể hài lòng với những gì nằm trong danh sách miễn phí. Tuy nhiên, ngưỡng đó thường nhỏ hơn đáng kể so với 1 MiB.

Một số phiên bản của malloc() cho phép bạn điều chỉnh các đặc điểm phân bổ của chúng, với các mức độ lớn hơn hoặc nhỏ hơn. Đây là một lĩnh vực nghiên cứu màu mỡ - rất nhiều hệ thống khác nhau. Xem Knuth 'The Art of Computer Programming' Tập 1 (Thuật toán cơ bản) cho một bộ thảo luận.

3

Vì tôi đã duyệt mã Google Chrome một thời gian trước, tôi đã tìm thấy http://www.canonware.com/jemalloc/ . Đây là một triển khai malloc miễn phí, có mục đích chung và có thể mở rộng.

Thật lạ lùng, nó đang được sử dụng trong nhiều dự án, vì nó thường hoạt động tốt hơn các triển khai tiêu chuẩn của malloc trong nhiều tình huống thực tế (nhiều phân bổ nhỏ thay vì vài phân bổ lớn).

Chắc chắn đáng xem!

-2

Điều bạn đang nói có thể đã hoàn thành, tôi thực sự không biết. Tuy nhiên, tôi không biết rằng độ trễ trong đệm malloc của bạn() ở mức hệ thống sẽ làm giảm độ trễ nhiều. Bạn vẫn phải dành thời gian để đi vào bí mật. chế độ cho một cuộc gọi hệ thống, có khả năng khóa cấu trúc cấp hạt nhân (có nghĩa là nhiều cuộc gọi hệ thống và CHỜ cho khóa), và những thứ có tính chất đó.

Nếu bạn có thể viết trình quản lý bộ nhớ của riêng mình trong không gian người dùng cho chương trình của bạn và chỉ gọi malloc() khi bạn cần thêm bộ nhớ cho hồ bơi, bạn có thể thấy độ trễ giảm.

+0

triển khai malloc * là * trong chế độ người dùng, bởi vì chúng ở trong thời gian chạy C. Ngay cả việc triển khai Windows HeapAlloc cũng ở chế độ người dùng. –

+1

@Paul, LARGELY phụ thuộc vào hệ điều hành. Tôi sẽ không quá nhanh để khái quát. Bạn có nhầm lẫn với khẳng định của tôi rằng malloc phải gọi các hàm priv-level với việc nói malloc tự chạy trong không gian hạt nhân? Ví dụ, nhiều triển khai malloc dựa vào mmap trên các hệ thống POSIX. mmap yêu cầu hỗ trợ cấp hạt nhân để hoạt động. –

+1

Thông điệp của bạn với tôi ngụ ý rằng malloc chính nó là một syscall ... –

2

Kỹ thuật đó được gọi là Slab Allocator và hầu hết các hệ điều hành đều hỗ trợ, nhưng tôi không thể tìm thấy thông tin có sẵn cho người dùng malloc, chỉ dành cho phân bổ hạt nhân.

Bạn có thể tìm thấy bài báo của Jeff Bonwick here, mô tả kỹ thuật gốc trên Solaris.

+0

GLib có một phiến đá - http://library.gnome.org/devel/glib/stable/glib-Memory-Slices.html nhưng glibc malloc thường xuyên hơn là tốt hơn. –

1

Google có triển khai tham lam malloc() gần như bạn nghĩ đến điều gì. Nó có một số nhược điểm, nhưng nó rất nhanh trong nhiều trường hợp sử dụng.

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