Queue de travail réseau
Le but de ce projet est de fournir la mécanique de base pour un calcul
réalisé par plusieurs machines. Un serveur construit une queue de travail.
Un client qui se connecte à ce serveur lui indique qu'il est prêt à effectuer une
partie du travail et récupère une des taches à effectuer. Une fois le calcul
fini sur le client, il renvoie le résultat au serveur et peut prendre une autre tache.
Pour simplifier la communication clients/serveurs, les taches sont représentées par
des fermetures. Elles sont envoyées du serveur vers le client en sérialisant
(voir le modufle Marshal) la fermeture. Pour que cela puisse se réaliser, il
est nécessaire que le client possède cette fermeture, en particulier le pointeur de code.
La seule manière possible de la faire en O'Caml est que le programme client soit le même
que le programme serveur. Ainsi le code de la fermeture sera à la bonne adresse.
On discrimenera le serveur du client sur le nom de la commande :
serveur.exe port&
client.exe machine port&
où serveur.exe
et client.exe
sont les mêmes exécutables/
Voici un exemple d'utilisation du module Marshall :
module type ST =
sig type t val to_string : t -> string val from_string : string -> t end
;;
module G =
struct
type t = {x:float; y:float}
let to_string (x:t) = Marshal.to_string x [Marshal.Closures]
let from_string s = ((Marshal.from_string s 0) : t)
end;;
module F (P:ST) = struct
module L = P
end;;
module H = F (G);;
# let u = {G.x = 3.14; G.y = 88.9};;
val u : G.t = {G.x=3.14; G.y=88.9}
# let s = H.L.to_string u;;
val s : string =
"\132\149\166\190\000\000\000\018\000\000\000\001\000\000\... "
# let v = H.L.from_string s;;
val v : H.L.t = {G.x=3.14; G.y=88.9}
Il est demandé d'écrire :
-
Les différents modules paramétrés pour la gestion de la communicatin et
de la queue de travail.
- Une petite application calcul numérique. On part d'une lsite
importante de matrices caréées, et on profite de l'associativité du produit
pour effectuer le produit 2 à 2. Pour une liste de 100 matrices,