Overview
This course investigates how and why systems software works.
What is a system?
A system is an engineering artifact that’s never done: it exists in the practical world, and the needs of the practical world are always changing. The hardware on it runs changes; users provide unexpected inputs, or even attack it; users and developers have new needs.
Everything depends on systems. The great systems builders are unafraid of any level of computing: they are confident that they have the tools to discover anything they need and to face any problem they encounter. You get there by building systems yourself.
Add
#include <cstdio>
#include <string>
int add(int a, int b) {
return a + b;
}
int main(int argc, char* argv[]) {
// we must have exactly 3 arguments (including the program name)
assert(argc == 3);
// convert texts to integers
int a = std::stoi(argv[1]);
int b = std::stoi(argv[2]);
// print their sum
printf("%d + %d = %d\n", a, b, add(a, b));
}
Questions
- What are
a
andb
? - Where are
a
andb
? - What is even happening?
Class outline
- Data representation
- How do computers represent different kinds of information?
- How does data representation impact performance and correctness?
- Assembly & machine programming
- What language is understood by computer processors?
- How is code you write translated to code a processor runs?
- Kernel programming
- How do hardware and software defend against bugs and attacks?
- How are operating systems interfaces implemented?
- Storage & caching
- What kinds of computer data storage are available, and how do they perform?
- How can we improve the performance of a system that stores data?
- Process management
- How can programs running on the same computer cooperate and interact?
- What kinds of operating systems interfaces are useful?
- Concurrency
- How can a single program safely use multiple processors?
- How can multiple computers safely interact over a network?
Your work
- Six problem sets
- Two take-home midterms and take-home final
- Section
- Starting today
- Attendance checked for simultaneously-enrolled students
Your grade
- Rough breakdown: 50% assignments, 35% tests, 15% participation
- Course grading: A means mastery
Collaboration
Discussion, collaboration, and the exchange of ideas are essential to doing academic work, and to engineering. You are encouraged to consult with your classmates as you work on problem sets. You are welcome to discuss general strategies for solutions as well as specific bugs and code structure questions, and to use Internet resources for general information.
However, the work you turn in must be your own—the result of your own efforts. You should understand your code well enough that you could replicate your solution from scratch, without collaboration.
In addition, you must cite any books, articles, online resources, and so forth that helped you with your work, using appropriate citation practices; and you must list the names of students with whom you have collaborated on problem sets and briefly describe how you collaborated. (You do not need to list course staff.)
Our programming language
We use the C++ programming language in this class.
C++ is a boring, old, and unsafe programming language, but boring languages are underrated. C++ offers several important advantages for this class, including ubiquitous availability, good tooling, the ability to demonstrate impactful errors, and a good standard library of data structures.
Pset 0 links to several C++ tutorials and references, and to a textbook.