As the awareness of resource sharing and cooperation has increased, distributed systems have gained unprecedented attention. However, designing a practical distributed application is a demanding and complicated task. Coulouris et al. have excellently addressed this design issue with Distributed Systems: Concepts and Design. This book covers various topics from fundamental concepts and principles of distributed systems to some advanced topics, such as replication and distributed multimedia systems. For each topic, the authors provide information in sufficient depth and breadth for readers to conduct further research.
The strength of the book lies in efficiently using practical examples to explain the underlying principles of distributed systems. Helpful case studies are placed throughout the book. Another characteristic of the book is its successful and extensive use of comparison and contrast to make concepts clear.
The book has eighteen chapters and each chapter is well-organized, starting with an introduction and ending with a summary. Although the authors indicate that the book is organized into five main topic areas, the actual organization is not so intuitive and consistent with those topic areas. For example, Chapter 5, 7, and 9 discuss middleware of distributed systems, but Chapter 6 and 8 talk about system infrastructure. So I think it may be better to pick and choose each topic area, instead of following the actual organization of the book.
The first four chapters of the book offer the prerequisite knowledge and fundamental concepts of distributed systems. The authors introduce the characterization of distributed systems (Chapter 1), system models of distributed systems (Chapter 2), networks that distributed systems run on (Chapter 3), and communication protocols between processes in distributed systems (Chapter 4). These chapters are basic for understanding the following chapters.
The second topic area is the middleware of distributed systems. This part covers interaction between distributed objects (Chapter 5), security in distributed systems (Chapter 7), and name services (Chapter 9). Chapter 17 offers a detailed CORBA case study to help reader better understand previous chapters about distributed middleware.
The third topic area is distributed operating systems. Although the author talks about various subareas of distributed operating systems, such as distributed file systems (Chapter 8), distributed multimedia systems (Chapter 15), and distributed shared memory (Chapter 16), the book could have included a very important part of distributed operating systems - distributed scheduling.
It is a good choice to gather distributed algorithms as an independent part, although these algorithms are used by other topic areas. Chapter 10 describes the algorithms related to time and global states, and Chapter 11 describes those related to coordination and agreement.
The final part of the book covers data sharing. In this part, Coulouris et al. first introduce the basic concepts of transaction (Chapter 12), then extends them to distributed transactions (Chapter 13). With distributed transactions, the authors discuss data replication.
Coulouris et al.'s coverage of distributed systems provides sufficient knowledge to evaluate distributed systems or design new ones. Although there is minor problem with the organization of the book, I strongly recommend it as a textbook for an advanced undergraduate course, an introductory postgraduate course, or merely as a self-study reference.