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

Ce programme compare le temps nécessaire pour lock/unlock avec un mutex et celui pour wait/post avec une sémaphore. More...

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

Classes

struct  arg
 Structure utilisé pour stocker deux mutex et deux sémaphores. More...
 

Macros

#define MAX_SIZE   3
 
#define TURN   100000000
 
#define MULTIPLICATEUR   1000
 
#define NUMBER_THREAD   10000
 

Functions

void * first (void *args)
 Fonction threader permettant de lancer la chaine des lock/unlock puis des wait/post. More...
 
void * other (void *args)
 
int main (int argc, char *argv[])
 

Variables

timert
 
int i
 
recordersem_rec
 
recordermut_rec
 

Detailed Description

Ce programme compare le temps nécessaire pour lock/unlock avec un mutex et celui pour wait/post avec une sémaphore.

Pour cela, nous allons créer une chaîne de thread ayant chacun un mutex et une sémaphore "personnelle". Pour un nombre "N" donné, nous allons lancer "N" thread où chaque thread bloquera son mutex et sa sémaphore. Chaque thread attendra ensuite que le thread précédent ait débloqué son mutex/sémaphore, pour à son tour débloqué le sien. Parmis ces threads, il y a un thread spécial : le first. Celui ci est chargé de débloqué en premier son mutex/sémaphore et de calculé le temps que cela prend pour lui revenir.

En schéma :

+----—+ +----—+ +----—+ +----—+ | first | | oth 1 | ... | oth 2 | | oth N | +----—+ +----—+ +----—+ +----—+ | ^___________| ^____________| ^____________| ^____________| ^

(1) (2) (3)
___________________________________________________________________

(1)

(1) : first unlock son mut1, ce qui permet à oth N de lock son mut2 (puisqu'ils pointent vers le même mutex) (2) : Puisque oth 1 a pu locker son mut2, il unlock son mut1 (3) : La chaîne continue (4) : Lorsque first peut enfin faire un lock sur son mut2, il arrete le timer et écrit dans le record

Macro Definition Documentation

#define MAX_SIZE   3
#define MULTIPLICATEUR   1000
#define NUMBER_THREAD   10000
#define TURN   100000000

Function Documentation

void* first ( void *  args)

Fonction threader permettant de lancer la chaine des lock/unlock puis des wait/post.

Cette fonction lance donc la chaîne et calcul le temps qu'il faut pour la parcourir completement. Une fois les temps calculé, ils sont stocké dans les records

68  {
69  struct arg* mutex = (struct arg*) args;
70 
71  // Bloque sont propre mutex et sémaphore
72  pthread_mutex_lock(mutex->mut1);
73  sem_wait(mutex->sem1);
74 
75  // Attend une seconde pour être sur que tout le monde ait bloqué son mutex et sa sémaphore
76  sleep(1);
77 
78  // Commence le timer et débloque son mutex pour commencer la cascade de lock/unlock
79  start_timer(t);
80  pthread_mutex_unlock(mutex->mut1);
81  pthread_mutex_lock(mutex->mut2);
83 
84  sleep(1);
85 
86  // Commence le timer et débloque sa sémaphore pour commencer la cascade de wait/post
87  start_timer(t);
88  sem_post(mutex->sem1);
89  sem_wait(mutex->sem2);
91 
92  return NULL;
93 }
pthread_mutex_t * mut2
Definition: mutsem.c:57
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
timer * t
Definition: mutsem.c:42
Structure utilisé pour stocker deux mutex et deux sémaphores.
Definition: mutsem.c:55
pthread_mutex_t * mut1
Definition: mutsem.c:56
#define MULTIPLICATEUR
Definition: mutsem.c:47
recorder * sem_rec
Definition: mutsem.c:44
sem_t * sem1
Definition: mutsem.c:58
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 * mut_rec
Definition: mutsem.c:45
sem_t * sem2
Definition: mutsem.c:59
long int stop_timer(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:133
int main ( int  argc,
char *  argv[] 
)

Remplissage des N arguments compris entre 1 et N. Pour un argument A tel que : * 1 < A < N-1 : mut1 de A = mut2 de A-1 et mut2 de A = mut1 de A+1 A = 1 : mut1 de A = mut2 de N et mut2 de A = mut1 de A+1 A = N : mut1 de A = mut2 de A-1 et mut2 de A = mut1 de 1

119  {
120  // Déclare un timer, ainsi que deux recorder qui vont contenir les résultats de l'exécution du programme
121  t = timer_alloc();
122  sem_rec = recorder_alloc("mutsem-sem.csv");
123  mut_rec = recorder_alloc("mutsem-mut.csv");
124 
125  int j;
126  pthread_t * threads;
127  pthread_mutex_t * mutex;
128  sem_t * sems;
129  struct arg * args;
130 
132  /* Alloue l'espace mémoire utilisé pour stocker les threads,
133  les mutex,
134  les sémaphores et
135  les structures contenant les arguments */
136  threads = malloc(i*sizeof(pthread_t));
137  mutex = malloc(i*sizeof(pthread_mutex_t));
138  sems = malloc(i*sizeof(sem_t));
139  args = malloc(i*sizeof(struct arg));
140 
141  if(threads == NULL || mutex == NULL || sems == NULL || args == NULL) {
142  perror("Impossible d'allouer la mémoire nécessaire : mutsem.c");
143  exit(EXIT_FAILURE);
144  }
145 
146  // Initialisation des mutex et sémaphores
147  for(j=0; j<i;j++) {
148  pthread_mutex_init(mutex+j, NULL);
149  sem_init(sems+j,0,1);
150  }
151 
157  for(j=0; j<i-1;j++) {
158  (args+j)->mut1 = mutex+j;
159  (args+j)->mut2 = (mutex+j+1);
160  (args+j)->sem1 = sems+j;
161  (args+j)->sem2 = (sems+j+1);
162  }
163  (args+i-1)->mut1 = (mutex+i-1);
164  (args+i-1)->mut2 = mutex;
165  (args+i-1)->sem1 = (sems+i-1);
166  (args+i-1)->sem2 = sems;
167 
168  // Démarrage des threads
169  pthread_create(threads, NULL, first, (void*)args);
170  for(j=1; j<i;j++)
171  pthread_create(threads+j, NULL, other, (void*)(args+j));
172 
173  // Récupération des threads
174  for(j=i-1; j>=0;j--)
175  pthread_join(*(threads+j), NULL);
176 
177  // Destruction des mutex et des sémaphores
178  for(j=0; j<i; j++) {
179  pthread_mutex_destroy(mutex+j);
180  sem_destroy(sems+j);
181  }
182 
183  // Libération de la mémoire
184  free(threads);
185  threads=NULL;
186  free(mutex);
187  mutex =NULL;
188  free(sems);
189  sems=NULL;
190  free(args);
191  args = NULL;
192  }
193 
196  timer_free(t);
197 
198  return EXIT_SUCCESS;
199 }
void timer_free(timer *t)
Retourne le temps en nanosecondes depuis le début de mesure dans t
Definition: benchmark.c:172
pthread_mutex_t * mut2
Definition: mutsem.c:57
timer * t
Definition: mutsem.c:42
Structure utilisé pour stocker deux mutex et deux sémaphores.
Definition: mutsem.c:55
pthread_mutex_t * mut1
Definition: mutsem.c:56
#define MULTIPLICATEUR
Definition: mutsem.c:47
recorder * sem_rec
Definition: mutsem.c:44
sem_t * sem1
Definition: mutsem.c:58
int i
Definition: mutsem.c:43
void * other(void *args)
Definition: mutsem.c:95
recorder * recorder_alloc(char *filename)
Alloue un recorder
Definition: benchmark.c:219
#define NUMBER_THREAD
Definition: mutsem.c:48
void * first(void *args)
Fonction threader permettant de lancer la chaine des lock/unlock puis des wait/post.
Definition: mutsem.c:68
recorder * mut_rec
Definition: mutsem.c:45
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
sem_t * sem2
Definition: mutsem.c:59
void* other ( void *  args)
95  {
96  struct arg * mutex = (struct arg*) args;
97 
98  // Bloque leur propre mutex/sem
99  pthread_mutex_lock(mutex->mut1);
100  sem_wait(mutex->sem1);
101 
102  // Attend une seconde pour être sur que tout le monde ait bloqué son mutex et sa sémaphore
103  sleep(1);
104 
105  // Une fois que le mutex précédent est débloqué, on débloque son mutex pour permettre au suivant de faire de même
106  pthread_mutex_lock(mutex->mut2);
107  pthread_mutex_unlock(mutex->mut1);
108 
109  // Idem avec les sémaphores
110  sem_wait(mutex->sem2);
111  sem_post(mutex->sem1);
112 
113  sleep(1);
114 
115  return NULL;
116 }
pthread_mutex_t * mut2
Definition: mutsem.c:57
Structure utilisé pour stocker deux mutex et deux sémaphores.
Definition: mutsem.c:55
pthread_mutex_t * mut1
Definition: mutsem.c:56
sem_t * sem1
Definition: mutsem.c:58
sem_t * sem2
Definition: mutsem.c:59

Variable Documentation

int i
recorder* mut_rec
recorder* sem_rec
timer* t