c:malloc() - Liệu nó sử dụng brk() hoặc mmap() code
// program break mechanism
// TLPI exercise 7-1
#include <stdio.h>
#include <stdlib.h>
void program_break_test() {
printf("%10p\n", sbrk(0));
char *bl = malloc(1024 * 1024);
printf("%x\n", sbrk(0));
free(bl);
printf("%x\n", sbrk(0));
}
int main(int argc, char **argv) {
program_break_test();
return 0;
}
Khi biên dịch đoạn mã sau:
printf("%10p\n", sbrk(0));
tôi nhận được cảnh báo tip:
format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’
Câu hỏi 1: Tại sao lại như vậy?
Và sau khi tôi malloc(1024 * 1024)
, có vẻ như ngắt chương trình không thay đổi.
Đây là kết quả:
9b12000
9b12000
9b12000
Câu hỏi 2: Liệu quá trình cấp phát bộ nhớ trên heap khi khởi động để sử dụng trong tương lai? Hoặc trình biên dịch thay đổi thời điểm để phân bổ? Nếu không, tại sao?
[cập nhật] Tóm tắt: brk() hoặc mmap()
Sau khi xem xét TLPI và kiểm tra trang người đàn ông (với sự giúp đỡ từ tác giả của TLPI), bây giờ tôi hiểu làm thế nào malloc()
quyết định sử dụng brk()
hoặc mmap()
, như sau:
mallopt()
có thể thiết lập các thông số để kiểm soát hành vi của malloc()
, và có một tham số có tên M_MMAP_THRESHOLD
, nói chung:
- Nếu bộ nhớ được yêu cầu nhỏ hơn,
brk()
sẽ được sử dụng; - Nếu bộ nhớ được yêu cầu lớn hơn hoặc bằng,
mmap()
sẽ được sử dụng;
Giá trị mặc định của tham số là 128kb
(trên hệ thống của tôi), nhưng trong chương trình thử nghiệm của tôi, tôi sử dụng 1Mb, vì vậy mmap()
được chọn, khi tôi đã thay đổi bộ nhớ yêu cầu 32kb, tôi thấy brk()
sẽ được sử dụng.
Sách được đề cập trong trang TLPI 147 và 1035, nhưng tôi không đọc kỹ phần đó.
Thông tin chi tiết về tham số có thể được tìm thấy trong trang hướng dẫn cho mallopt()
.
'#include'? –
JS1
@ JS1 Có, giải quyết được vấn đề, bạn có thể đưa ra một giải thích, tôi mới để lập trình linux ... –
Bạn cần mẫu thử nghiệm cho 'sbrk()' trong 'unistd.h'. Nếu không có một nguyên mẫu, trình biên dịch giả định rằng các hàm chưa biết trả về 'int'. – JS1