I programmi GUI su macOS (e molti altri sistemi operativi grafici) funzionano con un ciclo principale che svuota una cosiddetta "coda dei messaggi". Alcune volte questo è chiamato "message pump".
I messaggi vengono inseriti nella coda messaggi dal sottosistema finestre del sistema operativo per comunicare all'applicazione le cose che accadono, ad esempio "il mouse è stato cliccato su (x, y)" o "la finestra è stata ridimensionata (larghezza, altezza)".
L'applicazione quindi estrae questi messaggi dalla coda, li elabora e attende nuovi messaggi.
Se l'applicazione per qualche motivo non sta estraendo questi messaggi dalla coda per un periodo di tempo, macOS dirà che l'applicazione non risponde. Questo è tutto.
Molte applicazioni GUI dividono la loro esecuzione in più "thread" - che possono essere pensati come flussi di programmi in esecuzione nello stesso momento. Il thread principale è responsabile del ciclo del messaggio principale, mentre altri thread possono essere responsabili della comunicazione di rete, dell'I / O del disco, dei calcoli in background, ecc. Tuttavia, qualsiasi modifica alle interfacce utente grafiche gestita dal sistema operativo deve passare attraverso thread principale.
Se per qualche motivo il thread principale è occupato a fare qualcosa di diverso dalla GUI, allora potrebbe essere contrassegnato come non rispondente. Ciò potrebbe essere dovuto al fatto che il programma è bloccato in un ciclo infinito o si trova in un deadlock in attesa di risorse o simili. Il programma non si riprenderà mai da questo stato, ma il sistema operativo non può saperlo.
Un altro motivo per cui il thread principale può essere occupato potrebbe essere il salvataggio di un file di grandi dimensioni, l'attesa di una comunicazione sulla rete o un calcolo di grandi dimensioni. Fatto ciò, il programma inizierà a tirare nuovamente i messaggi dalla coda e risponderà di nuovo. Di solito i programmatori fanno molto lavoro per garantire che nulla di tutto ciò avvenga sul thread principale per garantire che il programma sia sempre reattivo.