Many of today's computing systems are designed and constructed for execution on many different hosts connected via standard networks and protocols. This course examines the fundamental principles that are vital to the construction of such systems: models of distributed systems, synchronization, mutual exclusion, naming, group communication, transactions, cryptography,
security and distributed algorithms. We will then examine higher level abstractions such as distributed filesystems, process scheduling and peer-to-peer overlay networks. An intensive hands-on semester-long group project will be carried out to complement the concepts taught in the course.