Почему Linux VmSize VmData больше, чем оценка из кода? - PullRequest
0 голосов
/ 02 марта 2019

Я хочу знать, сколько памяти займет при выполнении кода.Я суммирую всю память, используемую в моем коде, и использую GCC для преобразования в исполняемый файл bin.

Когда я запускаю файл bin и использую cat/proc/$PID/status, VmSata VmSize намного больше, чем ожидалось.Даже если удалить весь код, но только спящий, результат все равно тот же:

VmPeak:    12816 kB
VmSize:    12816 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:       964 kB
VmRSS:       964 kB
VmData:      204 kB
VmStk:       136 kB
VmExe:        56 kB
VmLib:      2100 kB
VmPTE:        48 kB
VmPMD:        12 kB
VmSwap:        0 kB
  • Почему объем памяти такой большой, даже если в моем коде нет данных?данные, которые я оцениваю в коде, должны быть не более 40 КБ, но VmData - 204 КБ, намного больше ...
  • Почему VmData одинакова, независимо от того, добавляю я в коде #if 0 или нет?Почему бы не изменить на меньшее при добавлении?По крайней мере, я думаю, что он должен быть на 30 КБ меньше ...
  • как получить память, которую мой код использует точно?Есть еще способы проверить?
#include <stdio.h>


int main()
{
    #if 0 
    extern int ed25519_getpub(unsigned char* public_key, const unsigned char* private_key);
    extern int ed25519_sign(unsigned char* signature,
                    const unsigned char* private_key,
                    const unsigned char* msg, const unsigned long msg_len); // use a large static global 30K array
    extern int ed25519_verify(const unsigned char* signature,
                      const unsigned char* public_key,
                      const unsigned char* msg, const unsigned long msg_len); // use the same 30K array

    int ret = 0;
    unsigned char public_key[32];
    unsigned char private_key[32] = "123456789ABC";
    unsigned char signature[64];
    unsigned char msg[64] = "abcdefghijklmnopqrstuvwxyz";
    sleep(20);
    #endif

    for (int i = 0; i < 1000000; i++)
    {
        #if 0 
        //compute public key
        ret = ed25519_getpub( public_key, private_key );
        if (0 != ret)
        {
            ret = 1;
        }

        printf("public_key = %s, ret = %d \r\n ", public_key, ret);

        ret = ed25519_sign( signature, private_key, msg, strlen(msg) );
        if (0 != ret)
        {
            ret = 2;
        }

        printf("signature = %s, ret = %d, \r\n", signature, ret);

        //verify sign
        ret = ed25519_verify( signature, public_key, msg, strlen(msg) );
        if (0 != ret)
        {
            ret = 3;
        }

        printf("ed25519_verify ret = %d, \r\n ", ret);
        #endif

        if (0 == (i % 5 ))
        {
            sleep(10);
        }
    }

    return 0;
}

1 Ответ

0 голосов
/ 05 марта 2019

эта масса кода сводится к: (потому что большая часть его устраняется с помощью последовательностей `'#if 0' ... '#endif')

#include <unistd.h> // for the 'sleep()' function


int main( void )
{
    for (int i = 0; i < 1000000; i++)
    {
        if ( 0 == (i % 5 ) )
        {
            sleep(10);
        }
    }
}

где: я компилируюв Ubuntu Linux 18.02

вот как я скомпилировал код:

gcc -ggdb -Wall -Wextra -Wconversion -pedantic -std=gnu11 -c "untitled2.c" 

вот как я связал код:

gcc -ggdb -Wall -o "untitled2" "untitled2.c"

Примечание: -ggdbТаким образом, код будет содержать максимальную отладочную информацию для отладчика gdb

после компиляции / компоновки, итоговый размер исполняемого файла можно найти следующим образом:

 ls -al untitled2.c

, что приводит к:

 -rwxrwxrwx 1 richard richard 182 Mar  4 20:54 untitled2.c

182 байта не похоже ни на 204 КБ, ни на 40 КБ

Пожалуйста, опубликуйте свой компилятор, свою ОС и скомпилировали ли вы + ссылку в dynamic (по умолчанию) исполняемый файл или static исполняемый

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...