When developing a system, structuring plays an important role.The system must be decomposed into modules that perform well-defined functions and interact with one another through well defined interfaces. In operating systems, an additional challenge is the high degree of nondeterminism: many functions or services are invoked in response to certain events, which may occur at unpredictable times and with a varying degree of frequency. We can order these events informally according to their typical storage devices needing attention from the CPU. The next level constitutes requests for resources such as physical devices, blocks of memory, or software components. Finally commands entered by interactive users or the operator through terminals and possible hardware or software errors constitute yet another level. All these events arrive at unpredictable times and may require that different modules or subsystems of the operating system be invoked.