This course covers the concepts underlying all computer systems with an emphasis on how such systems affect the correctness, performance, and utility of application programming. The course topics include machine organization, information representations, assembly language and debuggers, memory hierarchy, virtual memory, pipelining, basic system-level I/O, and networking. The course also introduces C-language programming.
Bryan & O'Hallaron, Computer Systems: A Programmer's Perspective, 2nd edition (2011)
Prentice Hall. ISBN-13:978-0-13-610804-7
Recommended: Adam Hoover, System Programming with C and Unix, Addison-Wesley (2009)
ISBN-13:978-0-13-606712-2
The firm prerequisite is programming experience: two courses in the same programming language (e.g., Python, Java, C++) together with a course in data structures/algorithms. The course also presupposes a 1-course background in discrete mathematics. The course relies heavily on coding examples written in C. Several assignments involve the compilation and execution of C programs; other assignments require programming in C. (C and C++ are distinct languages. This course uses C rather than C++.) Although no knowledge of C in particular is assumed, the ability to program is assumed.
Because Summer courses are only five weeks long, there will not be a midterm exam. Instead,
there will be weekly homework exercises and discussion of these in the following week.
The final exam is a quality-control exam with material drawn from and, therefore, closely
related to the questions on the homework. All homework
must be submitted on time so that the material then can be discussed in class. Answers will
be posted on-line after the submission deadline.
There will be one make-up homework, which may be substituted for any other homework.
The grading will be determined as follows:
Students are expected to do their own homework, of course.