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컴파일하고 실행한 후 감사 로그에 이 내용이 표시되지 않는 것을 확인했습니다 . 또한 호출 strace하더라도 malloc(ltrace로 확인) 에는 나타나지 않습니다 . 마침내 무료 서비스를 제거하고 sys_brk수신 전화가 표시되기 시작했습니다.

이 동작의 원인은 무엇입니까? glibc는 쓸모없는 시스템 호출을 방지하기 위해 malloc및 기능에 대해 일종의 최적화를 수행 합니까?free

핵심요약: free다음은 malloc커널을 호출하지 않습니다. 왜?

답변1

프로그램은 초기 힙으로 시작하고 1바이트 할당은 해당 힙에 맞습니다. 할당된 메모리를 즉시 해제하면 힙이 커질 필요가 없으므로 해당 시스템 호출이 표시되지 않습니다.

바라보다커널에서 프로세스 메모리 측정값이 얼마나 빠르고 자주 업데이트됩니까?유사한 실험을 수행하십시오.

관련 정보