This authoritative text starts with an overview of systems and the four techniques we employ to cope with their complexity: modularity, abstraction, layering, and hierarchy. It then details the elements of computer systems organization through the three fundamental abstractions of memory, interpreters, and communication links. Subsequent chapters cover: the design of naming schemes; the enforcement of modularity through the division of work between clients and services, and through virtualization; and performance optimization. Additional chapters on networks, fault tolerance, atomicity, consistency, and information security are provided online (http://ocw.mit.edu/ans7870/resources/system/index.htm).
The authors’ clear perspective on some timeless classics is refreshing. The book includes examples of name overloading; encryption keys as names from a large and sparsely populated name space; and virtualization in terms of multiplexing, aggregation, and emulation. It also makes a candid argument for monolithic kernels. The authors document practical implementations, including tacit knowledge, such as the principle of least astonishment, the layer bypass optimization technique, and the reason why Unix file systems prohibit hard links between directories.
The text is illustrated with many clearly drawn diagrams, although I would have preferred them drawn in a standard notation, such as the unified modeling language (UML). They use the term “timing diagram” for what is commonly known as a sequence diagram, which was particularly disconcerting. Entertaining war stories, such as the one that describes problems with zip code renumbering, and detailed case studies, such as those of Unix, network file system (NFS), and Intel architectures, provide relevance and succinctly document some classic computer systems. The book contains many clever and interesting exercises, a number of larger problem sets, and a rare case of an annotated bibliography that is actually a joy to read. Some readers may even consider the list of 25 design principles and four design hints, on the inside front cover, to be worth the price of the book.
From a pedagogical perspective, it is sometimes unclear whether the book targets beginners or graduate students: on page 78, one of the book’s many excellent sidebars introduces the concept of an operating system (OS), while an example on page 68 requires knowledge of page map registers. A bigger question is whether system design principles can actually be taught; it may be that they can only be learned through a detailed study of actual systems, along with lots of design and implementation experience.