A processor with 2 cores operating at 1 kHz can execute 2000 commands per second, right?
Non proprio. Per i processori più semplici, potrebbe essere vero. Ma molti processori possono eseguire più istruzioni contemporaneamente (in un singolo core, senza hyperthreading) e molti processori hanno istruzioni che richiedono più di un ciclo di clock per essere completati.
how is it possible to have limitless availability of threads that execute commands simultaneously while only having a finite number of physical units that do so?
Affinamento temporale . Fondamentalmente, dividendo il tempo della CPU in brevi periodi. Mantieni una coda di tutti i thread, esegui un thread per un po '(ad esempio qualche centinaio di microsecondi), quindi fermalo, rimani sul retro della coda ed esegui il thread successivo.
Significa che solo un thread per core è in esecuzione in un dato momento. Ma, anche su un singolo computer centrale, possiamo mantenere l'illusione di più thread in esecuzione simultaneamente perché gli umani elaborano consapevolmente le cose nell'intervallo da decine a centinaia di millisecondi, una durata durante la quale sarà sono stati molti diversi thread in esecuzione.
La maggior parte dei sistemi operativi oggi utilizza il multitasking preventivo , in cui il sistema operativo interrompe forzatamente un thread dopo il tempo assegnato fetta scade. Alcuni usano multitasking cooperativo , in cui un thread continuerà ad essere eseguito fino a quando il thread stesso non deciderà di cedere e lasciare eseguire qualcun altro.
Potresti chiederti come può essere eseguito il sistema operativo per gestire tutti questi thread.
Nel multitasking cooperativo, dovrebbe essere abbastanza ovvio che il thread in esecuzione può eseguire un'istruzione che controlla le mani sul sistema operativo (commentare se non è chiaro). Sì, questo vuol dire che è facile per un'applicazione mal funzionante portare giù l'intero sistema, motivo per cui attualmente la maggior parte dei sistemi operativi tradizionali non sono cooperativi.
Nel multitasking preventivo, l'hardware genera un interrupt dopo un determinato periodo di tempo (che il sistema operativo solitamente può configurare) . Gli interrupt fanno sì che la CPU passi a una routine di servizio di interruzione , per gestire quel particolare interrupt. Le ISR sono impostate dal kernel durante l'avvio, quindi quando l'interruzione del timer si attiva, il sistema operativo ottiene il controllo e può scambiare quale thread eseguire successivamente.