Benchmark
 All Classes Files Functions Variables Typedefs Macros
Macros | Functions | Variables
memfork.c File Reference

Ce programme compare le temps nécessaire pour effectuer le "copy-on-write". More...

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>
#include <semaphore.h>
#include <pthread.h>
#include "../lib/benchmark.c"
#include "../lib/benchmark.h"

Macros

#define N   10000
 
#define MULTIPLICATEUR   1024
 

Functions

long int parcoursTab (timer *t, int i, char **tab)
 
int main (int argc, char *argv[])
 

Variables

timert
 
recorderbftfork_rec
 
recorderaftfork_rec
 
recorderaftmodif_rec
 

Detailed Description

Ce programme compare le temps nécessaire pour effectuer le "copy-on-write".

Pour cela, nous allons donc faire un fork, modifier deux fois les données dans le fils et comparer la différence entre les deux. Cette différence représente le temps nécessaire au copy-on-write.

Dans le cas de l'utilisation de perf, on ne réécrit pas dans les records et n'effectue une seule des deux modifications. Dans ce cas la, on fait le perf sur la taille maximun

Macro Definition Documentation

#define MULTIPLICATEUR   1024
#define N   10000

Function Documentation

int main ( int  argc,
char *  argv[] 
)
46  {
47  // Regarde les arguments
48  int perfbft = argc>1 && strncmp(argv[1], "--before", 9);
49  int perfaft = argc>1 &&strncmp(argv[1], "--after", 8);
50 
51 
52  if((!perfbft) && !perfaft) {
53  // Déclare un timer, ainsi que deux recorder qui vont contenir les résultats de l'exécution du programme
54  t = timer_alloc();
55  bftfork_rec = recorder_alloc("memfor-beforefork.csv");
56  aftfork_rec = recorder_alloc("memfor-aftfork.csv");
57  aftmodif_rec = recorder_alloc("memfor-aftmodif.csv");
58  }
59 
60  pid_t pid;
61  int status, i, j;
62  long int resultbft, resultaft;
63  for (i = MULTIPLICATEUR; i < N; i+=MULTIPLICATEUR) {
64 
65  if(perfaft || perfbft)
66  i = N;
67 
68  char ** tab = malloc(i*sizeof(char*));
69  if(tab == NULL) {
70  perror("malloc fail");
71  exit(EXIT_FAILURE);
72  }
73  for(j=0; j<i; j++)
74  tab[j] = malloc(i*sizeof(char));
75 
76 
77  // On le parcours une fois avant le fork pour avoir une mesure de référence
78  if( !perfbft && !perfaft)
80 
81 
82  pid = fork();
83 
84  if (pid == -1) {
85  // erreur à l'exécution de fork
86  perror("fork");
87  return EXIT_FAILURE;
88  }
89  if (pid == 0) {
90  // processus fils
91  sleep(1);
92 
93  // On le parcours lors du copy-on-write
94  if(!perfaft)
95  resultbft = parcoursTab(t, i, tab);
96 
97  sleep(1);
98 
99  // On le parcours apres le copy-on-write
100  if(! perfbft)
101  resultaft = parcoursTab(t, i, tab);
102 
103 
104  if(!perfbft && !perfaft) {
105  write_record(aftfork_rec, i/MULTIPLICATEUR, resultbft);
107  }
108 
109  // Libération du tableau et des records si ils sont alloués
110  if(!perfbft && !perfaft) {
114  timer_free(t);
115  }
116 
117  free(tab);
118  tab=NULL;
119  for(j=0; j<i; j++) {
120  free(tab[j]);
121  tab[j]=NULL;
122  }
123 
124  return EXIT_SUCCESS;
125  }
126  else {
127  // processus père
128  pid = waitpid(pid, &status, 0);
129 
130 
131  if (pid == -1) {
132  perror("wait");
133  return EXIT_FAILURE;
134  }
135  }
136 
137 
138  }
139 
140  // Libération du tableau et des records si ils sont alloués
141  if(!perfbft && !perfaft) {
145  timer_free(t);
146  }
147 
148 
149  return EXIT_SUCCESS;
150 }
recorder * aftmodif_rec
Definition: memfork.c:28
void timer_free(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:172
recorder * aftfork_rec
Definition: memfork.c:27
#define MULTIPLICATEUR
Definition: memfork.c:23
void write_record(recorder *rec, long int x, long int time)
Écris le temps time en correspondance avec x
Definition: benchmark.c:245
timer * t
Definition: memfork.c:25
recorder * bftfork_rec
Definition: memfork.c:26
int i
Definition: mutsem.c:43
#define N
Definition: memfork.c:22
recorder * recorder_alloc(char *filename)
Alloue un recorder
Definition: benchmark.c:219
void recorder_free(recorder *rec)
Libère toutes les resources utilisées par rec
Definition: benchmark.c:263
timer * timer_alloc()
Alloue un timer
Definition: benchmark.c:63
long int parcoursTab(timer *t, int i, char **tab)
Definition: memfork.c:33
long int parcoursTab ( timer t,
int  i,
char **  tab 
)

Parcours un tableau et calcul le temps nécessaire

33  {
34 
35  int j, k, res;
36  start_timer(t);
37  for(j=0; j<i; j++)
38  for(k=0; k<i; k++) {
39  res +=tab[j][k];
40  tab[j][k]=j+k;
41  }
42  return stop_timer(t);
43 }
int i
Definition: mutsem.c:43
void start_timer(timer *t)
Stoque le temps actuel comme début de la mesure dans t
Definition: benchmark.c:87
long int stop_timer(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:133

Variable Documentation

recorder* aftfork_rec
recorder* aftmodif_rec
recorder* bftfork_rec
timer* t