Ora per un attimo mettiamo da parte il lato della memoria e parliamo di un altro argomento importante, gli interrupt.
Non è un volo pindarico, è che molte cose che inseriremo con gli interrupt torneranno utili quando riprenderemo la memoria.
Ora, un interrupt è una cosa semplicissima, in pratica è un segnale che un qualsiasi device invia al processore.
Visto che i dispositivi sono asincroni (vanno per fatti loro) è infatti necessario trovare un modo per ottenere "l'attenzione" della CPU.
Tempo addietro (o in condizioni molto particolari oggi) si usava una tecnica chiamata "polling" in cui la CPU controllava ciclicamente i device e vedeva se c'erano stati dei cambiamenti nel loro stato... ma questo sistema impegnava troppo tempo del processore e la programmazione diventava difficile, per questa ragione si sono sviluppati gli interrupt.
Un interrupt è in pratica un segnale elettrico (IRQ, Interrupt request, richiesta d'interrupt) mandato alla CPU... quando la CPU lo riceve ferma il processo corrente, ne salva lo stato e và ad eseguire un frammento di codice speciale chiamato genericamente "ISR", Interrupt Service Routine.
Gli ISR sono generalmente eseguiti in modo supervisore, tuttavia non è raro che un ISR si limiti ad "attivare" un processo (nel caso in cui la gestione del device che ha generato l'interrupt abbia un suo processo).
Gli ISR si concludono ripristinando lo "stato" del momento in cui l'IRQ è arrivato e riesumando quindi il lavoro che stavano facendo prima che arrivasse l'IRQ.
Una CPU può avere un numero qualsiasi (deciso dal costruttore) d'interrupt, e gli interrupt possono anche avere diverse priorità, sovrapporsi, essere condivisi e via dicendo... tutto stà a come è fatta la CPU ed a come il SO la utilizza.
Ecco, ed ora devo smentirmi

Alcuni interrupt non sono affatto "esterni", in diversi casi gli interrupt possono anche essere provocati direttamente o indirettamente dalla CPU ed addirittura dal codice stesso.
Per evitare ambiguità in genere, pur essendo gestiti nella stessa maniera (o quasi) il termine "interrupt" si associa a quelli generati da dispositivi esterni alla CPU mentre quelli generati "in loco" vengono chiamati "eccezioni".
Un esempio classico d'eccezione è quella che viene invocata quando si esegue un operazione di divisione ed il divisore è 0... in questo caso non è possibile eseguire normalmente la divisione e l'unico modo per "avvertire" che c'è qualcosa che "non va" è far scattare l'eccezione.
Un esempio "un po'meno classico" d'eccezione è quella che viene invocata quando si prova ad accedere ad una pagina la cui corrispondente page entry marca come non presente (o se si prova a scrivere in una pagina "read only").
Un esempio "ancora meno classico" d'eccezione è quella che viene invocata quando si è verificato un problema veramente grave ed è impossibile continuare ad eseguire il processo (ad esempio se si prova ad eseguire codice in una pagina "not executable").
Per le eccezioni "utente" (divisione per zero e simili) ogni processo viene generato con un "sotto-ISR" che viene chiamato dall'ISR vero e proprio e che gestisce l'evento "localmente" mentre le eccezioni "di sistema" sono normalmente "invisibili" ai processi.
Piccola nota a latere: In molti OS (dal vetusto MSDOS a Linux) il processo invoca esplicitamente un eccezione per comunicare con il sistema operativo.
Fra gli interrupt veri e propri invece bisogna distinguere fra due tipi: gli interrupt normali ed il famigerato NMI.
Gli interrupt normali sono quelli che vengono eseguiti normalmente; tipicamente quando un interrupt è in esecuzione o in particolari frammenti di codice "critici" eventuali interrupt "successivi" vengono "messi in pausa"... l'NMI (Non Maskable Interrupt) invece ha sempre la precedenza e... interrompe anche gli interrupt!
La ragione è insita nel fatto che in genere un NMI viene invocato solo in casi di estrema necessità, di solito legati a malfunzionamenti dell'hardware.