In general, the approaches can be classified (conceptually) into two types:
- Preemptive multi-tasking.
- Cooperative multi-tasking.
The details for both can be found in the questionthe question which Charles E. Grant has commented on your question.
There is a further classification under cooperative multi-tasking:
- The applications needs to periodically call back an OS function, to allow the OS to perform its work, without benefit to the application itself. Typically this is termed yielding.
- The application may request some services from the OS by making an OS call, such as opening/reading/writing a chunk of a file, or reading from a port or network. The OS could take this opportunity to perform additional work of its own.