Process parameters ================== The process parameters are: initial_load [neighbors...] Communications ============== There are two receiving channels per host: control for information messages, and data for load transfers. Process model ============= Each process is made of 3 threads: a receiving thread, a computing thread, and a load-balancing thread. * Receiving thread ---------------- Loop | wait for a message to come, either on data channel, or on ctrl channel | push received message in a buffer of received messages | -> ctrl messages on the one side | -> data messages on the other side +- The loop terminates when a "finalize" message is received on each channel. * Computing thread ---------------- Loop | if we received some real load, get it (data messages) | if there is some real load to send, send it | if we own some load, simulate some computing on it | sleep a bit if we are looping too fast +- send CLOSE on data for all neighbors wait for CLOSE on data from all neighbors The loop terminates when process::still_running() returns false. (read the source for full details...) * Load-balancing thread --------------------- Loop | call load-balancing algorithm | send ctrl messages | sleep (min_lb_iter_duration) | receive ctrl messages +- send CLOSE on ctrl for all neighbors wait for CLOSE on ctrl from all neighbors The loop terminates when process::still_running() returns false. (read the source for full details...) Some notes about *load attributes ================================= process::real_load Current *real* load. Used for the computations. Displayed in log messages. process::expected_load Current load estimation. Used for load-balancing estimation, and for diffusing to neighbors. * Without bookkeeping, it equals real_load minus pending sends. * With bookkeeping, it corresponds to the "virtual load". process::received_load Real load received from neighbors. Used when receiveing data messages, and then added to real_load.