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 | |
timer * | t |
int | i |
recorder * | sem_rec |
recorder * | mut_rec |
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
#define MAX_SIZE 3 |
#define MULTIPLICATEUR 1000 |
#define NUMBER_THREAD 10000 |
#define TURN 100000000 |
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
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
void* other | ( | void * | args | ) |
int i |
recorder* mut_rec |
recorder* sem_rec |
timer* t |