3 The MSG Interface (legacy interface)
4 ####################################
8 MSG used to be the main API of SimGrid 3, but we are currently in
9 the process of releasing SimGrid 4. So MSG is frozen and will
10 probably never evolve. If you are starting a new project, you
11 should consider S4U instead. Note that the support for MSG will not
12 be removed from SimGrid before 2020Q4 or 2021Q1.
14 This interface is disabled by default. Pass -Denable_msg=ON to
15 cmake if you still need it.
17 MSG is a simple API to write algorithms organized with Concurrent
18 Sequential Processes (CSP) that interact by exchanging messages. It
19 constitutes a convenient simplification of the reality of distributed
20 systems. It can be used to build rather realistic simulations, but
21 remains simple to use: most unpleasant technical elements can be
22 abstracted away rather easily.
30 The basic workflow is the following:
32 - Initialize the library with :c:macro:`MSG_init`
33 - Create a platform (usually by parsing a file with :cpp:func:`MSG_create_environment`)
34 - Register the functions that your processes are supposed to run with
35 :cpp:func:`MSG_function_register` (and maybe :cpp:func:`MSG_function_register_default`)
36 - Launch your processes from a deployment file with :cpp:func:`MSG_launch_application`
37 - Run the simulation with :cpp:func:`MSG_main`
39 .. doxygenenum:: msg_error_t
41 .. doxygenfunction:: MSG_config
42 .. doxygenfunction:: MSG_create_environment
43 .. doxygenfunction:: MSG_function_register
44 .. doxygenfunction:: MSG_function_register_default
45 .. doxygenfunction:: MSG_get_clock
46 .. doxygenfunction:: MSG_get_sent_msg
47 .. doxygendefine:: MSG_init
48 .. doxygenfunction:: MSG_launch_application
49 .. doxygenfunction:: MSG_main
54 This describes the process structure :cpp:type:`msg_process_t` and the functions for managing it.
56 .. doxygentypedef:: msg_process_t
57 .. doxygenfunction:: MSG_process_attach
58 .. doxygenfunction:: MSG_process_auto_restart_set
59 .. doxygenfunction:: MSG_process_create
60 .. doxygenfunction:: MSG_process_create_with_arguments
61 .. doxygenfunction:: MSG_process_create_with_environment
62 .. doxygenfunction:: MSG_process_daemonize
63 .. doxygenfunction:: MSG_process_detach
64 .. doxygenfunction:: MSG_processes_as_dynar
65 .. doxygenfunction:: MSG_process_from_PID
66 .. doxygenfunction:: MSG_process_get_data
67 .. doxygenfunction:: MSG_process_get_host
68 .. doxygenfunction:: MSG_process_get_name
69 .. doxygenfunction:: MSG_process_get_number
70 .. doxygenfunction:: MSG_process_get_PID
71 .. doxygenfunction:: MSG_process_get_PPID
72 .. doxygenfunction:: MSG_process_get_properties
73 .. doxygenfunction:: MSG_process_get_property_value
74 .. doxygenfunction:: MSG_process_is_suspended
75 .. doxygenfunction:: MSG_process_join
76 .. doxygenfunction:: MSG_process_kill
77 .. doxygenfunction:: MSG_process_killall
78 .. doxygenfunction:: MSG_process_migrate
79 .. doxygenfunction:: MSG_process_on_exit
80 .. doxygenfunction:: MSG_process_ref
81 .. doxygenfunction:: MSG_process_restart
82 .. doxygenfunction:: MSG_process_resume
83 .. doxygenfunction:: MSG_process_self
84 .. doxygenfunction:: MSG_process_self_name
85 .. doxygenfunction:: MSG_process_self_PID
86 .. doxygenfunction:: MSG_process_self_PPID
87 .. doxygenfunction:: MSG_process_set_data
88 .. doxygenfunction:: MSG_process_set_data_cleanup
89 .. doxygenfunction:: MSG_process_set_kill_time
90 .. doxygenfunction:: MSG_process_sleep
91 .. doxygenfunction:: MSG_process_suspend
92 .. doxygenfunction:: MSG_process_unref
93 .. doxygenfunction:: MSG_process_yield
98 .. doxygentypedef:: msg_host_t
99 .. doxygenfunction:: MSG_host_by_name
100 .. doxygenfunction:: MSG_get_host_by_name
101 .. doxygenfunction:: MSG_get_host_number
102 .. doxygenfunction:: MSG_host_get_core_number
103 .. doxygenfunction:: MSG_host_get_data
104 .. doxygenfunction:: MSG_host_get_name
105 .. doxygenfunction:: MSG_host_get_nb_pstates
106 .. doxygenfunction:: MSG_host_get_load
107 .. doxygenfunction:: MSG_host_get_power_peak_at
108 .. doxygenfunction:: MSG_host_get_process_list
109 .. doxygenfunction:: MSG_host_get_properties
110 .. doxygenfunction:: MSG_host_get_property_value
111 .. doxygenfunction:: MSG_host_get_pstate
112 .. doxygenfunction:: MSG_host_get_speed
113 .. doxygenfunction:: MSG_host_is_on
114 .. doxygenfunction:: MSG_host_off
115 .. doxygenfunction:: MSG_host_on
116 .. doxygenfunction:: MSG_hosts_as_dynar
117 .. doxygenfunction:: MSG_host_self
118 .. doxygenfunction:: MSG_host_set_data
119 .. doxygenfunction:: MSG_host_set_property_value
120 .. doxygenfunction:: MSG_host_set_pstate
125 Task structure of MSG :cpp:type:`msg_task_t` and associated functions.
127 .. doxygentypedef:: msg_task_t
128 .. doxygentypedef:: const_msg_task_t
129 .. doxygendefine:: MSG_TASK_UNINITIALIZED
131 .. doxygenfunction:: MSG_parallel_task_create
132 .. doxygenfunction:: MSG_parallel_task_execute
133 .. doxygenfunction:: MSG_parallel_task_execute_with_timeout
134 .. doxygenfunction:: MSG_task_cancel
135 .. doxygenfunction:: MSG_task_create
136 .. doxygenfunction:: MSG_task_destroy
137 .. doxygenfunction:: MSG_task_dsend
138 .. doxygenfunction:: MSG_task_dsend_bounded
139 .. doxygenfunction:: MSG_task_execute
140 .. doxygenfunction:: MSG_task_get_bytes_amount
141 .. doxygenfunction:: MSG_task_get_category
142 .. doxygenfunction:: MSG_task_get_data
143 .. doxygenfunction:: MSG_task_get_flops_amount
144 .. doxygenfunction:: MSG_task_get_name
145 .. doxygenfunction:: MSG_task_get_remaining_communication
146 .. doxygenfunction:: MSG_task_get_remaining_work_ratio
147 .. doxygenfunction:: MSG_task_get_sender
148 .. doxygenfunction:: MSG_task_get_source
149 .. doxygenfunction:: MSG_task_irecv
150 .. doxygenfunction:: MSG_task_irecv_bounded
151 .. doxygenfunction:: MSG_task_isend
152 .. doxygenfunction:: MSG_task_isend_bounded
153 .. doxygenfunction:: MSG_task_listen
154 .. doxygenfunction:: MSG_task_listen_from
155 .. doxygenfunction:: MSG_task_receive
156 .. doxygenfunction:: MSG_task_receive_bounded
157 .. doxygenfunction:: MSG_task_receive_with_timeout
158 .. doxygenfunction:: MSG_task_receive_with_timeout_bounded
159 .. doxygendefine:: MSG_task_recv
160 .. doxygendefine:: MSG_task_recv_bounded
161 .. doxygenfunction:: MSG_task_send
162 .. doxygenfunction:: MSG_task_send_bounded
163 .. doxygenfunction:: MSG_task_send_with_timeout
164 .. doxygenfunction:: MSG_task_send_with_timeout_bounded
165 .. doxygenfunction:: MSG_task_set_bound
166 .. doxygenfunction:: MSG_task_set_bytes_amount
167 .. doxygenfunction:: MSG_task_set_category
168 .. doxygenfunction:: MSG_task_set_data
169 .. doxygenfunction:: MSG_task_set_flops_amount
170 .. doxygenfunction:: MSG_task_set_name
171 .. doxygenfunction:: MSG_task_set_priority
177 .. doxygenfunction:: MSG_mailbox_set_async
182 .. doxygentypedef:: msg_comm_t
184 .. doxygenfunction:: MSG_comm_destroy
185 .. doxygenfunction:: MSG_comm_get_status
186 .. doxygenfunction:: MSG_comm_get_task
187 .. doxygenfunction:: MSG_comm_test
188 .. doxygenfunction:: MSG_comm_testany
189 .. doxygenfunction:: MSG_comm_wait
190 .. doxygenfunction:: MSG_comm_waitall
191 .. doxygenfunction:: MSG_comm_waitany
193 Explicit Synchronization
194 ========================
196 Explicit synchronization mechanisms: semaphores (:cpp:type:`msg_sem_t`) and friends.
198 In some situations, these things are very helpful to synchronize processes without message exchanges.
203 .. doxygentypedef:: msg_bar_t
204 .. doxygenfunction:: MSG_barrier_destroy
205 .. doxygenfunction:: MSG_barrier_init
206 .. doxygenfunction:: MSG_barrier_wait
211 .. doxygentypedef:: msg_sem_t
212 .. doxygenfunction:: MSG_sem_acquire
213 .. doxygenfunction:: MSG_sem_acquire_timeout
214 .. doxygenfunction:: MSG_sem_destroy
215 .. doxygenfunction:: MSG_sem_get_capacity
216 .. doxygenfunction:: MSG_sem_init
217 .. doxygenfunction:: MSG_sem_release
218 .. doxygenfunction:: MSG_sem_would_block
223 This interface mimics IaaS clouds.
224 With it, you can create virtual machines to put your processes
225 into, and interact directly with the VMs to manage groups of
228 .. doxygentypedef:: msg_vm_t
229 .. doxygenfunction:: MSG_vm_create_core
230 .. doxygenfunction:: MSG_vm_create_multicore
231 .. doxygenfunction:: MSG_vm_destroy
232 .. doxygenfunction:: MSG_vm_get_name
233 .. doxygenfunction:: MSG_vm_get_pm
234 .. doxygenfunction:: MSG_vm_get_ramsize
235 .. doxygenfunction:: MSG_vm_is_created
236 .. doxygenfunction:: MSG_vm_is_running
237 .. doxygenfunction:: MSG_vm_is_suspended
238 .. doxygenfunction:: MSG_vm_resume
239 .. doxygenfunction:: MSG_vm_set_bound
240 .. doxygenfunction:: MSG_vm_set_ramsize
241 .. doxygenfunction:: MSG_vm_shutdown
242 .. doxygenfunction:: MSG_vm_start
243 .. doxygenfunction:: MSG_vm_suspend
247 Network Zone (:cpp:class:`msg_file_t`) and associated functions.
249 .. doxygentypedef:: msg_netzone_t
250 .. doxygenfunction:: MSG_zone_get_by_name
251 .. doxygenfunction:: MSG_zone_get_hosts
252 .. doxygenfunction:: MSG_zone_get_name
253 .. doxygenfunction:: MSG_zone_get_property_value
254 .. doxygenfunction:: MSG_zone_get_root
255 .. doxygenfunction:: MSG_zone_get_sons
256 .. doxygenfunction:: MSG_zone_set_property_value
261 This section describes jMSG, the Java API to Simgrid. This API mimics
262 :ref:`MSG <MSG_doc>`, which is a simple yet somehow realistic interface.
263 The full reference documentation is provided at the end of this page.
265 Most of the documentation of the :ref:`MSG API <MSG_doc>` in C applies
266 directly to the Java bindings (any divergence is seen as a bug that we
267 should fix). MSG structures are mapped to Java objects as expected,
268 and the MSG functions are methods in these objects.
270 Installing the Java bindings
271 ============================
273 The easiest is to use a :ref:`precompiled jarfile <install_java_precompiled>`,
274 but some people may prefer to :ref:`compile it from the sources <install_src>`.
277 Using the Java bindings
278 =======================
280 In most cases, you can use the SimGrid bindings as if it was a Java
283 .. code-block:: shell
285 $ javac -classpath .:path/to/simgrid.jar your/java/Code.java
286 $ java -classpath .:path/to/simgrid.jar your.java.Code the/parameter/to/your/code
290 .. code-block:: shell
292 $ cd examples/deprecated/java
293 $ java -classpath ../../simgrid.jar:. .:../../simgrid.jar app.pingpong.Main ../platforms/platform.xml
295 Any SimGrid simulation (java or not) is usually constituted of several
296 kind of actors or processes (classes extending @c Msg.Process) that
297 are deployed over the hosts of the virtual platform. So, your code
298 should declare these actors, plus a Main class in charge of deploying
299 your actors on the platform. Please refer to the examples for details.
304 Actually, these bindings are not only implemented in Java. They do use
305 the C implementation of SimGrid. This should be transparent as this
306 library is directly included in the ``simgrid.jar`` file but things can
307 still go wrong is several ways.
309 Error: library simgrid not found
310 --------------------------------
312 This means that the JVM fails to load the native library. If you use a
313 precompiled jarfile, please report this bug.
315 If you built it yourself, you can try to use an installed version of
316 the library instead of the one included in the jar. For that, add the
317 path to the native library into the ``LD_LIBRARY_PATH`` variable (or in
318 the ``DYLD_LIBRARY_PATH`` on macOS).
320 pthread_create failed
321 ---------------------
323 You reached the amount of threads that can be run on your system. Try
324 increasing the thread limits of your operating system.
329 When using jMSG, your program can crash for 3 main reasons:
331 - Your Java part is not good: you'll have a good old java exception thrown,
332 and hence you should be able to correct it by yourself.
333 - Our java part is not good: you'll also have a java exception thrown, but
334 we have real doubts this can happen, since the java part is only a JNI
335 binding. The other option is that it crashed because you used incorrectly
336 the MSG API, so this means also you should have an MSGException. It means
337 you should read carefully MSG samples and/or documentation.
338 - Something has crashed in the C part. Okay, here comes the tricky
339 thing. It happens mainly for 2 reasons:
341 - When something goes wrong in your simulation, sometimes the C part stops
342 because you used SimGrid incorrectly, and JNI bindings are not fond of that.
343 It means that you'll have something that looks ugly, but you should be able
344 to identify what's going wrong in your code by carefully reading the whole
346 - It may happen that the problem comes directly from SimGrid: in this case,
347 the error should be uglier. In that case, you may submit a bug directly to
353 Package org.simgrid.msg
354 -----------------------
356 .. java:package:: org.simgrid.msg
361 Class org.simgrid.msg.As <java/org/simgrid/msg/As>
362 Class org.simgrid.msg.Comm <java/org/simgrid/msg/Comm>
363 Class org.simgrid.msg.File <java/org/simgrid/msg/File>
364 Class org.simgrid.msg.Host <java/org/simgrid/msg/Host>
365 Class org.simgrid.msg.HostFailureException <java/org/simgrid/msg/HostFailureException>
366 Class org.simgrid.msg.HostNotFoundException <java/org/simgrid/msg/HostNotFoundException>
367 Class org.simgrid.msg.JniException <java/org/simgrid/msg/JniException>
368 Class org.simgrid.msg.Msg <java/org/simgrid/msg/Msg>
369 Class org.simgrid.msg.MsgException <java/org/simgrid/msg/MsgException>
370 Class org.simgrid.msg.Mutex <java/org/simgrid/msg/Mutex>
371 Class org.simgrid.msg.Process <java/org/simgrid/msg/Process>
372 Class org.simgrid.msg.ProcessKilledError <java/org/simgrid/msg/ProcessKilledError>
373 Class org.simgrid.msg.ProcessNotFoundException <java/org/simgrid/msg/ProcessNotFoundException>
374 Class org.simgrid.msg.Semaphore <java/org/simgrid/msg/Semaphore>
375 Class org.simgrid.msg.Storage <java/org/simgrid/msg/Storage>
376 Class org.simgrid.msg.StorageNotFoundException <java/org/simgrid/msg/StorageNotFoundException>
377 Class org.simgrid.msg.Task <java/org/simgrid/msg/Task>
378 Class org.simgrid.msg.TaskCancelledException <java/org/simgrid/msg/TaskCancelledException>
379 Class org.simgrid.msg.TimeoutException <java/org/simgrid/msg/TimeoutException>
380 Class org.simgrid.msg.TransferFailureException <java/org/simgrid/msg/TransferFailureException>
381 Class org.simgrid.msg.VM <java/org/simgrid/msg/VM>