summaryrefslogtreecommitdiff
path: root/src/kahnsock.ml
blob: 6cdfadd425abdc1196976957dcc4b196c3b27382 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Random.self_init ()

type ident = (int * int * int * int)
let gen_ident () =
    Random.int 1000000000, Random.int 1000000000,
    Random.int 1000000000, Random.int 1000000000

module Sock : Kahn.S = struct

    (* L'idée :
        - L'ensemble des noeuds qui font du calcul est un arbre.
          Le premier noeud lancé est la racine de l'arbre ; tous les
          noeuds qui se connectent par la suite se connectent à un
          noeud déjà présent et sont donc son fils.
        - Les processus sont des fermetures de type unit -> unit,
          transmises par des canaux
        - Un noeud de calcul est un processus ocaml avec un seul
          thread. Le parallélisme est coopératif (penser à faire
          des binds assez souvent).
        - Les noeuds publient régulièrement leur load, ie le nombre
          de processus en attente et qui ne sont pas en train
          d'attendre des données depuis un canal. Si un noeud a un
          voisin dont le load est plus faible que le sien d'une
          quantité plus grande que 2, il délègue une tâche.
        - Le noeud racine délègue toutes ses tâches et sert uniquement
          pour les entrées-sorties
        - Comportement indéterminé lorsqu'un noeud se déconnecte
          (des processus peuvent disparaître, le réseau est cassé...)
        - Les canaux sont identifiés par le type ident décrit
          ci-dessus. Lorsque quelqu'un écrit sur un canal, tout le
          monde le sait. Lorsque quelqu'un lit sur un canal, tout le
          monde le sait. (on n'est pas capable de déterminer
          quel est le noeud propriétaire du processus devant lire
          le message) Les communications sont donc coûteuses.
    *)

    type 'a process = (unit -> 'a)

    type 'a in_port = ident
    type 'a out_port = ident

    let cin = (0, 0, 0, 0)
    let cout = (0, 0, 0, 1)

end