Lecture hours: TR 12:30–1:45 PM, 2–3:15 PM
Grad TAs: Rohan Vardekar, Wenzhe Fan, Giri Madhav, Sai Sampath Vinay
Undergrad TAs: Vamsi Reddy Ayyappaneni, Anastasiia Evdokimova, Von Vic Cayas, Malek Mukahhal
Office hours: W 1-2 PM (Balajee), TBD (TA)

About the course

This class is about two things. First, it’s about the abstractions of the operating system that sit between your code and the hardware of the computer. Understanding how these features work allows you to make your programs fast and efficient beyond their Big-O runtime.

Second, this class is about critical thinking and problem solving about practical computer science problems. The engineers who designed the operating systems we use today had to solve hundreds of hard engineering problems that no one had ever solved before. This course is designed to help you gain the problem solving skills necessary to solve hard practical computer science problems. This is directly applicable to three domains:

You will be ready to reason about and design performant software systems, as well as diagnose and solve problems throughout the software stack that supports modern software (the software itself, along with its libraries, operating system, computer hardware, and how those pieces interact). You will be ready to decompose and solve the types of questions that are asked in technical interviews at many of the best employers of software engineers. By practicing technical problem solving within a specific context, you train yourself to better decompose, communicate about, reason about, and solve technical problems more broadly. In addition to oral and written problem solving exercises, there are also a collection of programming assignments. Completing these assignments will give you experience with the many steps along the path from source code to running program, memory management and virtual memory, process creation, communication and control, and a healthy dose of concurrent programming.

By the end of this course, you will have a good understanding of the main elements that work together to form modern computing environments. You will have acquired some familiarity with dynamic memory allocation, concurrent programming, and file I/O both with physical files and network sockets.

This is a hands-on, programming-heavy course. The course is structured with a series of labs, homework (programming assignments), a mid-term exam, and a final exam. Please look at the complete syllabus.

Textbook

We will be using Computer Systems, a programmer’s perspective by Randal E. Bryant and David R. O’Hallaron, 3rd edition, as our main textbook. We will be covering the content from Chapter 7 through the remainder of the book.

You may also find The C Programming Language by Kernigan and Ritchie (colloquially referred to as K&R) a helpful reference when writing C programs.

Exam schedule

tbd

Course schedule (tentative)

Lecture Topic Readings (§)
2 Linking: Symbol resolution 7.1–7.6
3 Linking: Relocation 7.6–7.7
4 Linking: Executables, Shared libraries 7.8–7.10
5 Linking: Position independent code, Library interpositioning 7.12–7.13
6 Exceptional Control flow: Exceptions and processes 8.1–8.2
7 Exceptional Control flow: Error handling, Process control 8.3–8.4
8, 9 GOT, PLT demo  
10 Signals 8.5–8.7
11 File I/O 10.1–10.10
12 Virtual memory 9.1–9.3
13 Virtual memory 9.4–9.6
14 Midterm review  

Stuff you should learn yourself