A distributed system consists of a collection of concurrently executing processes that do not use shared memory; processes communicate with each other solely through message-passing and coordinate among themselves to achieve a common goal. In such systems, global state descriptions are not readily available, and a common time base does not exist. However, the notion of global states and snapshots lies at the core of many problems in distributed computation, and, as Lamport pointed out in a classical paper, the concept of time is fundamental to our way of thinking. Example applications of the global states and snapshots are distributed algorithms for detecting stable properties which hold during a computation, such as deadlock detection, ter...