Время нарезки. Процессор переключается между задачами каждые несколько миллисекунд, поэтому наблюдателю кажется, что он выполняет две или более операции одновременно. Существует также тот факт, что ОС имеет некоторый контроль над тем, как потокам предоставляется время выполнения, так что она может составлять колоду, но планирование потоков выходит за рамки всего, что я желаю обсудить с этим ответом.
Процессоры запускают процессы как один или несколько потоков инструкций, и каждый поток представляет свой собственный "контекст" для инструкций, которые он выполняет (значения регистров и т.д.).
Процессоры передают инструкции нескольких потоков в очередь и выполняют их по порядку. Когда инструкция из другого потока поступает в начало очереди, ЦП выполняет "переключение контекста", чтобы приостановить один поток и выполнить инструкции из другого. Это необходимо для того, чтобы ЦП мог запускать несколько потоков, казалось бы, одновременно, и для обработки прерываний , возникающих во время выполнения ЦП другими задачами.
Вы конкретно упоминаете ОС и пользовательские программы. В той степени, в которой пользовательский интерфейс ОС остается чувствительным к пользователю во время работы программы, это все о временном разрезе, но не менее важно то, что происходит, когда программа использует функции ОС для выполнения задач. Как отметил @ Techie007, различие между ОС и пользовательскими программами уменьшается, когда службы ОС выполняют половину или всю работу. Это размытие идет еще глубже, чем когда программы ссылаются на системные библиотеки для функциональности. Когда программа использует вызов ОС для выполнения функции, фактический машинный код этой функции загружается в ОЗУ как часть потока инструкций потока, поэтому поток пользовательской программы фактически выполняет код ОС, а не наоборот!