Because of the unpredictable nature of the real world input to a system - the Non-Deterministic order of events, it is far cleaner to model the system behaviors as a set of (cooperating) processes/tasks/threads, each of which deals with an appropriate stream of events. This can then be implemented using co-routines, or multi-processing. We then view the system as if these tasks actually run concurrently. As examples of the range of unexpected events that might be about to occur in the interfaces for a simple workstation with the real world: a user may be about to click on a mouse button. On the other hand they may decide to go and have a lemonade. In contrast, a request may have been issued to a disk controller to read a certain block (or to a network controller to receive a packet). A simple disk or network may bound accurately the time to complete this action. More sophisticated hardware may sort requests and act on them in an unexpected order.