In che modo macOS rileva le app che hanno smesso di rispondere?

2

A volte le app smettono di rispondere agli eventi degli utenti probabilmente a causa di bug o casi inaspettati. Ma è diverso da un crash perché un'app potrebbe smettere di rispondere per un po 'di tempo e quindi "ricominciare" di nuovo, ad esempio Photoshop potrebbe bloccarsi quando si aprono immagini enormi perché l'elaborazione potrebbe richiedere del tempo, ma alla fine carica l'immagine e continua a funzionare bene .

E mi chiedo, a livello tecnico, in che modo il sistema operativo rileva tali casi per offrire all'utente un'opzione per forzare l'uscita dall'app.

    
posta njuri 15.03.2018 - 10:37
fonte

1 risposta

3

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.

    
risposta data 15.03.2018 - 18:20
fonte

Leggi altre domande sui tag