sbrk()如何运作?

时间:2017-01-28 18:53:18

标签: c unix sbrk brk

我试图了解sbrk的工作原理。

这是我的小代码:

int  main()
{  
    printf("end of the break : %p\n", sbrk(0));
    printf("end of the break : %p\n", sbrk(10));
    printf("new end of the break : %p\n\n", sbrk(0));
}

输出:

end of break : 0xaa6000    
end of break : 0xac7000    
new end of the break : 0xac700a    

为什么前2个地址之间存在差异 0xac7000 - 0xaa6000 = 21000而不是10?

1 个答案:

答案 0 :(得分:7)

sbrk(n)将中断增加n并返回中断的值。

因此:

    printf("end of the break : %p\n", sbrk(0));

输出:end of the break : 0xaa6000

最初,中断为0xaa6000,sbrk来电不会更改。

    printf("end of the break : %p\n", sbrk(10));

输出:end of the break : 0xac7000

这是你要问的价值。上面我说sbrk(0)不会改变休息时间,为什么我们在这里得到不同的值?

sbrk两个printf来电之间发生的唯一事情是对第一个malloc的调用。据推测,stdio实现的内部使用sbrk(例如创建缓冲区),而后者又调用printf本身。换句话说,malloc在内部调用sbrk,使用 printf("new end of the break : %p\n\n", sbrk(0)); 保留内存。

new end of the break : 0xac700a

输出:sbrk(10)

这次我们看到增量为0xa,与之前的printf来电完全匹配。显然这次malloc不需要分配动态内存(如果确实如此,sbrk能够完成从第一个SELECT Table1.ID_1, Table1.ID_2, Table2.OtherInfo FROM Table1 INNER JOIN Table2 ON ((Table1.ID_2 = Table2.ID_2) AND (Table1.ID_1 = Table2.ID_1)) OR ((Table1.ID_1 = Table2.ID_1) AND Table1.ID_2 IS NULL AND Table2.ID_2 IS NULL) 获得的空间内的所有内容,所以它没有必要从OS请求更多。)