ls의 명령어 개수가 왜 그렇게 많이 다른가요? (ptrace 대 perf 대 qemu)

Nov 14 2020

/ bin / ls를 실행할 때 실행 된 총 명령 수를 계산하고 싶습니다. 결과가 크게 다른 3 가지 방법을 사용했는데 그 이유를 모르겠습니다.

1. ptrace를 사용한 명령어 카운팅

ls 인스턴스를 호출하고 ptrace를 사용하여 단일 단계를 수행하는 코드를 작성했습니다.

#include <stdio.h>
#include <sys/ptrace.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/user.h>
#include <sys/reg.h>    
#include <sys/syscall.h>

int main()
{   
    pid_t child;
    child = fork(); //create child
    
    if(child == 0) {
        ptrace(PTRACE_TRACEME, 0, NULL, NULL);
        char* child_argv[] = {"/bin/ls", NULL};
        execv("/bin/ls", child_argv);
    }
    else {
        int status;
        long long ins_count = 0;
        while(1)
        {
            //stop tracing if child terminated successfully
            wait(&status);
            if(WIFEXITED(status))
                break;

                ins_count++;
                ptrace(PTRACE_SINGLESTEP, child, NULL, NULL);
        }

    printf("\n%lld Instructions executed.\n", ins_count);

    }
    
    return 0;
}

이 코드를 실행하면 516.678 명령이 실행됩니다.

2. QEMU 단일 스테핑

단일 단계 모드에서 qemu를 사용하여 ls를 시뮬레이션하고 다음 명령을 사용하여 들어오는 모든 지침을 로그 파일에 기록했습니다. qemu-x86_64 -singlestep -D logfile -d in_asm / bin / ls

qemu ls에 따르면 16.836 명령을 실행합니다.

3. 성능

sudo 성능 통계 ls

이 명령은 8.162.180 명령을 실행했습니다.

이러한 명령의 대부분은 동적 링커에서 온 것이며 계산되는 것이 좋습니다. 하지만이 숫자가 왜 그렇게 많이 다른가요? 모두 동일해야하지 않습니까?

답변

1 Kubahasn'tforgottenMonica Nov 14 2020 at 05:41

이 명령어 개수가 왜 그렇게 많이 다른 가요? 그들은 실제로 다른 것을 측정하고 측정 단위 만 동일하기 때문입니다. 마치 가게에서 가져온 물건의 무게를 쟀는데, 한 사람은 포장이나 스티커없이 모든 것을 칭량했고, 다른 사람은 포장에 무게를 달고 쇼핑백도 포함 시켰고, 또 다른 사람은 당신이 가져온 진흙을 더했습니다. 부츠에 집.

이것이 여기서 일어나는 일입니다. 명령어 수는 ls바이너리 내부에있는 것의 명령어 수뿐 아니라 사용하는 라이브러리, 해당 라이브러리를 가져 오는 데 필요한 커널 로더의 서비스, 마지막으로 실행 된 코드를 포함 할 수도 있습니다. 프로세스에서 그러나 커널 컨텍스트에서. 사용한 방법은 모두 그 점에서 다르게 작동합니다. 그래서 질문은 : 그 측정에서 무엇이 필요합니까? "총 노력"이 필요한 경우 가장 큰 숫자가 원하는 것입니다. 여기에는 커널로 인해 발생하는 일부 오버 헤드가 포함됩니다. "내가 무슨 일이 있었는지 알고 싶어"가 필요한 경우 ls가장 작은 숫자가 원하는 숫자입니다.