Computer Systems Principles

Fall 2010

Course Description

Large-scale software systems like Google - deployed over a world-wide network of hundreds of thousands of computers - have become a part of our lives. These are systems success stories - they are reliable, available ("up" nearly all the time), handle an unbelievable amount of load from users around the world, yet provide virtually instantaneous results. On the other hand, many computer systems don't perform nearly as well as Google - hence the now-cliche "the system is down." In this class, we study the scientific principles behind the construction of high-performance, scalable systems. The course begins with a discussion of the relevant features of modern architectures, and moves up the stack from there to programming language runtime systems, concurrency and synchronization, focusing on key operating system features, I/O and networking, and distributed services.


There is no required text for this course; instead, here is an organized set of class notes.

Course Information

Professor: Emery Berger - office hours by appointment and after class (CMPSCI 344).
Class meetings: TTh 1-2:15pm, CMPS 142

TA: Bruno Castro da Silva, office hours: TTh 2:30pm-3:30pm, LGRT 223
Class forum / bulletin board

Plagiarism policy

All projects in this course are to be done by you and you alone. Violation will result in a zero for the course and possible initiation of the formal procedures of the University. We use an automated program and manual checks to correlate projects with each other and with prior solutions. If you cheat, we will catch you.

At the same time, we encourage students to help each other learn the course material. As in most courses, there is a boundary separating these two situations. You may give or receive help on any of the concepts covered in lecture or discussion and on the specifics of programming language syntax. You are allowed to consult with other students in the current class to help you understand the project specification (i.e., the problem definition). However, you may not collaborate in any way when constructing your solution: the solution to the project must be generated by you working alone. You are not allowed to work out the programming details of the problems with anyone or to collaborate to the extent that your programs are identifiably similar. You are not allowed to look at or in any way derive advantage from the existence of project specifications or solutions prepared elsewhere.

If you have any questions as to what constitutes unacceptable collaboration, please talk to the instructor right away. You are expected to exercise reasonable precautions in protecting your own work. Don't let other students borrow your account or computer, don't leave your program in a publicly accessible directory, and take care when discarding printouts.

University Academic Honesty policy


While projects must be tested and submitted on an Edlab system (using Linux), for development you might choose to use the Eclipse development environment, which has reasonable C++ support.

C++ resources

Here's a brief introduction to C++ for Java programmers, courtesy of Mark Corner, lightly edited by me. You can learn more by following this C++ tutorial for Java programmers or reading this detailed comparison of the differences between C++ and Java.

This C++ FAQ, written by Bjarne Stroustrup (creator of C++), has more precise technical details.

And here is a full tutorial.

Linux resources

You can connect to the Edlab machines (via ssh) from Windows with PuTTY; on Mac, use the built-in Terminal program — read this article for a walk-through.

For information about using Unix/Linux, see this tutorial. For more details, see this guide by UMass PhD student Joshua Glatt.