1 Introduction
Mltithreading has become a common programming technique. Not only operating systems but also many applications are multithreaded. However, developing multithreaded programs is difficult. Concurrency introduces the possibility of errors that do not exist in sequential programs. Furthermore, multithreaded programs may behave differently from one run to another because threads are scheduled indeterminately. For most systems, the number of possible schedules is enormous and testing the system's behavior for each possible schedule is infeasible. Specialized techniques are needed to ensure that multithreaded programs do not have concurrency-related errors.