Time-slicing . A CPU alterna entre tarefas a cada poucos milésimos de segundo, então parece ao observador que está fazendo duas ou mais coisas ao mesmo tempo. Há também o fato de que o SO tem algum controle sobre como os threads recebem tempo de execução, para que ele possa empilhar o deck, mas o agendamento de threads está além de qualquer coisa que eu esteja disposto a usar com essa resposta.
As CPUs executam processos como um ou mais tópicos de instruções, e cada segmento representa seu próprio "contexto" para as instruções que está executando ( registrar valores, etc).
As CPUs encaminham as instruções de vários segmentos para uma fila e as executam em ordem. Quando uma instrução de um segmento diferente chega na frente da fila, a CPU realiza uma "alternância de contexto" para pausar uma thread e executar instruções de outro. Isto é necessário para que a CPU possa executar vários threads aparentemente simultaneamente, e para lidar com interrupções que ocorrem enquanto a CPU executa outras tarefas.
Você menciona especificamente o sistema operacional e os programas do usuário. Na medida em que a interface de usuário do sistema operacional permanece responsiva ao usuário enquanto um programa está em execução, trata-se basicamente de time-slicing, mas de igual importância é o que acontece quando o programa usa funções do SO para executar tarefas. Como apontou @ Techie007, a distinção entre os programas do sistema operacional e do usuário é reduzida quando os serviços do SO estão executando metade ou todo o trabalho. Esse desfoque é ainda mais profundo do que quando os programas se vinculam a bibliotecas do sistema para funcionalidade. Quando um programa usa uma chamada do sistema operacional para executar uma função, o código de máquina real dessa função é carregado na RAM como parte do fluxo de instruções do encadeamento, portanto o encadeamento do programa do usuário está realmente executando o código do sistema operacional, e não o contrário!