#include #include #include #include #include #include #include #include char** pars(char *tmp, char c); unsigned int maxbuffsize(); void *mymemset(void *p, int c, size_t n); int main(){ pid_t p=getpid(); int i=50*1048576; int start; unsigned int end; int old_pf=0; int crnt_pf=0; void *c=NULL; char path[30]; char ch; char buf[128]; char **param; sprintf(path,"%s%d%s","/proc/",p,"/stat"); FILE *f; FILE *fg; int g_hf=0; int g_chf=0; int cnt=0; clock_t crnt_time; printf("Help\n 1 - Find start use swap\n 2 - Linear address\n 3 - Cyclic address\n 4 - Random address\n 5 - exit\n"); printf(":>"); while (ch=getc(stdin)){ old_pf=0; crnt_pf=0; g_hf=0; g_chf=0; switch(ch){ case '1': end=maxbuffsize(); printf("From 0 to %d\n",end/1048576); c=(void*)malloc(end); f=fopen(path,"r"); if (f==NULL)printf("can't open file %s",path); if (fgets(buf,128,f)){ param=pars(buf,' '); old_pf=atoi(param[11]); } i=50*1048576; while (1){ c=mymemset((void*)c,0,i); f=fopen(path,"r"); if (f==NULL)printf("can't open file %s",path); if (fgets(buf,128,f)){ param=pars(buf,' '); crnt_pf=atoi(param[11]); if (old_pf-crnt_pf<0){ printf("Process start use swap at: %d megabytes\n",i/1048576); break; } old_pf=crnt_pf; } i=i+50*1048576; } free(c); printf(":>"); break; case '2': end=maxbuffsize(); printf("From 0 to %d\n",end/1048576); c=(void*)malloc(end); i=1048576*50; f=fopen(path,"r"); fg=fopen("/proc/vmstat","r"); while(fgets(buf,128,fg)){ if (strstr(buf,"pgmajfault")){ param=pars(buf,' '); g_hf=atoi(param[1]); break; } } fclose(fg); if (fgets(buf,128,f)){ fclose(f); param=pars(buf,' '); old_pf=atoi(param[11]); printf("Local statistics: major page fault=%d Global statistics: major page fault=%d \n",old_pf,g_hf); memset(buf,0,sizeof(buf)); } while (i+(50*1048576)<=end){ if (c==NULL){ printf("Unable to allocate memory\n"); break; }else{ f=fopen(path,"r"); if (fgets(buf,128,f)){ fclose(f); param=pars(buf,' '); memset(buf,0,sizeof(buf)); old_pf=atoi(param[11]); int t=(int)crnt_time; fg=fopen("/proc/vmstat","r"); while(fgets(buf,128,fg)){ if (strstr(buf,"pgmajfault")){ char**param1=pars(buf,' '); g_hf=atoi(param1[1]); break; } } } fclose(fg); crnt_time=time(0); c=mymemset((void*)c,0,i); crnt_time=time(0)-crnt_time; f=fopen(path,"r"); if (fgets(buf,128,f)){ fclose(f); param=pars(buf,' '); memset(buf,0,sizeof(buf)); crnt_pf=atoi(param[11]); int t=(int)crnt_time; fg=fopen("/proc/vmstat","r"); while(fgets(buf,128,fg)){ if (strstr(buf,"pgmajfault")){ char**param1=pars(buf,' '); g_chf=atoi(param1[1]); break; } } fclose(fg); if (t>0){ printf("Allocated memory = %dmb Local fault=%d fault/sec=%d Global fault=%d fault/sec=%d Time=%.1f\n",i/1048576,(crnt_pf-old_pf),(crnt_pf-old_pf)/t,(g_chf-g_hf),(g_chf-g_hf)/t,(double)crnt_time); }else { printf("Allocated memory = %dmb Local fault=%d fault/sec=%d Global fault=%d fault/sec=%d Time=%.1f\n",i/1048576,(crnt_pf-old_pf),(crnt_pf-old_pf),(g_chf-g_hf),(g_chf-g_hf),(double)crnt_time); } } i=i+50*1048576; } } free(c); c=NULL; printf(":>"); break; case '3': end=maxbuffsize(); printf("From 0 to %d\n",end/1048576); c=(void*)malloc(end); i=1048576*50; f=fopen(path,"r"); fg=fopen("/proc/vmstat","r"); while(fgets(buf,128,fg)){ if (strstr(buf,"pgmajfault")){ param=pars(buf,' '); g_hf=atoi(param[1]); break; } } fclose(fg); if (fgets(buf,128,f)){ fclose(f); param=pars(buf,' '); old_pf=atoi(param[11]); printf("Local statistics: major page fault=%d Global statistics: major page fault=%d \n",old_pf,g_hf); memset(buf,0,sizeof(buf)); } for (cnt=1;cnt<4;cnt++){ printf("The %d iteration\n",cnt); while(i+(50*1048576)<=end){ if (c==NULL){ printf("Unable to allocate memory\n"); break; }else{ f=fopen(path,"r"); if (fgets(buf,128,f)){ fclose(f); param=pars(buf,' '); memset(buf,0,sizeof(buf)); old_pf=atoi(param[11]); int t=(int)crnt_time; fg=fopen("/proc/vmstat","r"); while(fgets(buf,128,fg)){ if (strstr(buf,"pgmajfault")){ char**param1=pars(buf,' '); g_hf=atoi(param1[1]); break; } } } fclose(fg); crnt_time=time(0); c=mymemset((void*)c,0,i); crnt_time=time(0)-crnt_time; f=fopen(path,"r"); if (fgets(buf,128,f)){ fclose(f); param=pars(buf,' '); memset(buf,0,sizeof(buf)); crnt_pf=atoi(param[11]); int t=(int)crnt_time; fg=fopen("/proc/vmstat","r"); while(fgets(buf,128,fg)){ if (strstr(buf,"pgmajfault")){ char**param1=pars(buf,' '); g_chf=atoi(param1[1]); break; } } fclose(fg); if (t>0){ printf("Allocated memory = %dmb Local fault=%d fault/sec=%d Global fault=%d fault/sec=%d Time=%.1f\n",i/1048576,(crnt_pf-old_pf),(crnt_pf-old_pf)/t,(g_chf-g_hf),(g_chf-g_hf)/t,(double)crnt_time); }else { printf("Allocated memory = %dmb Local fault=%d fault/sec=%d Global fault=%d fault/sec=%d Time=%.1f\n",i/1048576,(crnt_pf-old_pf),(crnt_pf-old_pf),(g_chf-g_hf),(g_chf-g_hf),(double)crnt_time); } } i=i+50*1048576; } } i=50*1048576; } free(c); c=NULL; printf(":>"); break; case '4':{ end=maxbuffsize(); printf("From 0 to %d\n",end/1048576); f=fopen(path,"r"); fg=fopen("/proc/vmstat","r"); while(fgets(buf,128,fg)){ if (strstr(buf,"pgmajfault")){ param=pars(buf,' '); g_hf=atoi(param[1]); break; } } fclose(fg); if (fgets(buf,128,f)){ fclose(f); param=pars(buf,' '); old_pf=atoi(param[11]); printf("Local statistics: major page fault=%d Global statistics: major page fault=%d \n",old_pf,g_hf); memset(buf,0,sizeof(buf)); } c=(void*)malloc(end); int steps=end/(50*1048576); for(cnt=0;cnt0){ printf("Allocated memory = %dmb Local fault=%d fault/sec=%d Global fault=%d fault/sec=%d Time=%.1f\n",i/1048576,(crnt_pf-old_pf),(crnt_pf-old_pf)/t,(g_chf-g_hf),(g_chf-g_hf)/t,(double)crnt_time); }else { printf("Allocated memory = %dmb Local fault=%d fault/sec=%d Global fault=%d fault/sec=%d Time=%.1f\n",i/1048576,(crnt_pf-old_pf),(crnt_pf-old_pf),(g_chf-g_hf),(g_chf-g_hf),(double)crnt_time); } } } free(c); c=NULL; printf(":>"); break; case '5': return 0; break; } } } void *mymemset(void *p, int c, size_t n){ char *pb=(char*)p; char *pbend=pb+n; while(pb!=pbend){ *pb++=c; } return p; } char** pars(char *tmp, char c){ int i=0; int j=0; char **param; while (tmp[i]==' '){ if (tmp[i]=' '){ tmp=tmp+1; }else break; } for (i=0;i<=strlen(tmp);i++){ if (tmp[i]==c){ j++; } } j=j+2; param=(char**)malloc((j)*sizeof(char*)); memset(param,'\0',sizeof(param)); i=0; j=0;int k=0; for (i=0;i