CIT 595-001 Computer Systems Programming - Spring 2021

Instructor: Insup Lee

Co-Instructor: Ivan Ruchkin


Class Times


  • Monday, Wednesday 10:30a - 12:00p 
  • Zoom link in Canvas


  • Thursday 5:00p - 6:00p
  • Zoom link in Canvas

Office hours:

  • Sooyong Jang: Monday 3pm - 4pm
  • Michelle Chien: Tuesday 10am - 11pm
  • Kaustubh Sridhar: Wednesday 4 pm - 5 pm
  • Jean Park: Friday 10 am - 11am
  • Xiayan Ji: TBA
  • Lanjun Qi: Friday 4pm - 5pm
  • David Yastremsky: Tuesday 12:30pm - 1:30pm


Computer systems and C: CIT 593 (Intro to Computer Systems) or a similar course/background

Object orientation and Java: CIT 591 (Introduction to Software Development) or CIT 590 (Programming Languages and Techniques) or a similar course/background

This course is currently only open to students in the MCIT program and assumes prior C knowledge (specifically, what is covered in CIT 593), but not C++. Students in other degree programs may add themselves to the CIS course waitlist but are unlikely to be admitted, as the course will likely fill with MCIT students.

Course Overview 

This course is a continuation of CIT 593 and introduces students to fundamental concepts in computing systems. These concepts are divided into four parts. We will begin by expanding our model from a single process to a multiprocess machine and studying concurrent execution, which is ubiquitous in modern computing systems. The second part of the course focuses on resource management, including memory and storage, process scheduling, deadlock. The third part of the course further expands the model and considers how processes communicate across a network. The fourth part is advanced concepts such as HTTP and virtualization. 

The course interleaves systems concepts with practical learning of systems programming in C++ for Linux. You will learn template programming and libraries that programmers use for concurrency, input/output, and networking. 

This course will provide you the requisite knowledge and experience for systems-focused CIS electives such as CIS 505 Software Systems, CIS 548 Operating Systems Design and Implementation, and CIS 553 Networked Systems. After completing this course, you will have a better understanding of how systems (software, hardware, and networks) work together, and be able to:

  • Understand and explain fundamental concepts in computing systems related to concurrency, memory, storage, and networking.
  • Implement concurrent software that operates OS resources by using system call libraries for process/thread manipulation, signal handling, and networking.
  • Implement system-level software using the techniques and libraries of C++. 


The course has two aspects: learning systems concepts and programming systems in C++. 

Systems topics: 

  • Concurrency 
    • Basics: execution on CPU, processes, interrupts
    • Forking, threads 
    • Parallel execution, synchronization, semaphores
    • IPC: shared memory, message passing, events/callbacks
  • Resource Management: CPU, Memory and Storage
    • Deadlocks: detection, avoidance, recovery, prevention
    • Memory management: virtual, paging, replacement
    • Scheduling algorithms, real-time scheduling
    • I/O, file systems
  • Networking
    • Protocol basics, layered protocols
    • TCP/UDP sockets
    • RPC, event-based middleware (MQTT)
  • Advanced techniques
    • HTTP
    • Virtualization

C++ topics: 

  • Classes, objects, inheritance
  • Operator overloading
  • Template programming
  • STL containers
  • Autopointers
  • Concurrency in C++ 
  • File interaction in C++
  • Networking in C++ 

Assignments, Projects, Exams

  • Lecture questions:
    • Weekly comprehension quizzes
    • Deadline: 24 hours after Wednesday lecture
  • Homework #0: C++ basics
    • Deadline: February 2
  • Homework #1: Memory manager
    • Deadline: end of February
  • Homework #2: Dining philosophers
    • Deadline: end of March
  • Homework #3: Networking 
    • Deadline: mid/late April
  • Team project: distributed voting system
    • Student-assigned teams of 2-3 people
    • Release: early March
    • Intermediate deadlines: starting early April
    • Final deadline: April 27
  • Midterm: March 15 (24 hours, starting from the lecture time)
  • Final: early May (finals week)  

All programming assignments will be developed and submitted via the Codio platform. 

The attendance of recitations and office hours is not graded, but highly encouraged to help you complete your assignments. 


  • Lecture questions: 10% 
  • Programming homeworks: 30% 
  • Team project: 15%
  • Midterm: 20%
  • Final: 20%
  • Instructor discretion: 5% (participation on Piazza, finding assignment bugs early, …) 

Optional Course Textbooks

Collaboration Policy

We encourage general discussion of the conceptual material, isolated technical questions, and non-homework exercises. This discussion can occur on Piazza (sign up via Canvas), during recitations, or through other channels. Team projects should only be discussed within your assigned teams; we intend roughly similar efforts from all team members. 

Lecture questions, homeworks, and exams are meant to be completed by you individually.  Direct cooperation between a student and someone else (be it another student or a stranger on stackoverflow) on the answers to lecture questions, homework assignments, and exam questions constitutes plagiarism and is prohibited.

Late Policy

No extensions for lecture questions under any circumstances. The goal of the lecture questions is for you to engage with the material on that specific week. Occasional emergencies are already accounted for by the low grading weight of lecture questions. 

For homeworks and projects, the penalty is 10% of the assignment’s maximum grade for every 24 hours of being late. Extensions may be granted in special circumstances (contact the instructors).

The exams are to be taken at specified times. Accommodation is available upon request.

Other Policies

Treat each other professionally and refer to the SEAS/University policies when in doubt.