In systems without objects there are two forms of migration:
- Data migration
- Passive data, for example files, are
transferred, in whole or in part, to a node at which they are used in some
computation. The advent of NFS has meant that data migration is largely
transparent to programmers.
- Computation migration
- The computation migrates to the data. This is
the more difficult `process migration'. The act of process migration involves
the dynamic transfer of an executing process from one node in a distributed
system to another. This involves the transfer of state (typically an address
space in the context of process migration), references to other processes (<#2515#>
e.g.<#2515#> sockets, pipes, etc.), code (may form part of the address space), and
execution state (<#2516#> e.g.<#2516#> registers, stack etc.). In addition to this, the
original process must be disposed of in such a way that all references to it
are relinked to the new copy, otherwise migration is not seamless and may lead
to errors. Clearly, the whole process must be atomic to avoid either the
process disappearing or there being two copies.
In a uniform object-based system the dichotomy is removed. All entities are
represented by objects, so there is only one form of migration, object
migration, in which objects, possibly containing threads, migrate around the
system and perform work. One notable difference between some of the
object-migration mechanisms and process migration is the question of
granularity. Processes are typically rather large; objects can be of any size,
down to single integers.