2008-09-22 9 views
15

Wenn Mac OS X aufgrund des Schließens eines Laptops oder des Auswählens von "Sleep" aus dem Apple-Menü in den Energiesparmodus wechselt, wie unterbricht es den Ausführungsprozess?Was passiert mit meiner App, wenn mein Mac in den Ruhezustand wechselt?

Ich nehme an, nicht-Fenster-Prozesse werden einfach an einem beliebigen Punkt der Ausführung ausgesetzt. Gilt das auch für Cocoa-Apps, oder wartet das Betriebssystem, bis die Steuerung zum Run-Loop-Dispatcher zurückkehrt und an einem "bekannten" Ort in den Ruhezustand geht? Macht das ein modernes Betriebssystem, oder ist es normalerweise sicher genug, um eine App einfach auszusetzen, egal was sie gerade macht?

Ich bin neugierig, weil das Ermöglichen von Schlaf zu jedem Zeitpunkt bedeuten kann, aus der Sicht der App, könnte die Systemuhr plötzlich deutlich nach vorne springen. Das ist eine Möglichkeit, die ich beim Codieren normalerweise nicht in Betracht ziehe.

Antwort

20

Ihre App wird genau dort unterbrochen, wo der Moment ist, an dem die CPU aktuell Code Ihrer App ausführt. Ihre App erhält ständig Ausführungszeit durch den Taskplaner, der entscheidet, welche App CPU-Zeit bekommt, auf welchem ​​Kern und für wie lange. Sobald das System wirklich schlafen geht, gibt der Scheduler einfach keine Zeit mehr für Ihre App, so wird es die Ausführung stoppen, wo immer es in diesem Moment ist, was ziemlich überall passieren kann. Der Kernel muss jedoch in einem sauberen Zustand sein. Das bedeutet, wenn Sie gerade einen Aufruf in den Kernel gemacht haben (viele libC-Funktionen tun dies) und dieser Aufruf ist nicht an einem sicheren Punkt (z. B. schlafen, warten auf eine Bedingung, etc.) oder möglich halten kritische Kernel-Sperren (z Trichter), kann der Kernel den Ruhezustand unterbrechen, bis dieser Aufruf zum Benutzerbereich zurückkehrt oder die Ausführung einen solchen sicheren Punkt erreicht, bevor er schließlich Ihre Anwendung vom Aufgabenplaner löscht.

Sie können einen Kernel-Port öffnen und sich für Sleep/Wake-up-Ereignisse registrieren. In diesem Fall erhält Ihre App ein Ereignis, wenn das System in den Ruhezustand wechseln möchte. Sie haben mehrere Möglichkeiten.Einer besteht darin, darauf zu antworten, dass das System fortschreiten kann. Ein anderes ist Schlaf auszusetzen; Apple sagt jedoch, dass bestimmte Ereignisse bis zu 30 Sekunden lang ausgesetzt werden können. Danach wird das System einfach fortgesetzt, unabhängig davon, ob Ihre App es mag oder nicht. Und schließlich können Sie es abbrechen; Es können jedoch nicht alle Ereignisse storniert werden. Wenn das System bereits entschieden hat, dass es schlafen geht, können Sie es nur um höchstens 30 Sekunden unterbrechen oder es auf einmal zulassen, Sie können es nicht abbrechen. Sie können jedoch auch ein Ereignis anhören, bei dem das System nach Apps fragt, ob es in Ordnung ist, jetzt in den Ruhezustand zu wechseln, und Sie können dort mit "Nein" antworten, wodurch ein Ruhezustand abgebrochen wird. Der Unterschied zwischen "Ist es okay zu schlafen" und "Ich plane ins Bett zu gehen" ist: Der erste wird gesendet, wenn die Energiespareinstellungen angewendet werden, das heißt, wenn der Benutzer das nicht bewegt hat Maus oder getippt für die dort konfigurierte Zeit. In diesem Fall fragt das System nur, ob der Schlaf in Ordnung ist. Eine App wie Apples DVD-Player wird "Nein" sagen, weil der Benutzer höchstwahrscheinlich eine DVD anschaut und somit nicht mit dem Computer interagiert, noch immer keinen Grund zum Einschlafen. OTOH, wenn der Benutzer sein Mac Book schließt, werden die Apps nicht gefragt, das System geht sicher schlafen und informiert nur Apps, die jetzt bis zu 30 Sekunden haben, um darauf zu reagieren.

Wake-up-Ereignisse können auch ziemlich interessant zu fangen sein. Z.B. Wenn Ihr System aufwacht, sind möglicherweise keine offenen Dateien verfügbar (ein externes Laufwerk wurde entfernt) oder Netzwerk-Sockets funktionieren nicht mehr (Netzwerk hat sich geändert). So können Sie bestimmte App-Teile neu initiieren, bevor Sie sie verwenden und mehr oder weniger erwartete Fehler verursachen.

Apple's page regarding catching these events.

1

Ich glaube, es wird nur alle Apps aussetzen, wo immer sie gerade sind.

Denken Sie daran, dies passiert die ganze Zeit sowieso. Anwendungen werden aufgrund von Kontextwechsel ständig angehalten und wieder aufgenommen. Also könnte die Uhr wirklich zwischen zwei Anweisungen in Ihrer App springen, allerdings normalerweise nicht in bemerkenswerter Weise.

Wenn das Betriebssystem darauf gewartet hat, dass die Anwendung zu einer Hauptschleife zurückkehrt, kann es zu Situationen kommen, in denen Anwendungen den Ruhezustand anhalten. Wenn sie viel Arbeit machen und nicht zum Run Loop Dispatcher zurückkehren, verhindern sie, dass die Maschine in den Ruhezustand geht. Das wäre nicht sehr gut. :)

+0

Aber es wäre das Betriebssystem zu beantragen, dass die App selbst aussetzt zwingt sie nicht beispiellos für, dann, wenn es nicht in einer bestimmten Menge an Zeit der Fall ist. So dürfen gute Bürger aufräumen und schlechte Bürger dürfen keine Probleme machen. – benzado

0

Und wenn Sie die Zeit einstellen, scheint es auch zu den laufenden Programmen zu springen. Nichts besonderes.

3

Es hängt von Ihrer App ab.
Wenn Sie mit externen Systemen interagieren (denken Sie an Netzwerke oder etwas über USB/Firewire, etc.), dann könnte es betroffen sein. Eine Anwendung, die unter OSX ausgeführt wird, wird für eine begrenzte Zeit (max. 10 ms) ausgeführt. Danach wird sie vom Kernel unterbrochen, der einen neuen Prozess aus der Prozesswarteschlange plant, der auf der CPU ausgeführt wird. Dies ist für die Anwendung transparent, die "denkt", dass sie die ganze Zeit auf der CPU läuft. Somit ist ein Übergang in den Schlaf nicht anders - abgesehen von der Zeit, die vor uns liegt.
Wenn Sie müssen sich bewusst sein, dass es eine Übergangsmodus zu diesem technischen Hinweis entnehmen Sie bitte schlafen war, die Details, wie Benachrichtigungen über die Zustandsänderung erhalten: Registering and unregistering for sleep and wake notifications

0

Schauen Sie sich diese Wikipedia article. Cavver ist korrekt in der Aussage, dass Dinge wie Netzwerkverbindungen eine Zeitüberschreitung haben könnten und diese Dienste daher möglicherweise unterbrochen werden.

Verwandte Themen