Course Overview


Welcome to your first course in the software-side of computer systems! Introduce you to an exciting range of materials from the broad field of systems programming, including the basics of how CPUs work, assembly-language programming, higher-level programming in C, the memory hierarchy, disks and I/O, interrupts and exceptions, and little introductions to topics such as virtual memory, networking, concurrency, and parallelism. All very cool stuff that every serious programmer should know!

This course assumes familiarity with basic programming (CS 302, though CS 367 would be better) and a little about how a CPU works (CS 252). You'll be doing a lot of hands-on projects in both assembly (x86) and C (the greatest language ever, naturally), so get ready for a ton of work. If that doesn't sound good, well, tough luck! You're in the wrong profession.


For learning about computer systems, we recommend coming to class and paying attention. Then, some time after class, read the assigned reading. The associated book chapters are marked in superscript on the main class web page. For example, you'll see that on the first day we cover an Intro to the class; in superscript is the number 1, which means you should read Chapter 1 to really understand what is going on in more detail.

For a text book, we have chosen an awesome book out of Carnegie-Mellon known as Computer Systems: A Programmer's Perspective . Many books in CS are frankly not worth buying; this one is, as the authors have done a magnificent job pulling together a huge amount of fascinating material. It will help you learn all about the details of modern computer systems. Buy it!

You'll also need the The C Programming Language book, usually called K&R (after its famous authors, one being the inventor of the C language!). This book is on virtually every Computer Scientist's bookshelf, and should be on yours as well.

Also useful: Expert C Programming by Peter Van der Linden. This is a really nice book(though it is a bit dated). There is also a free resource on learning to program in C by Zed Shaw. It is called Learning C the Hard Way. For those of you looking for some exercises on getting up to speed with C, this is a great way of doing so.

You might also read this short, free, and incomplete introduction to the C programming environment, available for your viewing convenience here.

There are some other interesting textbooks you might take a look at if you want to learn more (and you do, right? that's why you're in school, right?). The Patt/Patel book; is also definitely worth reading as well, but this is just for your own benefit.

Mailing Lists

Important announcements will be sent to the class mailing list (, as well as posted to the web page, so please read your mail frequently (particularly around project time)! You are responsible for the material sent to that list. Note that the class list is automatically generated based on who is enrolled in the class. Enroll in Piazza for posting questions about class contents and getting it answered by Instructors, TAs and fellow students. And also check piazza frequently to stay up to date.

Class Participation

Your class participation is worth 10% of your grade. You'll be required to turn-in some worksheets in-class. These worksheets will be used as a major component to measure your in-class participation. Most worksheets will contain questions based on the concepts and ideas that we learnt in the previous class or during the same class.


Quizzes are worth 10% of your grade. There will some take-home quizzes over the course of the semester. Each quiz will have questions from topics discussed in class during the past two weeks. Quizzes are a good way to understand the course material and to be upto date with the important topics we discuss in class.


See the projects page for project handouts and due dates.

As part of the course, you will complete SEVEN programming assignments aka Projects. Project are worth 40% of your grade. You should perform these projects on PCs running the Linux operating system (new Unix users to CSL Unix facilities should attend an orientation; minimally, read the instructional facilities overview and basic linux shell tutorial ).

The projects are a fundamental part of this course. Most projects require a significant amount of time; do not procrastinate! It is likely they will take longer than you expect. Do not wait until the day before the assignment is due to start. These assignments should be started pretty much when they are handed out. All information necessary to complete the assignments will be available from the class web page.

As stated above, all of the assignments will be in C or x86 assembly. We will help introduce these a bit but of course the real learning of anything as awesome as a new language is done on your own. Get to work!

For the projects, you will primarily be graded on how well your implementation works. We will test your program on a suite of input sets. Your grade will be based on how many of the tests your application passes; we will also briefly examine your code to ensure that you followed the specifications of the assignment. Any assignment turned in after the due date/time and up to 24 hours late will receive a deduction of 25% of the total points. Any assignment turned in 24 hours to 48 hours late will receive a deduction of 50% of total points. Any assignment turned in more than 48 hours after the due date/time will not be graded, and it will receive a zero score.

Also, don't cheat (duh).


Exams are worth 40% of your final grade. There will be two exams to test your knowledge and conceptual understanding and each will be worth 20% of your grade. The exams will be closed book, and will cover material from class, quizzes and the projects. Bring your UW ID to the exams! Read more about exams here.