# Projet Système : Analyse Distribuée de Générateurs Aléatoires **Auteurs :** REDJRADJ Yacine et YAHIA Yanis **Cours :** Systèmes d'Exploitation - 28 Décembre 2025 --- # Description du Projet Ce projet implémente une architecture de calcul **distribuée (Maître/Esclave)** pour analyser et comparer la qualité statistique de deux générateurs de nombres pseudo-aléatoires : 1. **`rand()`** (Standard C, rapide mais moins précis). 2. **`drand48()`** (Haute précision 48-bits). Le système distribue la charge de calcul (des centaines de millions de lancers) sur plusieurs machines connectées en réseau via TCP/IP. Chaque machine esclave utilise ensuite le parallélisme local (multi-processus) pour maximiser les performances avant de renvoyer les résultats au maître. --- # Architecture Technique Le projet respecte strictement les contraintes de programmation système (**pas de threads**, uniquement des processus lourds). ## 1. Le Maître (`maitre.c`) * **Rôle :** Orchestrateur et Serveur TCP. * **Fonctionnement :** * Attend la connexion de N esclaves. * Distribue la charge de travail équitablement entre les esclaves connectés. * Reçoit les histogrammes partiels via le réseau (gestion des paquets fragmentés avec `MSG_WAITALL`). * Fusionne les résultats et affiche un comparatif statistique (Erreur Relative par rapport à la distribution uniforme idéale). ##2. L'Esclave (`esclave.c`) * **Rôle :** Ouvrier de calcul et Client TCP. * **Fonctionnement :** * Se connecte au maître et reçoit la mission (nombre de lancers). * **Architecture Multi-Processus :** Utilise `fork()` pour créer 4 processus enfants qui travaillent en parallèle. * **Mémoire Partagée (SHM) :** Utilise `mmap` (avec `MAP_SHARED`) pour stocker les résultats communs entre le père et les fils. * **Synchronisation (Sans Threads) :** Utilise les **Sémaphores System V** (`sys/sem.h`, `semget`, `semop`) pour protéger l'accès à la mémoire partagée (exclusion mutuelle) lors de la fusion des résultats. * **Double Calcul :** Calcule simultanément les histogrammes pour `rand` et `drand48` afin de permettre une comparaison directe. --- ###Compilation Le code est compatible **Linux** et **Windows** (via WSL - Windows Subsystem for Linux). Aucune bibliothèque externe complexe n'est requise. ### Compiler le Maître (Sur PC Linux) L'option `-lm` est nécessaire pour les fonctions mathématiques (`fabs`, etc.). gcc maitre.c -o maitre -lm`bash ### Compiler l'Esclave (Sur PC Linux) gcc esclave.c -o esclave ###Guide d'Exécution (Démonstration Multi-Machines) Récupérez l'adresse IP du PC Maître : hostname -I ####Notez l'IP (ex: 192.168.1.45 ou 172.20.10.3) Lancez le maître en attente de 1 esclave pour 100 millions de lancers sur le port 8080 : ./maitre 8080 1 100000000 Lancement de l'Esclave Sur le second PC, connectez-vous au maître en utilisant son IP. #### Syntaxe : ./esclave ./esclave 192.168.1.45 8080