Benchmark
 All Classes Files Functions Variables Typedefs Macros
Macros | Functions
pipe.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <err.h>
#include <unistd.h>
#include <sys/wait.h>
#include "benchmark.h"

Macros

#define SIZE_MAX   65536
 

Functions

char * ipsum (int size)
 Alloue un string et l'init à 'a'. More...
 
int send (int size, int *fd)
 Envoie un string dans un pipe. More...
 
int respond (int size, int *fdin, int *fdout)
 Reçoit et renvoie un string dans un pipe. More...
 
int receive (int size, int *fd)
 Recois un string dans un pipe. More...
 
int main (int argc, char *argv[])
 Enregistre les vitesses de transfert dans des pipes entre processus. More...
 

Macro Definition Documentation

#define SIZE_MAX   65536

Function Documentation

char* ipsum ( int  size)

Alloue un string et l'init à 'a'.

Parameters
sizeTaille du string à allouer
Returns
Pointeur vers string
28  {
29  char* ipsum = (char*)malloc(sizeof(char)*size);
30  if (ipsum == NULL) err(1, "erreur de malloc dans ipsum");
31  memset(ipsum,'a',size);
32 
33  ipsum[size-1] = '\0';
34 
35  return ipsum;
36 
37 }
char * ipsum(int size)
Alloue un string et l'init à 'a'.
Definition: pipe.c:28
int main ( int  argc,
char *  argv[] 
)

Enregistre les vitesses de transfert dans des pipes entre processus.

Le but de ce banchmark est de voir l'évolution du temps mis à transferer des données par pipe entre 2 processus. On effectue le transfert de fichiers de plus en plus gros et en enregistre le temps mis dans un fichier .csv.

142  {
143  int fdin[2];
144  int fdout[2];
145  pipe(fdin);
146  pipe(fdout);
147 
148  timer *t = timer_alloc();
149  recorder *pipe_rec = recorder_alloc("pipe.csv");
150  //start_timer(t);
151  pid_t pid = fork();
152 
153  if (pid == 0) {
154  int i;
155  for (i=1; i<=SIZE_MAX; i*=2) {
156  start_timer(t);
157  int j;
158  for (j=0;j<10000;j++) {
159  send(i,fdin);
160  receive(i,fdout);
161  }
162  write_record_n(pipe_rec,i,stop_timer(t),SIZE_MAX);
163  }
164  exit(0);
165  } else if (pid < 0 ) {
166  err(pid, "erreur au fork");
167  } else {
168  int i;
169  for (i=1; i<=SIZE_MAX; i*=2) {
170  //start_timer(t);
171  int j;
172  for (j=0;j<10000;j++) {
173  respond(i,fdin,fdout);
174  }
175  //write_record_n(pipe_rec,i,stop_timer(t),SIZE_MAX);
176  }
177  }
178 
179  recorder_free(pipe_rec);
180  timer_free(t);
181 
182  return 0;
183 }
void timer_free(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:172
recorder écrit les temps dans un fichier .csv
Definition: benchmark.c:208
void write_record_n(recorder *rec, long int x, long int time, long n)
Comme write_record mais divise time par n après avoir retiré l'overhead
Definition: benchmark.c:253
int send(int size, int *fd)
Envoie un string dans un pipe.
Definition: pipe.c:50
timer permet de mesurer le temps écoulé entre deux moments
Definition: benchmark.c:43
timer * t
Definition: memfork.c:25
#define SIZE_MAX
Definition: pipe.c:17
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
recorder * recorder_alloc(char *filename)
Alloue un recorder
Definition: benchmark.c:219
int receive(int size, int *fd)
Recois un string dans un pipe.
Definition: pipe.c:115
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
int respond(int size, int *fdin, int *fdout)
Reçoit et renvoie un string dans un pipe.
Definition: pipe.c:80
long int stop_timer(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:133
int receive ( int  size,
int *  fd 
)

Recois un string dans un pipe.

Parameters
sizeTaille du string à allouer
fdFileDescriptor du pipe

Fonction que l'on donne au processus fils. Read un string de taille size dans un pipe vers le père

115  {
116 
117  if (size == 1) close(fd[1]);
118 
119  char* buffer = (char*)malloc(sizeof(char)*size);
120  if (buffer == NULL) err(1, "erreur de malloc dans receive");
121 
122  int received = read(fd[0], buffer, size);
123  if (received != size ) err(1,"erreur de read dans receive");
124 
125  //puts(buffer);
126 
127  free(buffer);
128 
129  //if (size == SIZE_MAX) close(fd[0]);
130 
131  return 0;
132 }
int respond ( int  size,
int *  fdin,
int *  fdout 
)

Reçoit et renvoie un string dans un pipe.

Parameters
sizeTaille du string à allouer
fdinFileDescriptor du pipe in
fdoutFileDescriptor du pipe out

Fonction que l'on donne au processus père. Read un string de taille size dans un pipe input, puis renvoie ce string vers le fils avec le pipe output

80  {
81 
82  if (size == 1) close(fdout[0]);
83  if (size == 1) close(fdin[1]);
84 
85  char* buffer = (char*)malloc(sizeof(char)*size);
86  if (buffer == NULL) err(1, "erreur de malloc dans respond");
87 
88  int received = read(fdin[0], buffer, size);
89  if (received != size ) err(1,"erreur de read dans respond");
90 
91  //puts(buffer);
92 
93  int sent = write(fdout[1], buffer, size);
94  if (sent != size ) err(1,"erreur de write dans respond");
95 
96  free(buffer);
97 
98  //if (size == SIZE_MAX) close(fdout[1]);
99  //if (size == SIZE_MAX) close(fdin[0]);
100 
101  return 0;
102 }
int send ( int  size,
int *  fd 
)

Envoie un string dans un pipe.

Parameters
sizeTaille du string à allouer
fdFileDescriptor du pipe

Fonction que l'on donne au processus fils. Write un string de taille size dans un pipe vers le père

50  {
51 
52  if (size == 1) close(fd[0]);
53 
54  char* message = ipsum(size);
55  if (message == NULL) err(1, "erreur de malloc dans send");
56 
57  int sent = write(fd[1], message, size);
58  if (sent != size ) err(1,"erreur de write dans send");
59 
60  free(message);
61 
62  //if (size == SIZE_MAX) close(fd[1]);
63 
64  return 0;
65 }
char * ipsum(int size)
Alloue un string et l'init à 'a'.
Definition: pipe.c:28