free 以降 malloc の間はシステムコールはありません。

free 以降 malloc の間はシステムコールはありません。

カーネル監査システムで遊んで、私は小さなCプログラムを書いた。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv){
        void *t;
        while(1){
                t = malloc(1);
                free(t);

        }
        return 0;
}

レビューには、次のフィルタを適用します。

-a always,exit -F arch=b32 -S open,openat -F exit=-EACCES -F key=access
-a always,exit -F arch=b64 -S open,openat -F exit=-EACCES -F key=access
-a always,exit -F arch=b32 -S brk
-a always,exit -F arch=b64 -S brk

sys_brkコンパイルして実行した後、監査ログにこの内容が表示されないことを確認しました。また、呼び出してもstracemallocltraceで確認)には表示されません。最後に無料サービスを削除し、sys_brk着信が表示され始めました。

この動作の原因は何ですか? glibcは、役に立たないシステムコールを防ぐために、および機能のmallocための一種の最適化を実行しますか?free

重要な要約:free以下はmallocカーネルを呼び出しません。なぜ?

答え1

プログラムは初期ヒープで始まり、1バイト割り当てはそのヒープに合います。割り当てられたメモリをすぐに解放すると、ヒープが大きくなる必要がないため、そのシステムコールは表示されません。

バラよりカーネル内のプロセスメモリの測定値はどのくらい速く、頻繁に更新されますか?同様の実験を行います。

関連情報