CS 131 Outline
CS131 (Fundamentals of Computer Systems) is a new introductory systems class. It will cover fundamental concepts, principles, and abstractions that underlie the design and engineering of computer systems, with reference to applications of these concepts in industry. CS131 will be a hands-on class with weekly labs and 4 to 5 coding assignments covering systems organization, concurrency, and performance.
Preliminary topic list
- Block 1: Computer systems basics
- Machine organization: how does a program actually run? What hardware is involved, and why does it matter?
- Systems programming in C/C++: how do you write low-level programs that help other programs run, such as an operating system or a device driver? Why are these languages popular in industry?
- Block 2: Fundamentals of Operating Systems
- Time sharing, processes, memory layout: how does your computer (safely!) run multiple programs at the same time?
- Virtual memory: how does the operating system share memory between applications and users?
- Isolation and virtualization: how can we make one computer appear to be many computers, and how does that help run untrusted software in "cloud" datacenters?
- Block 3: Concurrency and parallel programming
- Concurrency through multithreading and multiple processors: what is concurrency good for? How do you write a web server that handles many users at the same time?
- Locking, races, safe patterns: what is synchronization? Why is it necessary, and why does it make parallel programming difficult?
- Systems programming in Go/Rust: how do modern programming languages try to make concurrency easier for the programmer?
- Block 4: Introduction to distributed systems
- Networks: how do networks connect multiple computers, at small and large scale? How does the internet work?
- Scalability: how can we use many computers to complete work that would take one computer a very long time, and how do companies like Google, Microsoft, Facebook, or Amazon rely on these ideas?
- Fault tolerance: what happens if something breaks in a network of computers, and how can we write software that survives these inevitable failures, or even tolerates malicious participants?