Tôi bị nhầm lẫn về heap
và free list
. Tôi có một số câu hỏi và tôi có sự hiểu biết của riêng tôi về cách malloc hoạt động trong C. Xin vui lòng sửa tôi nếu tôi sai.Phân bổ bộ nhớ và bản phân vùng Heap
- Bộ nhớ heap có được tổ chức dưới dạng danh sách được liên kết (danh sách miễn phí) của dữ liệu khối không?
- Có sự khác biệt nào giữa bộ nhớ heap và danh sách miễn phí không?
sự hiểu biết của tôi về phân bổ lưu trữ (mở để cải thiện): - Khi chúng ta gọi là malloc, nó cấp phát bộ nhớ trong heap, và nó làm như vậy bằng cách chọn một khối dữ liệu có kích thước phù hợp từ free list
, phải không?
Khi một khối bộ nhớ nhất định được trả về bởi malloc, nó được lấy ra khỏi danh sách miễn phí và địa chỉ vật lý của khối bộ nhớ đó được cập nhật trong bảng trang.
Khi bộ nhớ được tự do sử dụng free()
, khối dữ liệu được chèn vào danh sách miễn phí và có thể để giảm phân mảnh, dính liền với khối lân cận và bit present
trong mục bảng trang sẽ bị xóa.
Vì vậy, toàn bộ đống là danh sách miễn phí (danh sách liên kết các khối miễn phí) + khối dữ liệu được phân bổ.
Đó có phải là bức tranh toàn diện về phân bổ bộ nhớ không?
EDIT: Từ Linux phát triển hạt nhân (Robert Love) Chương về quản lý bộ nhớ, Slab phân bổ
"Một danh sách miễn phí có chứa một khối có sẵn, đã được phân bổ, dữ liệu cấu trúc Khi mã đòi hỏi một. trường hợp mới của cấu trúc dữ liệu, nó có thể lấy một trong các cấu trúc ra khỏi danh sách miễn phí thay vì phân bổ lượng bộ nhớ đủ và thiết lập cho cấu trúc dữ liệu Sau đó, khi cấu trúc dữ liệu không còn cần thiết nữa, được trả về danh sách miễn phí thay vì dealloca ted. Trong ý nghĩa này, danh sách miễn phí hoạt động như một bộ nhớ cache đối tượng, bộ nhớ đệm một loại thường được sử dụng của đối tượng."
miễn phí danh sách được nhắc đến như là một 'khối có sẵn cấu trúc dữ liệu được phân bổ,'.
- Làm thế nào là nó phân bổ, khi nó nằm trong một tự do-list?
- Và làm thế nào được trả lại một khối bộ nhớ vào danh sách miễn phí _ không _ giống như deallocating khối đó?
- thế nào là phân bổ phiến khác nhau từ phân bổ lưu trữ
Bạn đang nói - "malloc() phân bổ các phần có kích thước biến của phân đoạn dữ liệu của chương trình". Đó không phải là đống mà bạn đang đề cập đến? Heap có phải là một phần của phân đoạn dữ liệu không? Mặc dù chúng khác nhau .. –
Heap là cấu trúc dữ liệu nằm trong phân đoạn dữ liệu. Đó là dữ liệu sổ kế toán theo dõi phần nào của phân đoạn dữ liệu đang được sử dụng và có sẵn phần nào. Tương tự như vậy, hãy nghĩ đến vai trò của hệ thống tập tin trên đĩa. – Wyzard
Sharat: Tôi nghĩ rằng bạn đang đánh giá quá cao toàn bộ điều - xin lỗi! –