Modules in all languages affect the load on a processor, hence Converse supports load balancing across language modules. The need for load balancing arises in parallel programs in many contexts.
A particular situation of interest is when the program creates a piece of work or a task that can be executed on any processor. This is referred to as ``seed-based'' load balancing. The load balancer assigns the task to a processor depending on the load measures on other processors at that point in the program. A language runtime may hand over a ``seed'' for a task, in the form of a generalized message, to the load balancer on any processor. The load-balancing module moves such seeds from processor to processor until it eventually hands over the seed to its handler on some destination processor.
Another situation occurs in the presence of dynamic runtime conditions, where either the application itself induces load imbalance (such as in physical simulation applications that use adaptive mesh refinement) or when the application is run on non-dedicated platforms (such as clusters of workstations). Converse supports migration-based load balancing to handle such situations, where work (represented by the entities specific to different programming models) is migrated to lightly loaded processors from heavily loaded ones.
Dynamic load balancing based on object migration is an area of active research [16] and is orthogonal to our thesis objectives. However, the need to provide information to the load-balancing subsystem about locality among component interactions has influenced our interface model design (see section 3.3.)