Ciao,
ti sposterò il topic nella sezione "Programmazione", in quanto è sicuramente più adatta.
se il kernel è un programma che gestisce l'assegnazione della cpu ai vari programmi come fa a gestire questa cosa quando un altro programma è in esecuzione sulla cpu?
Non è proprio così. Il Kernel non è un programma, posto che si dovrebbe prima definire cosa è effettivamente un programma, prima di ciò.
Il Kernel è composto da una serie di componenti che si occupano di un sacco di funzionalità, si spazia da HAL (Hardware abstraction layer), allo scheduling a cui ti riferisci tu, alla gestione delle chiamate alle API di sistema (ad esempio per scrivere su un file, per leggere, o per eseguire altre operazioni).
Quello a cui ti riferisci tu è lo scheduling. Prendo come esempio Windows. In Windows lo scheduling non avviene per processo, ma avviene per thread. Ogni programma ha almeno 1 thread, e il processo è in realtà qualcosa di più astratto: si tratta diciamo di un contenitore, che al suo interno ha diverse informazioni sul programma (o meglio, si dovrebbe dire "l'immagine") che è in esecuzione.
Considera che il kerne - le parti che lo compongono e tutti i driver che girano in quella che si chiama "kernel mode" - vengono schedulati e possono essere eseguiti su tutti i cores del tuo PC, non ne hanno uno dedicato. In aggiunta, quando ci sono in esecuzione alcune routine, non può avvenire lo scheduling e di fatto non avviene in quel momento, ma si aspetta il termine dell'operazione.
Il kernel dispatcher si occupa di assegnare un "quantum" a un thread; il thread verrà eseguito per tutto il tempo che gli sarà stato concesso, oppure verrà interrotto se un altro thread con priorità superiore è pronto per essere eseguito.
Windows mantiene una coda (si tratta di una struttura dati), che si chiama "dispatcher database", con al suo interno i thread che sono "in attesa" e quelli in esecuzione; tramite questo meccanismo seleziona quale thread eseguire e dove (anche qui è piuttosto articolato).
L'algoritmo usato da windows dovrebbe essere questo
https://en.wikipedia.org/wiki/Multilevel_feedback_queue
E' una descrizione sommaria, lo so, ma evito di aggiungere dettagli per non farti fare confusione, attendendo magari tue domande.