2011-06-13 36 views
6

đang liên quan:Vì vậy, malloc không gọi bất kỳ syscall?

write(-1, "test", sizeof("test")); 
    void * p = malloc(1024); 
    void * p2 = malloc(510); 
    write(-1, "hi", sizeof("hi")); 

Related sản lượng strace:

write(4294967295, "test\0", 5)   = -1 EBADF (Bad file descriptor) 
brk(0)         = 0x601000 
brk(0x622000)       = 0x622000 
write(4294967295, "hi\0", 3)   = -1 EBADF (Bad file descriptor) 

Tôi ngạc nhiên như vậy hoạt động ở mức độ thấp không liên quan đến syscall?

+2

Tôi không hiểu bạn đang hỏi gì. Lệnh gọi 'malloc' gọi' sldall 'brk'. – Gabe

+0

Qua kiểm tra tôi thấy 'brk' không được tạo bởi' malloc', bởi vì nếu tôi tăng số lượng 'malloc',' brk' không tăng lên. – cpuer

+0

Bạn có nói rằng nếu bạn loại bỏ các cuộc gọi 'malloc', sau đó các cuộc gọi' brk' biến mất khỏi dấu vết? – Gabe

Trả lời

3

Bạn nghĩ brk là gì? malloc hoàn toàn là gọi một syscall trong ví dụ này, syscall không phải là "malloc".

3

malloc() gọi hàm brk() của hệ thống (trong Linux/Unix) - nhưng nó chỉ gọi nó nếu heap cục bộ bị cạn kiệt. I E. hầu hết các triển khai malloc quản lý một heap bộ nhớ thu được thông qua brk(), và nếu nó quá nhỏ hoặc quá phân mảnh, chúng yêu cầu nhiều hơn thông qua brk().

19

Không phải mọi cuộc gọi tới malloc đều gọi một syscall. Trên máy tính để bàn của tôi malloc phân bổ một không gian trong khối 128KB và sau đó phân phối không gian. Vì vậy, tôi sẽ thấy một syscall mỗi 100-200 cuộc gọi malloc. Trên mallbs freebsd phân bổ bởi 2MB khối. Trên số máy của bạn sẽ có khả năng khác nhau.

Nếu bạn muốn xem syscall trên mỗi malloc phân bổ một lượng lớn bộ nhớ (malloc (10 * 1024 * 1024 * 1024))

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