Course Tips

Table of contents

Why should you take this course?

If you want to work with systems and their abstractions, whether they are web browsers, embedded systems, real-time systems, run-time environments, hardware abstraction layers, or operating systems, this course is for you. From this course you will learn how to work in a real operating system environment, manage real hardware resources, and solve real problems of how to abstract systems so they can be easily used. You will learn how to go under the hood and see how the engine that powers computer software runs and make it do what you want. While you will not learn all the latest OS concepts (look to CS 4210/6210 for that), you will be exposed to how fundamental OS concepts work in a real OS.

Who should take this course?

This course is intended to help you learn to think deeply and thoroughly about OS concepts, solve hard problems in adversarial environments, and learn about the gritty details an OS developer may have to consider when designing an important OS abstraction. If you want to learn and improve in these areas, this is the course for you! As a part of the course, you will:

  • Create and implement important designs and core OS abstractions.
  • Perform (much) low-level C coding (and some assembly!)
  • Directly manipulate raw hardware with your bare hands! (If you consider a keyboard as part of your bare hands.)
  • Earn a good “systems-hackers” nickname, like “Zeus Hammer” or “Diamondback” (see The Night Watch)

With this said, this course will require a great deal of low-level C programming (some assembly), debugging of complex, low-level features (what happens if you have a bug before you initialize your printf feature?), and frustrating debugging of hardware interface interactions. These are challenging tasks, so if you are not very comfortable with all the pre-requisite material, then you may consider taking time to brush-up on it before embarking in CS3210.

How to succeed in this course?

This course is about understanding and designing core OS concepts and principals. To succeed you’ll have to demonstrate both the ability to think critically about the principles of OS design, as well as demonstrate great competency in acting on those principles and implementing those designs.

This is a daunting task, as OSes are some of the largest, most critical (from many aspects), and most complex pieces of code within our modern computing stacks! To aid you we suggest following these bits of advice, and taking full advantage of all of the support provided by the teaching staff.

Start the projects early.

The projects are designed in such a way that you will not be able to finish them in a few days. You are given weeks to do them for a reason, and you are expected to spend that time working on the projects, if not you almost certainly will not receive the grade you’re looking for.

Take advantage of the class support we provide.

We have managed to get many TAs who will are dedicating much of their time towards hosting office hours and answering Ed/Piazza questions. Take advantage of these resources.

Think deeply.

Its easy to jump in and just start writing some code when working on the projects, but spending some time reading over the spec., internalizing the constraints, designing good test cases, and planning your project may actually save you time in the long run.

Test thoroughly.

The autograder will test your code thoroughly, and will not provide you much feedback (just pass/fail). As a result, its up to you to identify the constraints presented in the spec and test your own code. The autograder is not a testing tool, it is an evaluation tool. Unit tests are key to success in this course.