# 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 <IP_DU_MAITRE> <PORT>

./esclave 192.168.1.45 8080



