Сохраняет ли компиляция программы некоторые данные в кеше перед выполнением ??(C, Linux) - PullRequest
0 голосов
/ 01 июня 2018

Сохраняет ли компиляция программы некоторые данные в кэше перед выполнением?

Я написал программу на C на Linux, которая запускает Sublime Text в одном потоке и выполняет системные вызовы вручную в другом потоке.(Я объясню, почему я делаю это в конце, поскольку это не относится к этому вопросу)
Я использую getrusage для измерения количества операций ввода / вывода.

Мойвопрос заключается в том, что количество входов / выходов значительно уменьшается сразу после компиляции.Другими словами, , если я не освобождаю кеш и память между компиляцией и выполнением, количество операций ввода-вывода значительно уменьшается. Почему и как это происходит? См. Случаи ниже.

Случай A - 1) Компиляция 2) Выполнение

> $ gcc pmulti.c -o pmulti    
> $ ./pmulti

<result>
 I/O Input: 632 Output: 0

Случай B 1) Компиляция 2) Свободная память и кэш 3) Выполнить

> $ gcc pmulti.c -o pmulti
> # free && sync && echo 3 > /proc/sys/vm/drop_caches && free    
> $ ./pmulti

<result>
I/O Input: 1400 Output: 0

Как вы можете видеть, номер ввода - это случай A <случай B. Это должно означать, что что-то происходит во время его компиляции, и этоНа это влияет освобождение кеша и памяти. </p>

Почему и как это происходит?Где я могу узнать больше об этом?

Полный код: https://pastebin.com/R6v00LLW

Сокращенная версия моего кода:

struct rusage usage;

void *func1(void *vargp)
{

    /*     Manual System Calls Here     */


    return NULL;
}

void *func2(void *vargp)
{

    long pid;
    int stat_loc;

    if ((pid = (long) fork()) == 0){
        //Format string for execvp here
        char s[] = "/opt/sublime_text/sublime_text";    
        char* separator = " ";
        char* argv[64];
        int argc = 0;
        char* tmp;  
        argv[argc] = strtok_r(s, separator, &tmp);
        while( argv[argc] != NULL){
            argc+=1;
            argv[argc] = strtok_r(NULL, separator, &tmp);
        }
        execvp(argv[0],argv); 
    }
    else {
        waitpid(pid, & stat_loc, WUNTRACED);
    }  

    return NULL;
}

int main()
{    
    pthread_t thread_id[2];
    pthread_create(&thread_id[1], NULL, func2, NULL);
    pthread_create(&thread_id[0], NULL, func1, NULL);
    pthread_join(thread_id[0], NULL);
    pthread_join(thread_id[1], NULL);

    getrusage(RUSAGE_SELF, &usage);
    printf("Input: %ld Output: %ld\n", usage.ru_inblock, usage.ru_oublock);

    exit(0);
}

Цель этой программы:

Я пытаюсь найти способы улучшить время запуска / загрузки приложения.Я подумал, может быть, я смогу ускорить этот процесс, совершая системные вызовы вручную, используя многопоточность.Я просто студент, поэтому могу ошибаться в своем подходе.Я уже могу подумать, почему это не может работать, поскольку потоки выполняются одновременно, execvp может быть вызван перед этими системными вызовами: (

func1 выполняет ручные системные вызовы, а func2 выполняет Sublime Text.

Это часть моего проекта из класса «Операционные системы». Я запускаю его на Linux MintMate через VirtualBox на Windows 10.

1 Ответ

0 голосов
/ 01 июня 2018

Компилятор только что завершил запись в исполняемый файл.В результате многие, возможно, даже большинство страниц файла, вероятно, все еще будут находиться в буферном кеше, и при запуске программы их не нужно считывать с диска.

...