Bienvenue invité ( Connexion | Inscription )
Il est interdit de poster directement à la racine de ce forum.
Veuillez créer votre topic dans le sous-forum approprié.
3 Aug 2004, 23:21
Message
#1
|
|
![]() Méchant modérateur paranoïaque ![]() ![]() ![]() ![]() ![]() Groupe : Modérateurs Messages : 10 755 Inscrit : 24 Jan 2002 Lieu : Confoederatio Helvetica, Kanton Wallis Membre no 1 865 |
J'ai besoin de sémaphores.... avec des pthreads. Je m suis dis que le semaphore.h serait tout à fait judicieux.... mais voilà, c'est implémenté à moitié, faut passer par sem_open() et non sem_init() qui n'est pas implémenté
Y a quoi d'autre, parce qu'à coup de sem_open je n'arrive pas à m'en sortir, j'ai des erreurs dans tous les coins sur les sem_wait etc. -------------------- Nothing Else Matters
|
|
|
|
![]() |
5 Aug 2004, 04:49
Message
#2
|
|
![]() Méchant modérateur paranoïaque ![]() ![]() ![]() ![]() ![]() Groupe : Modérateurs Messages : 10 755 Inscrit : 24 Jan 2002 Lieu : Confoederatio Helvetica, Kanton Wallis Membre no 1 865 |
Bon ben j'ai réussis à obtenir ce que je voulais finalement
Il ne me reste plus qu'à développer la partie "bench", parce que pour l'instant ça teste un peu n'importe quoi.... si quelqu'un est intéressé, c'est avec plaisir Le but étant de tester le débit (éventuellement les temps d'accès) de n'importe quel disque passé en argument.... On teste le débit pour une tache, puis deux, puis trois puis........ ça devrait bouchonner assez rapidement. Ensuite on peut facilement recracher les résultats et les parser pour en faire un graphe tri-dimensionnel.... enfin CODE #include <pthread.h>
#include <sys/time.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #define NBR_TASK_MAX 15 #define NBR_ECHANTILLONS_MAX 50 //taille des paquets a ecrire int size_buffer[] = { 4, 8, 16, 32, 64, 128, 256, 512, 1024};// 2048, 16384}; //mutex de sync des taches de bench int n = 0; /* Nombre de taches */ pthread_cond_t cond; pthread_mutex_t verrou; void rendez_vous () { pthread_mutex_lock (&verrou); n = n - 1; if (n == 0) pthread_cond_broadcast (&cond); else pthread_cond_wait (&cond, &verrou); n = n + 1; pthread_mutex_unlock (&verrou); } //mutex global utilise par la tache de control pour lancer les taches //suivantes int m = 1; /* Nombre de taches init a 1 a cause de la tache de control*/ pthread_cond_t cond_glob; pthread_mutex_t verrou_glob; void rendez_vous_glob () { pthread_mutex_lock (&verrou_glob); m = m - 1; if (m == 0) pthread_cond_broadcast (&cond_glob); else pthread_cond_wait (&cond_glob, &verrou_glob); m = m + 1; pthread_mutex_unlock (&verrou_glob); } //tache de bench bouclant sur le tableau de la taille des buffer void *thr_bench(void * arg) { //on prepare les fichiers de sortie FILE *fout; struct timeval tp1; struct timeval tp2; double s1, s2, m1, m2; double total = 0, temp; //echantillonage cad nombre de test d'ecriture int nbr_echant = NBR_ECHANTILLONS_MAX, nbr_echant_i; unsigned int iter_buf; unsigned max_iter_buff = sizeof(size_buffer)/sizeof(int); for( iter_buf = 0; iter_buf < max_iter_buff; iter_buf++) { int size_kilo = size_buffer[iter_buf]; //la taille d'un char fait 1 octet char *buf = (char*)malloc (sizeof(char)*(size_kilo*1000)); rendez_vous(); for( nbr_echant_i = nbr_echant; nbr_echant_i > 0; nbr_echant_i--) { gettimeofday(&tp1,0); s1 = tp1.tv_sec; m1 = tp1.tv_usec; fout = tmpfile(); fwrite(buf,1, size_kilo*1000,fout); gettimeofday(&tp2,0); s2 = tp2.tv_sec; m2 = tp2.tv_usec; temp = s2-s1+(m2-m1)/1000000; total = total + temp; fclose(fout); } printf("%d Ko en %lf sec = %lf Mo/s\n" , size_kilo, total/nbr_echant, (size_kilo/(total/nbr_echant))/1000 ); free(buf); sleep(1); } rendez_vous_glob(); pthread_exit(NULL); } //tache de control, lance paquet de tache par paquet de taches void *thr_control(void * arg) { unsigned int nbr_task; unsigned int iter_thr; for(nbr_task = 1; nbr_task < NBR_TASK_MAX; nbr_task++) { pthread_t thr[nbr_task]; pthread_mutex_lock (&verrou); n++; pthread_mutex_unlock (&verrou); pthread_mutex_lock (&verrou_glob); m++; pthread_mutex_unlock (&verrou_glob); for (iter_thr = 0; iter_thr < nbr_task; iter_thr++) { pthread_create(&thr[iter_thr], NULL, thr_bench, NULL ); } rendez_vous_glob(); } pthread_exit(NULL); } //main, initialise les mutex et lance la tache de control int main (int argc, const char * argv[]) { pthread_t thr; //initialisation des mutex if (pthread_mutex_init (&verrou, NULL) == -1) printf ("Error setting up mutex"); if (pthread_cond_init (&cond, NULL) == -1) printf ("Error setting up condition signal"); if (pthread_mutex_init (&verrou_glob, NULL) == -1) printf ("Error setting up mutex"); if (pthread_cond_init (&cond_glob, NULL) == -1) printf ("Error setting up condition signal"); pthread_create(&thr, NULL, thr_control, NULL ); pthread_exit(NULL); }
Fichier(s) joint(s)
main.c.zip ( 1.37 Ko )
Nombre de téléchargements : 102
image.jpg ( 46.71 Ko )
Nombre de téléchargements : 169-------------------- Nothing Else Matters
|
|
|
|
dulrich semaphore.h 3 Aug 2004, 23:21
f_cam sem_init est facultatif.
Ca marche pas un truc du... 3 Aug 2004, 23:38
dulrich pb sem_wait: Bad file descriptor
sem.h c... 4 Aug 2004, 00:08
f_cam C'est bizarre ces sémaphores de chez sem_open... 4 Aug 2004, 00:32
dulrich merci
je me suis aussi fait avoir en oublant de ... 4 Aug 2004, 00:36
f_cam bein en tournant en tant que root tu pourras toujo... 4 Aug 2004, 00:47
dulrich y a une notion de rendez-vous en C ? 5 Aug 2004, 02:19
Driden QUOTE(dulrich1 @ 5 Aug 2004, 03:19)y a une no... 5 Aug 2004, 02:24
dulrich CODEint n = 2; /* Nombre de taches */
pthread_co... 5 Aug 2004, 02:33
Driden QUOTE(dulrich1 @ 5 Aug 2004, 03:33)mais je vo... 5 Aug 2004, 02:41
juli1- CITATION(dulrich @ 5 Aug 2004, 02:33) 799... 19 Dec 2007, 15:47
guiguiguillaume Petit commentaire vis à vis du message plus haut ... 5 Aug 2004, 07:06
f_cam QUOTE(guiguiguillaume @ 5 Aug 2004, 08:06)Pet... 5 Aug 2004, 11:29
SuperCed Pour info, mais je ne suis pas bien sur de moi là... 5 Aug 2004, 09:20
f_cam effectivement, avec plein de threads ça va pas ê... 8 Aug 2004, 22:44
dulrich QUOTE(f_cam @ 8 Aug 2004, 23:44)effectivement... 8 Aug 2004, 23:10
f_cam pour avoir des gros débits.
Ce mutex est global,... 8 Aug 2004, 23:24![]() ![]() |
| Nous sommes le : 3rd November 2025 - 04:02 |