This book provides an in-depth overview of underlying principles as well as practical techniques that can be used to design concurrent programs. Anyone interested in sequential and concurrent computing will find this book to be an essential reference and innovative work. Andrews's shows how to approach key decisions, discusses the tradeoffs between how processes should be used, and explains how those processes should interact.