2010-05-19 34 views
5

Tôi đang sử dụng malloc_stats() để in số liệu thống kê liên quan đến malloc trong đó tôi đang tìm "Arena 0" cho một số chương trình và "Arena 0 và Arena 1" cho một số chương trình khác.Arena trong chức năng Malloc

Các đấu trường này đại diện cho điều gì?

Trả lời

2

Xem link text. Dường như đống là một tập hợp các đấu trường ("các phân vùng phụ") để xử lý việc cấp phát bộ nhớ giữa một số luồng, do đó làm giảm ganh đua.

+0

Liên kết không hoạt động nữa;/ – kokosing

2

Trong một số triển khai malloc nhất định, "đấu trường" là một nhóm bộ nhớ mà từ đó phân bổ riêng lẻ được thực hiện. Các thuật toán để xác định đấu trường nào được sử dụng sẽ khác nhau giữa các lần triển khai, vì vậy chúng tôi không thể giải thích lý do tại sao bạn thấy sự khác biệt. Một yếu tố phổ biến là kích thước phân bổ.

+0

Bạn có thể giải thích điều gì xảy ra khi sử dụng thư viện GNU C thực hiện malloc? – Vaibhav

5

Mã heap nằm bên trong thành phần glibc và được đóng gói trong thư viện được chia sẻ libc.so.x. Việc thực hiện hiện tại của heap sử dụng nhiều sub-heap độc lập được gọi là arenas. Mỗi đấu trường có mutex riêng để bảo vệ đồng thời. Vì vậy, nếu có đủ các đấu trường trong một quá trình 'heap', và một cơ chế phân phối luồng của luồng truy cập đồng đều giữa chúng, thì tiềm năng tranh chấp cho các mutex sẽ là tối thiểu. Nó chỉ ra rằng điều này hoạt động tốt cho phân bổ. Trong malloc(), một thử nghiệm được thực hiện để xem liệu mutex cho đấu trường đích hiện tại cho luồng hiện tại là miễn phí (trylock). Nếu vậy thì đấu trường hiện đang bị khóa và tiền thu được phân bổ. Nếu mutex đang bận thì mỗi đấu trường còn lại sẽ được thử lần lượt và được sử dụng nếu mutex không bận. Trong trường hợp không có đấu trường nào có thể bị khóa mà không bị chặn, một đấu trường mới sẽ được tạo ra. Trường này theo định nghĩa chưa được khóa, do đó việc phân bổ có thể tiến hành mà không bị chặn. Cuối cùng, ID của đấu trường cuối cùng được sử dụng bởi một luồng được giữ lại trong lưu trữ cục bộ luồng, và sau đó được sử dụng làm đấu trường đầu tiên để thử khi malloc() tiếp theo được gọi bởi luồng đó. Do đó tất cả các cuộc gọi đến malloc() sẽ tiến hành mà không bị chặn.