Modified from Silberschatz, Galvin and Gagne Principles of Computer Operating Systems Lecture 23 Chapter 16/18: Distributed Systems.