मैं /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 perf stat ls

इस आदेश ने मुझे 8.162.180 निर्देश निष्पादित किए।

मुझे पता है कि इनमें से अधिकांश निर्देश डायनेमिक लिंकर से आते हैं और यह ठीक है कि उनकी गिनती हो जाती है। लेकिन ये संख्याएँ इतनी भिन्न क्यों हैं? क्या वे सब एक जैसे नहीं होने चाहिए?

2
Sbardila 13 नवम्बर 2020, 21:37

1 उत्तर

सबसे बढ़िया उत्तर

इन निर्देशों की संख्या में इतना अंतर क्यों है? क्योंकि वे वास्तव में अलग-अलग चीजों को मापते हैं, और केवल माप की इकाई समान होती है। यह ऐसा है जैसे आप स्टोर से लाए गए किसी चीज़ का वजन कर रहे थे, और एक व्यक्ति ने बिना पैकेज के और न ही उस पर स्टिकर के बिना सब कुछ तौला, दूसरा इसे पैकेजों में तौल रहा था और इसमें शॉपिंग बैग भी शामिल थे, और फिर भी दूसरे ने आपके द्वारा लाए गए कीचड़ को भी जोड़ा। अपने जूतों पर घर।

यहाँ जो कुछ भी हो रहा है वह बहुत कुछ है: निर्देश गणना केवल ls बाइनरी के अंदर के निर्देशों की गणना नहीं है, बल्कि इसमें उन पुस्तकालयों को भी शामिल किया जा सकता है, कर्नेल लोडर की सेवाओं को उन पुस्तकालयों में लाने के लिए आवश्यक है, और अंत में प्रक्रिया में निष्पादित कोड लेकिन कर्नेल संदर्भ में। आपके द्वारा उपयोग की जाने वाली सभी विधियां उस संबंध में अलग-अलग व्यवहार करती हैं। तो सवाल यह है कि आपको उस माप से क्या चाहिए? यदि आपको "कुल प्रयास" की आवश्यकता है, तो निश्चित रूप से सबसे बड़ी संख्या वह है जो आप चाहते हैं: इसमें कर्नेल के कारण होने वाले कुछ ओवरहेड शामिल होंगे। अगर आपको "मैं सिर्फ यह जानना चाहता हूं कि ls" में क्या हुआ, तो सबसे छोटी संख्या वह है जो आप चाहते हैं।

1
Kuba hasn't forgotten Monica 14 नवम्बर 2020, 01:41