Question

Lorsque Mac OS X se met en veille, en raison de la fermeture d'un ordinateur portable ou de la sélection de "Veille". dans le menu Apple, comment suspendre un processus d’exécution?

Je suppose que les processus sans fenêtre sont simplement suspendus à un moment d'exécution arbitraire. Est-ce également vrai pour les applications Cocoa, ou le système d'exploitation attend-il que le contrôle revienne au répartiteur de la boucle d'exécution et se mette en veille dans un environnement "connu"? emplacement? Est-ce qu'un système d'exploitation moderne le fait ou est-il généralement assez sûr de simplement suspendre une application, peu importe ce qu'elle fait?

Je suis curieux de savoir que permettre de dormir à tout moment signifie, du point de vue de l'application, que l'horloge système pourrait soudainement bondir considérablement. C’est une possibilité que je n’envisage généralement pas lors du codage.

Était-ce utile?

La solution

Votre application est interrompue exactement à l'endroit où elle se trouve si la CPU exécute actuellement le code de votre application. Votre application obtient constamment le temps d'exécution par le planificateur de tâches, qui détermine quelle application reçoit le temps processeur, sur quel cœur et pendant combien de temps. Une fois que le système se met vraiment en veille, le planificateur ne donne plus de temps à votre application. Il arrête donc l'exécution où qu'il se trouve à ce moment-là, ce qui peut se produire un peu partout. Cependant, le noyau doit être propre. Cela signifie que si vous venez d’appeler le noyau (de nombreuses fonctions de libC le font) et que cet appel n’est pas sûr (par exemple, en veille, en attente de réalisation d’une condition, etc.) ou possible de conserver des verrous critiques du noyau (par exemple, réseau), le noyau peut suspendre la mise en veille jusqu'à ce que cet appel revienne dans l'espace utilisateur ou que l'exécution atteigne un tel point de sécurité avant d'annuler définitivement votre application depuis le planificateur de tâches.

Vous pouvez ouvrir un port du noyau et vous inscrire à des événements de veille / réveil. Dans ce cas, votre application recevra un événement lorsque le système voudra se mettre en veille. Vous avez plusieurs possibilités. On doit y répondre, que le système puisse progresser. Une autre consiste à suspendre le sommeil; Cependant, Apple indique que certains événements peuvent être suspendus au plus 30 secondes. Après cela, le système continuera, que votre application le veuille ou non. Et enfin, vous pouvez l'annuler. bien que tous les événements ne puissent pas être annulés. Si le système a déjà décidé de s’endormir, vous ne pouvez suspendre cette opération que pendant au plus 30 secondes ou l’autoriser immédiatement, vous ne pouvez pas l’annuler. Cependant, vous pouvez également écouter un événement, où le système demande aux applications, s'il est correct de s'endormir maintenant et vous pourrez y répondre "non", ce qui entraînera l'annulation du sommeil.

Différence entre "Est-il possible de dormir" et "je prévois d'aller dormir" is: Le premier est envoyé si les paramètres d'économie d'énergie sont appliqués, c'est-à-dire si l'utilisateur n'a pas déplacé la souris ni tapé quoi que ce soit pour la période configurée ici. Dans ce cas, le système demandera simplement si le sommeil est correct. Une application telle que le lecteur de DVD d’Apple dira "non", car il est fort probable que l’utilisateur regarde un DVD et n’interagisse donc pas avec l’ordinateur, aucune raison de s’endormir. OTOH, si l’utilisateur ferme son Mac Book, aucune application n’est demandée, le système s’endormit à coup sûr et informe uniquement les applications qui disposent de 30 secondes pour réagir.

Les événements de réveil peuvent également être très intéressants à attraper. Par exemple. si votre système se réveille, les fichiers ouverts risquent de ne pas être accessibles (un disque externe a été débranché) ou les sockets réseau ne fonctionneront plus (le réseau a été modifié). Vous pouvez donc ré-initialiser certaines parties de l'application avant de les utiliser et de rencontrer des erreurs plus ou moins attendues.

page d'Apple sur la capture de ces événements.

Autres conseils

Cela dépend de votre application.
Si vous interagissez avec des systèmes externes (pensez à la mise en réseau ou faites quelque chose sur usb / firewire, etc.), cela pourrait en être affecté. Une application fonctionnant sous OSX s'exécute pendant une durée limitée (10 ms maximum), après quoi elle est interrompue par le noyau, qui programme l'exécution d'un nouveau processus de la file d'attente de processus sur la CPU. Cela est transparent pour l'application, qui "pense". qu'il fonctionne tout le temps sur le processeur. Ainsi, la transition vers le sommeil n’est pas différente, mis à part le temps qui passe. Si vous devez savoir qu'il y a eu une transition en mode veille, reportez-vous à cette note technique, qui explique comment recevoir des notifications concernant le changement d'état: Enregistrement et désenregistrement des notifications de veille et de veille

Je pense qu'il faudra simplement suspendre toutes les applications où qu'elles se trouvent.

N'oubliez pas que cela arrive tout le temps de toute façon. Les applications sont constamment suspendues et reprises en raison du changement de contexte. Donc, vraiment, l'horloge peut basculer entre 2 instructions de votre application, bien que cela ne soit généralement pas perceptible / significatif.

Si le système d'exploitation attend que l'application retourne à une boucle principale, vous risquez de vous trouver dans des situations où les applications bloquent le sommeil. S'ils effectuent beaucoup de travail et ne retournent pas au répartiteur de la boucle d'exécution, ils empêcheraient la machine de s'endormir. Ce ne serait pas très bon. :)

Et si vous définissez l’heure, elle apparaît également comme une avancée vers les programmes en cours. Rien de spécial non plus.

Découvrez cet article de Wikipedia. Cavver a raison d'affirmer que des problèmes tels que les connexions réseau peuvent expirer et que ces services peuvent donc être interrompus.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top