Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
document the actor-{daemon,join,kill} C examples
[simgrid.git] / examples / README.rst
1 .. S4U (Simgrid for you) is the modern interface of SimGrid, which new project should use.
2 ..
3 .. This file follows the ReStructured syntax to be included in the
4 .. documentation, but it should remain readable directly.
5
6
7 Examples
8 ********
9
10 SimGrid comes with an extensive set of examples, documented on this
11 page. Most of them only demonstrate one single feature, with some
12 larger examplars listed below. 
13
14 The C++ examples can be found under examples/s4u while python examples
15 are in examples/python. Each such directory contains the source code (also listed
16 from this page), and the so-called tesh file containing how to call
17 the binary obtained by compiling this example and also the expected
18 output. Tesh files are used to turn each of our examples into an
19 integration test. Some examples also contain other files, on need.
20
21 A good way to bootstrap your own project is to copy and combine some
22 of the provided examples to constitute the skeleton of what you plan
23 to simulate.
24
25 .. _s4u_ex_actors:
26
27 ===========================
28 Actors: the Active Entities
29 ===========================
30
31 Starting and Stoping Actors
32 ---------------------------
33
34   - **Creating actors:**
35     Most actors are started from the deployment XML file, because this
36     is a :ref:`better scientific habbit <howto_science>`, but you can
37     also create them directly from your code.
38
39     .. tabs::
40     
41        .. example-tab:: examples/s4u/actor-create/s4u-actor-create.cpp
42        
43           You create actors either:
44              
45           - Directly with :cpp:func:`simgrid::s4u::Actor::create`
46           - From XML with :cpp:func:`simgrid::s4u::Engine::register_actor` (if your actor is a class)
47             or :cpp:func:`simgrid::s4u::Engine::register_function` (if your actor is a function)
48             and then :cpp:func:`simgrid::s4u::Engine::load_deployment`
49              
50        .. example-tab:: examples/python/actor-create/actor-create.py
51        
52           You create actors either:
53             
54           - Directly with :py:func:`simgrid.Actor.create()`
55           - From XML with :py:func:`simgrid.Engine.register_actor()` and then :py:func:`simgrid.Engine.load_deployment()`
56              
57        .. example-tab:: examples/c/actor-create/actor-create.c
58        
59           You create actors either:
60             
61           - Directly with :cpp:func:`sg_actor_create()` followed by :cpp:func:`sg_actor_start`.
62           - From XML with :cpp:func:`simgrid_register_function` and then :cpp:func:`simgrid_load_deployment`.
63              
64        .. example-tab:: examples/python/actor-create/actor-create_d.xml
65        
66           The following file is used in both C++ and Python.
67
68   - **React to the end of actors:** You can attach callbacks to the end of
69     actors. There is several ways of doing so, depending on whether you want to
70     attach your callback to a given actor and on how you define the end of a
71     given actor. User code probably want to react to the termination of an actor
72     while some plugins want to react to the destruction (memory collection) of
73     actors.
74
75     .. tabs::
76     
77        .. example-tab:: examples/s4u/actor-exiting/s4u-actor-exiting.cpp
78
79           This example shows how to attach a callback to:
80
81           - the end of a specific actor: :cpp:func:`simgrid::s4u::this_actor::on_exit()`
82           - the end of any actor: :cpp:member:`simgrid::s4u::Actor::on_termination()`
83           - the destruction of any actor: :cpp:member:`simgrid::s4u::Actor::on_destruction()`
84
85   - **Kill actors:**
86     Actors can forcefully stop other actors.
87     
88     .. tabs::
89     
90        .. example-tab:: examples/s4u/actor-kill/s4u-actor-kill.cpp
91        
92           See also :cpp:func:`void simgrid::s4u::Actor::kill(void)`, :cpp:func:`void simgrid::s4u::Actor::kill_all()`,
93           :cpp:func:`simgrid::s4u::this_actor::exit`, :cpp:func:`simgrid::s4u::this_actor::on_exit`.
94
95        .. example-tab:: examples/python/actor-kill/actor-kill.py
96
97           See also :py:func:`simgrid.Actor.kill`, :py:func:`simgrid.Actor.kill_all`, :py:func:`simgrid.this_actor.exit`,
98           :py:func:`simgrid.this_actor.on_exit`.
99           
100        .. example-tab:: examples/c/actor-kill/actor-kill.c
101
102           See also :cpp:func:`sg_actor_kill`, :cpp:func:`sg_actor_kill_all`, :cpp:func:`sg_actor_exit`, :cpp:func:`sg_actor_on_exit`.
103
104   - **Controling the actor life cycle from the XML:**
105     You can specify a start time and a kill time in the deployment file.
106
107     .. tabs::
108
109        .. example-tab:: examples/s4u/actor-lifetime/s4u-actor-lifetime.cpp
110
111           This file is not really interesting: the important matter is in the XML file.
112
113        .. example-tab:: examples/s4u/actor-lifetime/s4u-actor-lifetime_d.xml
114
115           This demonstrates the ``start_time`` and ``kill_time`` attribute of the :ref:`pf_tag_actor` tag.
116
117   - **Daemonize actors:**
118     Some actors may be intended to simulate daemons that run in background. This example show how to transform a regular
119     actor into a daemon that will be automatically killed once the simulation is over.
120     
121     .. tabs::
122
123        .. example-tab:: examples/s4u/actor-daemon/s4u-actor-daemon.cpp
124
125           See also :cpp:func:`simgrid::s4u::Actor::daemonize()` and :cpp:func:`simgrid::s4u::Actor::is_daemon()`.
126
127        .. example-tab:: examples/python/actor-daemon/actor-daemon.py
128
129           See also :py:func:`simgrid.Actor.daemonize()` and :py:func:`simgrid.Actor.is_daemon()`.
130
131        .. example-tab:: examples/c/actor-daemon/actor-daemon.c
132
133           See also :cpp:func:`sg_actor_daemonize` and :cpp:func:`sg_actor_is_daemon`.
134
135 Inter-Actors Interactions
136 -------------------------
137
138 See also the examples on :ref:`inter-actors communications
139 <s4u_ex_communication>` and the ones on :ref:`classical
140 synchronization objects <s4u_ex_IPC>`.
141
142   - **Suspend and Resume actors:**    
143     Actors can be suspended and resumed during their executions.
144
145     .. tabs::
146
147        .. example-tab:: examples/s4u/actor-suspend/s4u-actor-suspend.cpp
148
149           See also :cpp:func:`simgrid::s4u::this_actor::suspend()`,
150           :cpp:func:`simgrid::s4u::Actor::suspend()`, :cpp:func:`simgrid::s4u::Actor::resume()` and
151           :cpp:func:`simgrid::s4u::Actor::is_suspended()`.
152
153        .. example-tab:: examples/python/actor-suspend/actor-suspend.py
154
155           See also :py:func:`simgrid.this_actor.suspend()`,
156           :py:func:`simgrid.Actor.suspend()`, :py:func:`simgrid.Actor.resume()` and
157           :py:func:`simgrid.Actor.is_suspended()`.
158
159   - **Migrating Actors:**
160     Actors can move or be moved from a host to another very easily.
161
162     .. tabs::
163
164        .. example-tab:: examples/s4u/actor-migrate/s4u-actor-migrate.cpp
165
166           See also :cpp:func:`simgrid::s4u::this_actor::migrate()` and :cpp:func:`simgrid::s4u::Actor::migrate()`.
167
168        .. example-tab:: examples/python/actor-migrate/actor-migrate.py
169
170           See also :py:func:`simgrid.this_actor.migrate()` and :py:func:`simgrid.Actor.migrate()`.
171
172   - **Waiting for the termination of an actor:** (joining on it)
173     You can block the current actor until the end of another actor.
174
175     .. tabs::
176
177        .. example-tab:: examples/s4u/actor-join/s4u-actor-join.cpp
178
179           See also :cpp:func:`simgrid::s4u::Actor::join()`.
180
181        .. example-tab:: examples/python/actor-join/actor-join.py
182
183           See also :py:func:`simgrid.Actor.join()`.
184
185        .. example-tab:: examples/c/actor-join/actor-join.c
186
187           See also :cpp:func:`sg_actor_join`.
188
189   - **Yielding to other actors**.
190     The ```yield()``` function interrupts the execution of the current
191     actor, leaving a chance to the other actors that are ready to run
192     at this timestamp.
193
194     .. tabs::
195
196        .. example-tab:: examples/s4u/actor-yield/s4u-actor-yield.cpp
197
198           See also :cpp:func:`simgrid::s4u::this_actor::yield()`.
199
200        .. example-tab:: examples/python/actor-yield/actor-yield.py
201
202           See also :py:func:`simgrid.this_actor.yield_()`.
203
204 Traces Replay as a Workload
205 ---------------------------
206
207 This section details how to run trace-driven simulations. It is very
208 handy when you want to test an algorithm or protocol that only react
209 to external events. For example, many P2P protocols react to user
210 requests, but do nothing if there is no such event.
211
212 In such situations, you should write your protocol in C++, and separate
213 the workload that you want to play onto your protocol in a separate
214 text file. Declare a function handling each type of the events in your
215 trace, register them using :cpp:func:`xbt_replay_action_register()` in
216 your main, and then run the simulation.
217
218 Then, you can either have one trace file containing all your events,
219 or a file per simulated process: the former may be easier to work
220 with, but the second is more efficient on very large traces. Check
221 also the tesh files in the example directories for details.
222
223   - **Communication replay:**
224     Presents a set of event handlers reproducing classical communication
225     primitives (asynchronous send/receive at the moment).
226
227     .. tabs::
228
229        .. example-tab:: examples/s4u/replay-comm/s4u-replay-comm.cpp
230
231   - **I/O replay:**
232     Presents a set of event handlers reproducing classical I/O
233     primitives (open, read, close).
234
235     .. tabs::
236
237        .. example-tab:: examples/s4u/replay-io/s4u-replay-io.cpp
238
239 ==========================
240 Activities: what Actors do
241 ==========================
242
243 .. _s4u_ex_communication:
244
245 Communications on the Network
246 -----------------------------
247
248  - **Basic asynchronous communications:**
249    Illustrates how to have non-blocking communications, that are
250    communications running in the background leaving the process free
251    to do something else during their completion. 
252
253    .. tabs::
254
255       .. example-tab:: examples/s4u/async-wait/s4u-async-wait.cpp
256
257          See also :cpp:func:`simgrid::s4u::Mailbox::put_async()` and :cpp:func:`simgrid::s4u::Comm::wait()`.
258
259       .. example-tab:: examples/python/async-wait/async-wait.py
260
261          See also :py:func:`simgrid.Mailbox.put_async()` and :py:func:`simgrid.Comm.wait()`.
262
263  - **Waiting for all communications in a set:**
264    The ``wait_all()`` function is useful when you want to block until
265    all activities in a given set have completed. 
266    
267    .. tabs::
268
269       .. example-tab:: examples/s4u/async-waitall/s4u-async-waitall.cpp
270
271          See also :cpp:func:`simgrid::s4u::Comm::wait_all()`.
272
273       .. example-tab:: examples/python/async-waitall/async-waitall.py
274
275          See also :py:func:`simgrid.Comm.wait_all()`.
276
277  - **Waiting for the first completed communication in a set:**
278    The ``wait_any()`` function is useful
279    when you want to block until one activity of the set completes, no
280    matter which terminates first.
281    
282    .. tabs::
283
284       .. example-tab:: examples/s4u/async-waitany/s4u-async-waitany.cpp
285
286          See also :cpp:func:`simgrid::s4u::Comm::wait_any()`.
287
288       .. example-tab:: examples/python/async-waitany/async-waitany.py
289
290          See also :py:func:`simgrid.Comm.wait_any()`.
291          
292       .. example-tab:: examples/c/async-waitany/async-waitany.c
293
294          See also :cpp:func:`sg_comm_wait_any`.
295      
296 .. _s4u_ex_execution:
297
298 Executions on the CPU
299 ---------------------
300
301   - **Basic execution:**
302     The computations done in your program are not reported to the
303     simulated world, unless you explicitly request the simulator to pause
304     the actor until a given amount of flops gets computed on its simulated
305     host. Some executions can be given an higher priority so that they
306     get more resources.
307
308     .. tabs::
309
310        .. example-tab:: examples/s4u/exec-basic/s4u-exec-basic.cpp
311
312           See also :cpp:func:`void simgrid::s4u::this_actor::execute(double)`
313           and :cpp:func:`void simgrid::s4u::this_actor::execute(double, double)`.
314
315        .. example-tab:: examples/python/exec-basic/exec-basic.py
316
317           See also :py:func:`simgrid.this_actor.execute()`.
318
319   - **Asynchronous execution:**
320     You can start asynchronous executions, just like you would fire
321     background threads.
322
323     .. tabs::
324
325        .. example-tab:: examples/s4u/exec-async/s4u-exec-async.cpp
326
327           See also :cpp:func:`simgrid::s4u::this_actor::exec_init()`,
328           :cpp:func:`simgrid::s4u::Activity::start()`,
329           :cpp:func:`simgrid::s4u::Activity::wait()`,
330           :cpp:func:`simgrid::s4u::Activity::get_remaining()`,
331           :cpp:func:`simgrid::s4u::Exec::get_remaining_ratio()`,
332           :cpp:func:`simgrid::s4u::this_actor::exec_async()` and
333           :cpp:func:`simgrid::s4u::Activity::cancel()`.
334
335        .. example-tab:: examples/python/exec-async/exec-async.py
336     
337           See also :py:func:`simgrid.this_actor::exec_init()`,
338           :py:func:`simgrid.Activity::start()`,
339           :py:func:`simgrid.Activity.wait()`,
340           :py:func:`simgrid.Activity.get_remaining()`,
341           :py:func:`simgrid.Exec.get_remaining_ratio()`,
342           :py:func:`simgrid.this_actor.exec_async()` and
343           :py:func:`simgrid.Activity.cancel()`.
344
345   - **Remote execution:**
346     You can start executions on remote hosts, or even change the host
347     on which they occur during their execution.
348
349     .. tabs::
350
351        .. example-tab:: examples/s4u/exec-remote/s4u-exec-remote.cpp
352
353           See also :cpp:func:`simgrid::s4u::Exec::set_host()`.
354
355        .. example-tab:: examples/python/exec-remote/exec-remote.py
356
357           See also :py:func:`simgrid.Exec.set_host()`.
358
359   - **Parallel executions:**
360     These objects are convenient abstractions of parallel
361     computational kernels that span over several machines, such as a
362     PDGEM and the other ScaLAPACK routines. Note that this only works
363     with the "ptask_L07" host model (``--cfg=host/model:ptask_L07``).
364
365     .. tabs::
366
367        .. example-tab:: examples/s4u/exec-ptask/s4u-exec-ptask.cpp
368     
369           See also :cpp:func:`simgrid::s4u::this_actor::parallel_execute()`.
370
371   - **Using Pstates on a host:**
372     This example shows how define a set of pstates in the XML. The current pstate
373     of an host can then be accessed and changed from the program.
374
375     .. tabs::
376
377        .. example-tab:: examples/s4u/exec-dvfs/s4u-exec-dvfs.cpp
378
379           See also :cpp:func:`simgrid::s4u::Host::get_pstate_speed` and :cpp:func:`simgrid::s4u::Host::set_pstate`.
380
381        .. example-tab:: examples/python/exec-dvfs/exec-dvfs.py
382
383           See also :py:func:`Host.get_pstate_speed` and :py:func:`Host.set_pstate`.
384
385        .. example-tab:: examples/platforms/energy_platform.xml
386
387 .. _s4u_ex_disk_io:
388
389 I/O on Disks and Files
390 ----------------------
391
392 SimGrid provides two levels of abstraction to interact with the
393 simulated disks. At the simplest level, you simply create read and
394 write actions on the disk resources.
395
396   - **Access to raw disk devices:**
397     This example illustrates how to simply read and write data on a
398     simulated disk resource.
399
400     .. tabs::
401
402        .. example-tab:: examples/s4u/io-disk-raw/s4u-io-disk-raw.cpp
403
404        .. example-tab:: examples/platforms/hosts_with_disks.xml
405
406           This shows how to declare disks in XML.
407
408 The FileSystem plugin provides a more detailed view, with the
409 classical operations over files: open, move, unlink, and of course
410 read and write. The file and disk sizes are also dealt with and can
411 result in short reads and short write, as in reality.
412
413   - **File Management:**
414     This example illustrates the use of operations on files
415     (read, write, seek, tell, unlink, etc).
416
417     .. tabs::
418
419        .. example-tab:: examples/s4u/io-file-system/s4u-io-file-system.cpp
420
421   - **Remote I/O:**
422     I/O operations on files can also be done in a remote fashion, 
423     i.e. when the accessed disk is not mounted on the caller's host.
424
425     .. tabs::
426
427        .. example-tab:: examples/s4u/io-file-remote/s4u-io-file-remote.cpp
428
429 .. _s4u_ex_IPC:
430
431 Classical synchronization objects
432 ---------------------------------
433
434  - **Barrier:**
435    Shows how to use :cpp:type:`simgrid::s4u::Barrier` synchronization objects.
436
437    .. tabs::
438
439       .. example-tab:: examples/s4u/synchro-barrier/s4u-synchro-barrier.cpp
440
441  - **Condition variable:**
442    Shows how to use :cpp:type:`simgrid::s4u::ConditionVariable` synchronization objects.
443
444    .. tabs::
445
446       .. example-tab:: examples/s4u/synchro-condition-variable/s4u-synchro-condition-variable.cpp
447
448  - **Mutex:**
449    Shows how to use :cpp:type:`simgrid::s4u::Mutex` synchronization objects.
450
451    .. tabs::
452
453       .. example-tab:: examples/s4u/synchro-mutex/s4u-synchro-mutex.cpp
454
455  - **Semaphore:**
456    Shows how to use :cpp:type:`simgrid::s4u::Semaphore` synchronization objects.
457
458    .. tabs::
459
460       .. example-tab:: examples/s4u/synchro-semaphore/s4u-synchro-semaphore.cpp
461
462 =============================
463 Interacting with the Platform
464 =============================
465
466  - **User-defined properties:**
467    You can attach arbitrary information to most platform elements from
468    the XML file, and then interact with these values from your
469    program. Note that the changes are not written permanently on disk,
470    in the XML file nor anywhere else. They only last until the end of
471    your simulation.
472
473    .. tabs::
474
475       .. example-tab:: examples/s4u/platform-properties/s4u-platform-properties.cpp
476
477          - :cpp:func:`simgrid::s4u::Actor::get_property()` and :cpp:func:`simgrid::s4u::Actor::set_property()`
478          - :cpp:func:`simgrid::s4u::Host::get_property()` and :cpp:func:`simgrid::s4u::Host::set_property()`
479          - :cpp:func:`simgrid::s4u::Link::get_property()` and :cpp:func:`simgrid::s4u::Link::set_property()`
480          - :cpp:func:`simgrid::s4u::NetZone::get_property()` and :cpp:func:`simgrid::s4u::NetZone::set_property()`
481
482       .. group-tab:: XML
483
484          **Deployment file:**
485
486          .. showfile:: examples/s4u/platform-properties/s4u-platform-properties_d.xml
487             :language: xml
488
489          |br|
490          **Platform file:**
491
492          .. showfile:: examples/platforms/prop.xml
493             :language: xml
494
495  - **Retrieving the netzones matching a given criteria:**
496    Shows how to filter the cluster netzones.
497
498    .. tabs::
499
500       .. example-tab:: examples/s4u/routing-get-clusters/s4u-routing-get-clusters.cpp
501
502  - **Retrieving the list of hosts matching a given criteria:**
503    Shows how to filter the actors that match a given criteria.
504
505    .. tabs::
506
507       .. example-tab:: examples/s4u/engine-filtering/s4u-engine-filtering.cpp
508
509  - **Specifying state profiles:** shows how to specify when the
510    resources must be turned off and on again, and how to react to such
511    failures in your code. See also :ref:`howto_churn`.
512
513    .. tabs::
514
515       .. example-tab:: examples/s4u/platform-failures/s4u-platform-failures.cpp
516
517       .. group-tab:: XML
518
519          .. showfile:: examples/platforms/small_platform_failures.xml
520             :language: xml
521
522          .. showfile:: examples/platforms/profiles/jupiter_state.profile
523
524          .. showfile:: examples/platforms/profiles/bourassa_state.profile
525
526          .. showfile:: examples/platforms/profiles/fafard_state.profile
527
528  - **Specifying speed profiles:** shows how to specify an external
529    load to resources, variating their peak speed over time.
530
531    .. tabs::
532
533       .. example-tab:: examples/s4u/platform-profile/s4u-platform-profile.cpp
534
535       .. group-tab:: XML  
536
537          .. showfile:: examples/platforms/small_platform_profile.xml
538             :language: xml
539
540          .. showfile:: examples/platforms/profiles/jupiter_speed.profile
541
542          .. showfile:: examples/platforms/profiles/link1_bandwidth.profile
543
544          .. showfile:: examples/platforms/profiles/link1_latency.profile
545
546 =================
547 Energy Simulation
548 =================
549
550   - **Describing the energy profiles in the platform:**
551     This platform file contains the energy profile of each links and
552     hosts, which is necessary to get energy consumption predictions.
553     As usual, you should not trust our example, and you should strive
554     to double-check that your instantiation matches your target platform.
555
556     .. tabs::
557
558        .. example-tab:: examples/platforms/energy_platform.xml
559
560   - **Consumption due to the CPU:** 
561     This example shows how to retrieve the amount of energy consumed
562     by the CPU during computations, and the impact of the pstate.
563
564     .. tabs::
565
566        .. example-tab:: examples/s4u/energy-exec/s4u-energy-exec.cpp
567
568   - **Consumption due to the network:**
569     This example shows how to retrieve and display the energy consumed
570     by the network during communications.
571
572     .. tabs::
573
574        .. example-tab:: examples/s4u/energy-link/s4u-energy-link.cpp
575
576   - **Modeling the shutdown and boot of hosts:**
577     Simple example of model of model for the energy consumption during
578     the host boot and shutdown periods.
579
580     .. tabs::
581
582        .. example-tab:: examples/s4u/energy-boot/platform_boot.xml
583
584        .. example-tab:: examples/s4u/energy-boot/s4u-energy-boot.cpp
585
586 =======================
587 Tracing and Visualizing
588 =======================
589
590 Tracing can be activated by various configuration options which
591 are illustrated in these example. See also the 
592 :ref:`full list of options related to tracing <tracing_tracing_options>`.
593
594 It is interesting to run the process-create example with the following
595 options to see the task executions:
596
597   - **Platform Tracing:**
598     This program is a toy example just loading the platform, so that
599     you can play with the platform visualization. Recommanded options:
600     ``--cfg=tracing:yes --cfg=tracing/categorized:yes``
601
602     .. tabs::
603
604        .. example-tab:: examples/s4u/trace-platform/s4u-trace-platform.cpp
605
606 ========================
607 Larger SimGrid Examplars
608 ========================
609
610 This section contains application examples that are somewhat larger
611 than the previous examples.
612
613   - **Ping Pong:**
614     This simple example just sends one message back and forth.
615     The tesh file laying in the directory show how to start the simulator binary, highlighting how to pass options to 
616     the simulators (as detailed in Section :ref:`options`).
617
618     .. tabs::
619
620        .. example-tab:: examples/s4u/app-pingpong/s4u-app-pingpong.cpp
621
622   - **Token ring:**
623     Shows how to implement a classical communication pattern, where a
624     token is exchanged along a ring to reach every participant.
625
626     .. tabs::
627
628        .. example-tab:: examples/s4u/app-token-ring/s4u-app-token-ring.cpp
629
630   - **Master Workers:**
631     Another good old example, where one Master process has a bunch of task to dispatch to a set of several Worker 
632     processes.
633
634     .. tabs::
635
636        .. group-tab:: C++
637
638           This example comes in two equivalent variants, one where the actors
639           are specified as simple functions (which is easier to understand for
640           newcomers) and one where the actors are specified as classes (which is
641           more powerful for the users wanting to build their own projects upon
642           the example).
643
644           .. showfile:: examples/s4u/app-masterworkers/s4u-app-masterworkers-class.cpp
645              :language: cpp
646
647           .. showfile:: examples/s4u/app-masterworkers/s4u-app-masterworkers-fun.cpp
648              :language: cpp
649     
650 Data diffusion
651 --------------
652
653   - **Bit Torrent:** 
654     Classical protocol for Peer-to-Peer data diffusion.
655
656     .. tabs::
657
658        .. group-tab:: C++
659
660           .. showfile:: examples/s4u/app-bittorrent/s4u-bittorrent.cpp
661              :language: cpp
662
663           .. showfile:: examples/s4u/app-bittorrent/s4u-peer.cpp
664              :language: cpp
665
666           .. showfile:: examples/s4u/app-bittorrent/s4u-tracker.cpp
667              :language: cpp
668
669   - **Chained Send:** 
670     Data broadcast over a ring of processes.
671
672     .. tabs::
673
674        .. example-tab:: examples/s4u/app-chainsend/s4u-app-chainsend.cpp
675
676 Distributed Hash Tables (DHT)
677 -----------------------------
678
679   - **Chord Protocol** 
680     One of the most famous DHT protocol.
681
682     .. tabs::
683
684        .. group-tab:: C++
685
686           .. showfile:: examples/s4u/dht-chord/s4u-dht-chord.cpp
687              :language: cpp
688
689           .. showfile:: examples/s4u/dht-chord/s4u-dht-chord-node.cpp
690              :language: cpp
691
692   - **Kademlia**
693     Another well-known DHT protocol.
694
695     .. tabs::
696
697        .. group-tab:: C++
698
699           .. showfile:: examples/s4u/dht-kademlia/s4u-dht-kademlia.cpp
700              :language: cpp
701
702           .. showfile:: examples/s4u/dht-kademlia/routing_table.cpp
703              :language: cpp
704
705           .. showfile:: examples/s4u/dht-kademlia/answer.cpp
706              :language: cpp
707
708           .. showfile:: examples/s4u/dht-kademlia/node.cpp
709              :language: cpp
710
711 .. _s4u_ex_clouds:
712
713 Simulating Clouds
714 -----------------
715
716   - **Cloud basics**
717     This example starts some computations both on PMs and VMs, and
718     migrates some VMs around.
719
720     .. tabs::
721
722        .. example-tab:: examples/s4u/cloud-simple/s4u-cloud-simple.cpp
723
724   - **Migrating VMs**
725     This example shows how to migrate VMs between PMs.
726
727     .. tabs::
728
729        .. example-tab:: examples/s4u/cloud-migration/s4u-cloud-migration.cpp
730
731 =======================
732 Model-Checking Examples
733 =======================
734
735 The model-checker can be used to exhaustively search for issues in the
736 tested application. It must be activated at compile time, but this
737 mode is rather experimental in SimGrid (as of v3.22). You should not
738 enable it unless you really want to formally verify your applications:
739 SimGrid is slower and maybe less robust when MC is enabled.
740
741   - **Failing assert**
742     In this example, two actors send some data to a central server,
743     which asserts that the messages are always received in the same order.
744     This is obviously wrong, and the model-checker correctly finds a
745     counter-example to that assertion.
746
747     .. tabs::
748
749        .. example-tab:: examples/s4u/mc-failing-assert/s4u-mc-failing-assert.cpp
750
751 .. |br| raw:: html
752
753    <br />
754
755 .. |cpp| image:: /img/lang_cpp.png
756    :align: middle
757    :width: 12
758
759 .. |py| image:: /img/lang_python.png
760    :align: middle
761    :width: 12