Communicating Sequential Processes (CSP)
Communicating Sequential Processes, or CSP, is a language for describing patterns of interaction. It is supported by an elegant, mathematical theory, a set of proof tools, and an extensive literature. The book Communicating Sequential Processes was first published in 1985 by Prentice Hall International (who have kindly released the copyright); it is an excellent introduction to the language, and also to the mathematical theory.
This is a book for the aspiring programmer, the programmer who aspires to greater understanding and skill in the practice of an intellectually demanding profession. It is designed to appeal first to a natural sense of curiosity, which is aroused by a new approach to a familiar topic. The approach is illustrated by a host of examples drawn from a wide range of applications, from vending machines through fairy stories and games to computer operating systems. The treatment is based on a mathematical theory, which is described by a systematic collection of algebraic laws.
The ultimate objective of the book is to convey an insight which will enable the reader to see both current and future problems in a fresh light, in which they can be more efficiently and more reliably solved; and even better, they can sometimes be avoided.
The most obvious application of the new ideas is to the specification, design, and implementation of computer systems which continuously act and interact with their environment. The basic idea is that these systems can be readily decomposed into subsystems which operate concurrently and interact with each other as well as with their common environment. The parallel composition of subsystems is as simple as the sequential composition of lines or statements in a conventional programming language.
This insight brings practical benefits. Firstly, it avoids many of the traditional problems of parallelism in programming-interference, mutual exclusion, interrupts, multithreading, semaphores, etc. Secondly, it includes as special cases many of the advanced structuring ideas which have been explored in recent research into programming languages and programming methodology’the monitor, class, module, package, critical region, envelope, form, and even the humble subroutine. Finally, it provides a secure mathematical foundation for avoidance of errors such as divergence, deadlock and non-termination, and for achievement of provable correctness in the design and implementation of computer systems.
The material of this book has been tested by presentation in informal workshops as well as on formal academic courses. It was first designed for a onesemester Master’s course in software engineering, though most of it could be presented in the final or even the second year of a Bachelor’s degree in computing science. The main prerequisite is some acquaintance with high-school algebra, the concepts of set theory, and the notations of the predicate calculus. These are summarised on the first page of the glossary of symbols just after this preface. The book is also a suitable basis for an intensive one-week course for experienced programmers. In such a course, the lecturer would concentrate on examples and definitions, leaving the more mathematical material for later private study. If even less time is available, a course which ends after Chapter 2 is quite worthwhile; and even in a single hour’s seminar it is possible by careful selection, to get as far as the edifying tale of the five dining philosophers.