程序编译在执行前是否在缓存中存储了一些数据??(C、Linux)
程序的编译在执行之前是否在缓存中存储了一些数据 我在Linux中编写了一个C程序,它在一个线程中启动升华文本,在另一个线程中进行手动系统调用。(我将在最后解释我为什么这样做,因为这与这个问题无关)程序编译在执行前是否在缓存中存储了一些数据??(C、Linux),c,linux,multithreading,terminal,getrusage,C,Linux,Multithreading,Terminal,Getrusage,程序的编译在执行之前是否在缓存中存储了一些数据 我在Linux中编写了一个C程序,它在一个线程中启动升华文本,在另一个线程中进行手动系统调用。(我将在最后解释我为什么这样做,因为这与这个问题无关) 我用它来测量I/O的数量 我的问题是,在编译之后,I/O输入的数量就减少了很多。换句话说,如果我不在编译和执行之间释放缓存和内存,I/O的数量就会减少很多为什么以及如何发生这种情况?请参见下面的案例 案例A-1)编译2)执行 本计划的目的: 我正试图想出一些方法来改进应用程序的启动/加载时间。我在想也
我用它来测量I/O的数量 我的问题是,在编译之后,I/O输入的数量就减少了很多。换句话说,如果我不在编译和执行之间释放缓存和内存,I/O的数量就会减少很多为什么以及如何发生这种情况?请参见下面的案例 案例A-1)编译2)执行 本计划的目的: 我正试图想出一些方法来改进应用程序的启动/加载时间。我在想也许我可以通过使用多线程进行手动系统调用来加速这个过程。我只是个学生,所以我的方法可能完全错了。我已经想到了为什么这不起作用,因为线程是并发执行的,所以在这些系统调用之前可能会调用execvp:( func1进行手动系统调用,func2执行升华文本 这是我操作系统课程学期专题的一部分。
我通过Windows 10上的VirtualBox在Linux MintMate上运行此程序。编译器刚刚完成对可执行文件的写入。因此,文件中的许多甚至大部分页面可能仍在缓冲区缓存中,在运行程序时不需要从磁盘读回。我应该搜索什么关键字或者想了解更多信息?谢谢(通过评论)回答我的另一个问题。顺便说一句,搜索“linux页面缓存”。
> $ gcc pmulti.c -o pmulti
> $ ./pmulti
<result>
I/O Input: 632 Output: 0
> $ gcc pmulti.c -o pmulti
> # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
> $ ./pmulti
<result>
I/O Input: 1400 Output: 0
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);
}