This course covers the design and implementation of operating systems. Operating systems serve as an interface between the hardware of a computer and the software running on it. This course addresses how operating systems enable the sharing of limited resources – CPU, memory, hard disks – robustly, securely, and efficiently amongst all running processes on a computer. CPU virtualization, concurrency, memory virtualization, file systems APIs and implementations, and security are all covered with a focus on the key design ideas and abstractions within the topics. In addition, students get practical experience implementing their own operating system.