2011-06-13 4 views
6

関連コード:mallocはシステムコールを呼び出さないのですか?

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

関連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) 

私はそのような低レベルの操作は、システムコールを伴わない驚いていますか?

+2

を割り当てます。 'malloc'呼び出しは' brk'システムコールを呼び出します。 – Gabe

+0

ビアテストでは、 'malloc'の数を増やせば' brk'が増えないので、 'malloc'で' brk'が生成されないことがわかりました。 – cpuer

+0

'malloc'呼び出しを削除すると、' brk'呼び出しはトレースから消えてしまいますか? – Gabe

答えて

3

brkは何と思いますか?この例ではmallocが絶対にsyscallを呼び出していますが、syscallは単に "malloc"ではありません。

3

malloc()はシステムのbrk()関数を(Linux/Unixでは)呼び出しますが、ローカルヒープが使い果たされた場合にのみ呼び出します。私。ほとんどのmalloc実装では、brk()で得られたメモリヒープを管理しています。小さすぎたり断片化したりすると、brk()でさらに多くを求めます。

19

mallocを呼び出すたびに、システムコールが呼び出されるわけではありません。私のlinuxのデスクトップでは、mallocは128KBのブロックにスペースを割り当ててから、そのスペースを分配します。だから、私は100~200のmalloc呼び出しごとにシステムコールを見るでしょう。 freebsd mallocでは2MBのブロックを割り当てます。あなたのマシン上では番号が異なる可能性があります。

あなたは、すべてのmallocでシステムコールを表示したい場合は、私はあなたが求めているものを理解していない大量のメモリ(malloc関数(* 1024 * 1024 10 * 1024))

関連する問題