Domanda

Quando Mac OS X va in modalità sospensione, a causa della chiusura di un laptop o della selezione di "Sospendi". dal menu Apple, come sospende un processo di esecuzione?

Suppongo che i processi senza finestre siano semplicemente sospesi in un punto arbitrario di esecuzione. È vero anche per le app Cocoa o il sistema operativo attende che il controllo ritorni al dispatcher del ciclo di esecuzione e vada a dormire in un "noto"? Posizione? Qualche sistema operativo moderno lo fa o di solito è abbastanza sicuro sospendere semplicemente un'app, qualunque cosa stia facendo?

Sono curioso, perché consentire che il sonno si verifichi in qualsiasi momento significa, dal punto di vista dell'app, che l'orologio di sistema potrebbe improvvisamente saltare di una quantità significativa. Questa è una possibilità che di solito non prendo in considerazione durante la codifica.

È stato utile?

Soluzione

La tua app viene interrotta esattamente dove si trova quel momento se la CPU sta attualmente eseguendo il codice della tua app. La tua app ottiene costantemente tempo di esecuzione dall'utilità di pianificazione, che decide quale app ottiene il tempo della CPU, su quale core e per quanto tempo. Una volta che il sistema davvero va in stop, lo scheduler semplicemente non dà più tempo alla tua app, quindi interromperà l'esecuzione ovunque si trovi in ??quel momento, il che può accadere praticamente ovunque. Tuttavia, il kernel deve essere in uno stato pulito. Ciò significa che se hai appena effettuato una chiamata nel kernel (molte funzioni libC lo fanno) e questa chiamata non è in un punto sicuro (es. In pausa, in attesa che una condizione diventi realtà, ecc.) O possibilmente in possesso di blocchi critici del kernel (ad es. canalizzazioni), il kernel potrebbe sospendere la sospensione fino a quando questa chiamata non ritorna nello spazio utente o l'esecuzione raggiunge un tale punto di sicurezza prima che annulli definitivamente la tua app dall'utilità di pianificazione.

È possibile aprire una porta del kernel e registrarsi per eventi sleep / wake-up. In tal caso, l'app riceverà un evento quando il sistema vuole andare in modalità sospensione. Hai diverse possibilità. Uno è rispondere ad esso, affinché il sistema possa progredire. Un altro è quello di sospendere il sonno; tuttavia, Apple afferma che alcuni eventi possono essere sospesi al massimo 30 secondi, dopodiché il sistema continuerà, indipendentemente dal fatto che app piaccia o meno. E infine, puoi annullarlo; sebbene non tutti gli eventi possano essere cancellati. Se il sistema ha già deciso che andrà in sospensione, è possibile sospenderlo al massimo entro 30 secondi o consentirlo immediatamente, non è possibile annullarlo. Tuttavia, puoi anche ascoltare un evento, in cui il sistema chiede alle app, se è ora possibile andare a dormire ora e lì puoi rispondere "no", causando la cancellazione di un sonno.

La differenza tra " Va bene dormire " e "sto pianificando di andare a dormire" è: il primo viene inviato se vengono applicate le impostazioni di risparmio energetico, ovvero se l'utente non ha spostato il mouse o digitato nulla per l'ora configurata lì. In tal caso, il sistema chiederà semplicemente se il sonno va bene. Un'app come il lettore DVD di Apple dirà "no", perché molto probabilmente l'utente guarda un DVD e quindi non interagisce con il computer, ancora nessun motivo per andare a dormire. OTOH, se l'utente chiude il suo Mac Book, le app non vengono chieste, il sistema andrà sicuramente in stop e informerà semplicemente le app, che ora hanno fino a 30 secondi per reagire.

Anche gli eventi di sveglia possono essere piuttosto interessanti da catturare. Per esempio. se il sistema si riattiva, i file aperti potrebbero essere inaccessibili (un'unità esterna è stata scollegata) o i socket di rete non funzioneranno più (la rete è cambiata). Quindi è possibile riavviare determinate parti dell'app prima di usarle e incorrere in errori più o meno previsti.

La pagina di Apple relativa alla cattura di questi eventi.

Altri suggerimenti

Dipende dalla tua app.
Se stai interagendo con sistemi esterni (pensa alla rete o fai qualcosa tramite usb / firewire, ecc.), Potrebbe essere interessato. Un'applicazione in esecuzione su OSX viene eseguita per un tempo limitato (massimo 10 ms), dopo di che viene interrotta dal kernel che pianifica un nuovo processo dalla coda dei processi per l'esecuzione sulla CPU. Questo è trasparente per l'applicazione, che "pensa" che gira sempre sulla CPU. Pertanto, una transizione verso il sonno non è diversa, a parte il tempo che passa.
Se devi essere consapevole del passaggio alla modalità di sospensione, fai riferimento a questa nota tecnica che spiega come ricevere notifiche sul cambio di stato: Registrazione e annullamento della registrazione per le notifiche di sospensione e riattivazione

Credo che sospenderà tutte le app ovunque si trovino.

Ricorda, questo succede comunque sempre. Le applicazioni vengono costantemente sospese e riprese a causa del cambio di contesto. Quindi, davvero, l'orologio potrebbe saltare tra due istruzioni nella tua app, anche se di solito non in modo evidente / significativo.

Se il sistema operativo attendeva che l'app tornasse a un ciclo principale, potresti imbatterti in situazioni in cui le applicazioni causano il blocco del sonno. Se stanno facendo molto lavoro e non ritornano al dispatcher del ciclo di esecuzione, impedirebbero alla macchina di andare in modalità di sospensione. Non sarebbe molto bello. :)

E se si imposta l'ora, anche questo sembra saltare ai programmi in esecuzione. Niente di speciale neanche.

Dai un'occhiata a questo articolo . Cavver ha ragione nel dichiarare che cose come le connessioni di rete potrebbero andare in timeout e quindi tali servizi potrebbero essere interrotti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top