Computer Systems: A Programmer's Perspective,
Second Edition (CS:APP2e)

Randal E. Bryant and David R. O'Hallaron
Prentice Hall, 2010.

Available February, 2010.


Table of Contents | Preface | CS:APP Home Page

Changes from the First Edition (from the Preface)

The first edition of this book was published with a copyright of 2003. Considering the rapid evolution of computer technology, the book content held up surprisingly well. Intel IA32 machines running Unix-like operating systems and programmed in C proved to be a combination that continues to encompass many systems today. Changes in hardware technology and compilers and our own experience in teaching the material have prompted a substantial revision. Here are some of the more significant changes:
  • Chapter 2: Representing and Manipulating Information. We have tried to make this material more accessible, with more careful explanations of concepts and with many more practice and homework problems. We moved some of the more theoretical aspects to web asides. We also describe some of the security vulnerabilities that arise due to the overflow properties of computer arithmetic.

  • Chapter 3: Machine-Level Representation of Programs. We have extended our coverage to include x86-64, the extension of x86 processors to a 64-bit word size. We also use the code generated by a more recent version of gcc. We have enhanced our coverage of buffer overflow vulnerabilities. We have created web asides on two different classes of instructions for floating point, and also a view of the more exotic transformations made when compilers attempt higher degrees of optimization.

  • Chapter 4: Processor Architecture. We include a more careful exposition of exception detection and handling in our processor design. We have also created a web aside showing a mapping of our processor designs into Verilog, enabling synthesis into working hardware.

  • Chapter 5: Optimizing Program Performance. We have greatly changed our description of how an out-of-order processor operates and have created a simple technique for analyzing program performance based on the paths in a data-flow graph representation of a program. A web aside describes how C programmers can write programs that make use of the SIMD (single-instruction, multiple-data) instructions found in more recent versions of x86 processors.

  • Chapter 6: The Memory Hierarchy. We have added material in solid-state disks, and we have updated our presentation to be based on the memory hierarchy of an Intel Core i7 processor.

  • Chapter 7: Linking. This chapter has changed only slightly.

  • Chapter 8: Exceptional Control Flow. We have enhanced our discussion of how the process model introduces some fundamental concepts of concurrency, such as nondeterminism.

  • Chapter 9: Virtual Memory. We have updated our memory system case study to describe the 64-bit Intel Core i7 processor. We have also updated our sample implementation of malloc to work for both 32 and 64-bit execution.

  • Chapter 10: System-Level I/O. This chapter has changed only slightly.

  • Chapter 11: Network Programming. This chapter has changed only slightly.

  • Chapter 12: Concurrent Programming. We have increased our coverage of the general principles of concurrency, and we also describe how programmers can use thread-level parallelism to make programs run faster on multi-core machines.
The old Chapter 9 (Measuring Program Execution Time), has been deleted. In addition, we have added and revised a number of practice and homework problems.

Randy Bryant and Dave O'Hallaron