#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <string.h>
#include <time.h>
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;cnt<steps;++cnt){
i=(int)((rand()%steps)*(50*1048576))%end;
f=fopen(path,"r");
if (fgets(buf,128,f)){
fclose(f);
param=pars(buf,' ');
memset(buf,0,sizeof(buf));
old_pf=atoi(param[11]);
}
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);
mymemset((void*)c,0,i);
crnt_time=time(0)-crnt_time;
f=fopen(path,"r");
int t=(int)crnt_time;
if (fgets(buf,128,f)){
fclose(f);
param=pars(buf,' ');
memset(buf,0,sizeof(buf));
crnt_pf=atoi(param[11]);
}
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);
}
}
}
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<strlen(tmp);i++){
if (tmp[i]==c){
param[j]=(char*)malloc((i+1)*sizeof(char));
memset(param[j],0,sizeof(char)*(i+1));
for (k=0;k<i;k++){
param[j][k]=tmp[k];
}
param[j][k+1]=0;
j++;
tmp=tmp+i+1;
i=0;
k=0;
}
}
param[j]=(char*)malloc(strlen(tmp)*sizeof(char));
for (k=0;k<i;k++){
param[j][k]=tmp[k];
}
param[j+1]=0;
return param;
}
unsigned int maxbuffsize(){
unsigned int i=1048576;
void *c;
while(1){
c=(void*)malloc(i);
if (c==NULL){i=i-1048576;break;}
i=i+1048576;
free(c);
}
return i;
}