Instructor
Class Timings & Location
Golding Judaica: 110
Tue & Thu 3:55 PM – 5:15 PM
Recitation Timings & Location
Golding Judaica: 110
Wed 5:40 PM – 7:40 PM
Course Description
This course is an introduction to computer systems organization and operating systems. The objectives of the course are for you to learn three things. The first thing is how computer systems, operating systems, and, more generally, computers work. The goal is to demystify the interactions between the software you have written in other courses and hardware. A student graduating with a CS degree should be able to describe the chain of computer system events that occurs from when a user hits the reboot button to when the user’s program runs, reading input and displaying results, from the register level to the operating system level to the application level. This is philosophically important, but it is also of practical interest to developers who need to figure out how to make a system do what they want it to do. The second thing is for you to learn the fundamental concepts of virtualization, concurrency, and persistence. These ideas are often best explained as abstractions that some software layer (usually the operating system) provides above imperfect hardware to make that hardware usable by programmers and users. The intent is for you to understand such abstractions well enough to be able to synthesize new abstractions when faced with new problems. The ideas and abstractions that we will cover are relevant not only to operating systems but also to many large-scale systems. Thus, a third goal of this course is to enhance your ability to understand, design, and implement such systems.
Prerequisites
COSI 12B and COSI 21A. A working knowledge of Linux and Java is expected. The programming assignments will be in Java and C and must run on Linux.
Learning Goals
Students who successfully complete all components of this course will be able to demonstrate the following by the end of the semester.
- Understanding of the hardware abstraction layer and machine organization: how instructions, memory, and I/O are represented and executed at the machine level.
- Understanding of the operating system’s virtualization of the CPU — processes, threads, kernel/user mode, and CPU scheduling policies.
- Ability to reason about concurrency and write correct synchronized programs using locks, condition variables, and related primitives, and to recognize and avoid deadlock.
- Understanding of the operating system’s virtualization of memory — memory management and virtual memory (paging).
- Working proficiency in C, including awareness of common memory-safety risks and mitigations, and the ability to translate higher-level (Java) designs into C.
- Understanding of persistence: file systems, disk organization, naming, and crash-consistent recovery/transactions.
- Familiarity with virtual machines and how they relate to the rest of the systems stack.
Instructor

Teaching Assistants

Shubham Kaushik
Office Hours: Mon 2:00 PM - 3:30 PM, Fri 10:00 AM - 11:30 AM @ Vertica Lounge