This course covers the fundamental concepts of operating systems,
focusing on resource management and abstraction. This includes OS
structure, processes and thread management, communication with
peripherals (I/O), synchronization, deadlocks, memory management,
Virtual Machines, cloud infrastructures, and abstractions for cloud
computation.
The workload for this class is heavy and programming intensive.
News:
- 8/28: First day of class. Your TODO list:
- Sign up for the
Piazza message
board.
- Do you remember/know C?
Spend a few minutes writing a
linked list that supports:
void add(struct linked_list *ll, void
*value),
int length(struct linked_list *ll),
void *remove_first(struct linked_list *ll), and
int
contains(struct linked_list *ll, void *value).
If you have any problems with this, you need to take
action now. See the Essential C pdfs in
the Course Material section below (esp. the practice
problems).
If you don't become comfortable with C soon, you will not do
well in this class. You will profit later from having a
firm grasp on C!
- Consider installing VMWare player on your personal machine.
We will use virtual machines for all development in this
class.
- Gear up for a challenging, but satisfying semester! Get
ready to demystify how computers work!
Please click on any section below to see its contents.
Objectives and Structure
Objectives - In completing this class, students will...
- understand key concepts involving system resource management,
organization, and abstraction
- understand how an OS manages and interfaces with hardware
- understand fundamental trade-offs integral to system
design
- experience both development and experimentation in a real
OS
Structure - This class has lectures broken into two main activities:
lectures and code discussion.
- Lectures will discuss the main concepts in systems with
reference to implementation details where beneficial. A series of
written homeworks and exams (midterm and final) test student's
understanding of the lecture's concepts. We will also devote part
of lecture time to learn specifics about code relevant to the
lecture topics.
Course Prerequisites and Student Responsibilities
Prerequisites:
Responsibilities - Students must
- Attend all classes unless you are sick or there is an emergency.
- Interact, ask questions, and generally participate in class discussions.
- Complete programming problems assigned, and all written
assignments individually.
- Work productively as a group on an extended and difficult project.
Course Material
Required Text:
- Operating Systems Concepts, 8th edition, by
Silberschatz, Galvin, and Gagne
If you have trouble understanding the Linux source code, I recommend
the following books:
- Linux Kernel Development by Robert Love
- Professional Linux Kernel Architecture by Wolfgang Mauerer
(free pdf should be available)
For kernel development, we will be using VMWare. If you can't
install it on your home computer and want to, post on Piazza.
If you're having trouble with C, here is a list of references:
It is your responsibility to get up to speed in C, so please use
these resources.
Once you are more advanced in C, it will be useful to read the
style guide for Composite, our research OS here at GWU.
Schedule
Events are in bold. Note that this schedule is subject
to change.
Lectures
Grading
Grades will be assigned with the following proportions:
Homeworks and Quizes: 70%
Class and Lab Participation: 30%
If I decide that students aren't paying attention in class, or
understanding course material, I will change the course to have this
format:
Homeworks and Quizes: 50%
Midterm: 20%
Final: 20%
Class and Lab Participation: 10%
Homeworks include smaller programming assignment, written
responses, and a long final programming project.
Participation will be graded not only on attendance (33%), but also
on interactivity and involvement (66%).
If needs be, there will be short quizzes at the beginning of
classes.
Late Policy:
- 66% credit: up to 24 hours late
- 33% credit: up to 48 hours late
- 0% credit: later than that
Academic Honesty
Just as you can do a google search for code online, it is
trivial for us to do the same. We have caught numerous people
cheating in the past in this way. If you feel pressured about an
assignment, please come see me instead of cheating.
You are not allowed to collaborate on the homeworks and the lab
assignments. The group projects require collaboration amidst each
group, but no collaboration between teams is permitted. Please refer
to the academic integrity policy linked from the course web page.
This policy will be strictly enforced. If you're having significant
trouble with an assignment, please contact me.
Academic
Integrity Policy
Credit: I'd like to thank Prof. Narahari for the first versions of
this academic honesty policy.
Additional Material
If you're interested
in Composite,
the OS we
are developing
here at GW, don't hesitate to contact me.
In addition to the contents of the class, what follows is a list
of resources that will allow you to go beyond what you've learned.
This material is not mandatory for the class and is meant to give
you a springboard if you wish to pursue the ideas further. Many of
these are blog posts or articles for easy reading. However, because
of the informal format, please take the contents with a grain of
salt. I can point you to more thorough content if you want it.
If you find an website/article/tool that you think is worthy of
being in this list, let me know.
Websites geared toward systems topics (or that have subsections
on systems):
- Linux Weekly News:
Free content is that which is at least a week old (see the
Archives).
- Two brilliant
classes
on microkernel construction.
- Arstechnica: geek news, often
with a high-level overview of systems/architectural topics.
- OKLabs
videos. A microkernel company. Specifically, see the series
titled, "Advanced OS with Gernot Heiser".
- OSDev Wiki:
the resource on practical OS construction and hardware
manipulation.
- Agner's blog:
What's happening in those processors of ours? See more
architecture discussions at real world tech.
- From low-level embedded system hacking, to robotics, to
hacking! Hackaday!
Blogs and articles (remember that these are not authoritative sources!):
- On binaries and understanding process layout: A
Whirlwind Tutorial on Creating Really Teensy ELF Executables for
Linux, and playing
with binary
construction.
- On memory
management: A
look at how malloc works on the Mac, and memory allocation
-- magic
no
more!
- On transactional memory (a synchronization mechanism):A
(brief) retrospective on transactional memory
- Concurrency via events or threads? Why
not both!
And how do you provide
an interface
to it?
- A great email
thread
about efficient IPC implementation.
- What every programmer should know about memory.
Seriously. He's not kidding. Read this. And look at the
motivational
graphs.
- Like file systems? Get some history.
- Higher-level description of a modern filesystem, ZFS
- On the hardware manipulations necessary to boot an OS: Roll your own
toy UNIX-clone OS.
- A simple UNIX clone: xv6.
- Correct use of virtual memory: You're Doing
It Wrong.
- Intricacies of
C,v1,
v2,
v3,
and
v4
...and you thought C was simple.
- How do they build the large-scale distributed systems at
Google? Here's
a hint!
- A history of networking physical level
with ethernet,
and a great history
of UNIX
- Interface design is difficult. Where did UNIX get it wrong? Must read for
anyone thinking about designing an interface.
- On the
Brokenness of File Locking, or
"why
interface design matters".
- A great resource
on parallel
programming.
- Browsers don't do magic either! They are just
very, very, very
complex
beasts.
- Why low-level
programming matters even if you don't plan on doing it in
the future.
- Premature optimization may be
the root of
all evil. But
sometimes understanding
how to do it is essential.
- Coding style matters. Read how others have decided on a
style: Linux
and Composite
- Reasonable lists
of historical
publications that have defined computing as we know it.
Really. cool. tools:
- DynamoRIO: Because it rocks
to modify a program as it's executing.
- SQLite: a small, well written,
data-base. Use it, read it, and be merry.
- Lua: a tiny language with a
runtime of about 10K LOC. If you want to know what a language
does under the wraps, here's a good place to find out (just
ignore some of the syntax oddities).
- Valgrind: Ever wonder what
your program's been doing in its spare time? This will tell you.
Required for debugging large C/C++ programs.
- LLVM: A beautiful compiler
backend. If you want to write a language, this will make your
life so much easier.
- FUSE: Want to write a
file-system, but aren't sure about all of that kernel
programming? And what if you need to use high-level libraries?
No problem; do it is user-space!
- Daikon:
Because who doesn't want to use machine learning to infer their
own program's behavior?
- More powerful link-time
optimization!
- A great C library for simple machine learning operations such
as classification.