Il kernel ottiene il controllo abbastanza frequentemente durante le normali operazioni:ogni volta che un processo chiama una chiamata di sistema e ogni volta che si verifica un'interruzione. Gli interrupt si verificano quando l'hardware richiede l'attenzione della CPU o quando la CPU richiede l'attenzione del kernel e un particolare componente hardware può essere programmato per richiedere periodicamente l'attenzione (il timer). Pertanto, il kernel può garantire che, finché il sistema non si blocca così tanto da non generare più interruzioni, venga invocato periodicamente.
Di conseguenza,
se quel processo sta eseguendo un calcolo estremamente lungo senza cedere
non è un problema:Linux è un sistema operativo multitasking preventivo, vale a dire è multitasking senza richiedere la cooperazione dei programmi in esecuzione.
Quando si tratta di terminare i processi, il kernel è comunque coinvolto. Se un processo vuole uccidere un altro processo, deve chiamare il kernel per farlo, quindi il kernel ha il controllo. Se il kernel decide di terminare un processo (ad es. il killer OOM, o perché il processo ha tentato di fare qualcosa che non gli è consentito, come accedere alla memoria non mappata), ha anche il controllo.
Nota che il kernel può essere configurato su not controllare un sottoinsieme delle stesse CPU di un sistema (usando il deprecato isolcpus
parametro kernel), o per non programmare attività su determinate CPU stesse (usando cpusets senza bilanciamento del carico, che sono completamente integrati in cgroup v1 e cgroup v2); ma almeno una CPU nel sistema deve essere sempre completamente gestita dal kernel. Può anche essere configurato per ridurre il numero di interrupt del timer che vengono generati, a seconda di cosa viene utilizzata una determinata CPU.
Inoltre, non c'è molta distinzione tra sistemi single-CPU (single-core, ecc.) e sistemi multi-CPU, le stesse preoccupazioni si applicano a entrambi per quanto riguarda il controllo del kernel:ogni CPU deve richiamare periodicamente il kernel se lo è da utilizzare per il multitasking sotto il controllo del kernel.
Linux e la maggior parte dei sistemi operativi moderni utilizzano il multitasking preventivo, il che significa che il kernel ha il controllo completo sul tempo in cui ogni processo può essere eseguito e anticiperà un processo se viene eseguito troppo a lungo, a differenza del multitasking cooperativo in cui un processo passerà il controllo ogni volta che lo desidera
Fondamentalmente nel multitasking preventivo il kernel verrà attivato periodicamente da un timer e ogni volta che il kernel ha il controllo (quando si verifica l'interruzione del timer o viene richiamata una chiamata di sistema) il kernel salverà il contesto del processo corrente e quindi passerà al processo successivo ' contesto. Si chiama cambio di contesto in cui l'intero stato del processo, comprese tutte le informazioni sul thread, i valori di registro ... vengono salvati e ripristinati per far sì che il processo continui a essere eseguito dal punto esatto in cui è stato anticipato senza nemmeno sapere che non è stato eseguito continuamente. Quindi appariranno molti processi eseguire contemporaneamente in un singolo core della CPU, anche se in realtà viene eseguito solo 1 processo in qualsiasi momento. Il kernel è anche solo un processo speciale che fa tutto il processo e la gestione delle risorse. Non viene eseguito da un core separato solo per monitorare altri processi
Vedi anche Cosa significa dire "il kernel Linux è preventivo"?