Sei principalmente sulla strada giusta. Lo scopo dello stack in generale è quello di aggrapparsi ai dati di cui avrai bisogno in seguito. La maggior parte delle volte, ciò avviene quando si chiamano le subroutine, almeno per salvare l'indirizzo di ritorno, ma anche per salvare qualsiasi stato che potrebbe essere distrutto in altro modo e come meccanismo per memorizzare le variabili locali e per passare i parametri. Nella maggior parte dei sistemi multitasking, ogni contesto di esecuzione ha il proprio stack per tali scopi.
Molti sistemi usano anche lo stack del contesto quando si passa da uno all'altro.
Quando un contesto si arresta, è necessario conservare tutto ciò che stava succedendo. Lo stack ne terrà già la maggior parte, ma lo stato dei registri del processore deve essere raccolto e archiviato.
Queste informazioni potrebbero essere memorizzate in una struttura dati assegnata specificamente per fare quel lavoro, magari come parte di un blocco di controllo del processo. La cosa su questo approccio è che ne avresti bisogno per contesto, e le strutture occuperebbero spazio inutilmente mentre il contesto è in esecuzione.
Come succede, c'è già un blocco di memoria scratchpad di uso generale disponibile: lo stack. Una volta che il controllo è stato strappato dal contesto, non ci sono possibilità che spinga qualcos'altro lì. Ciò rende sicuro al supervisore di spingere lo stato del processore lì, e tutto ciò che deve ricordare per dopo è il puntatore dello stack del contesto. Poiché il contesto non verrà eseguito fino a quando il supervisore non gli darà l'ok, le ultime cose messe in pila saranno sempre state lo stato del processore. Quando il contesto deve essere riavviato, il supervisore ripristina il puntatore dello stack salvato, apre il resto dello stato del processore dallo stack, salta all'indirizzo in cui si trovava il contatore del programma quando il contesto veniva interrotto (anch'esso memorizzato nello stack). Quindi il contesto continua a funzionare come se nulla fosse accaduto.