Frage

Wenn Mac OS X schlafen geht, aufgrund eines Laptops schließen oder „Sleep“ aus dem Apple-Menü auswählen, wie es einen Ausführungsprozess nicht unterbrechen?

Ich nehme nicht fenster Prozesse werden einfach an einem beliebigen Punkt der Ausführung suspendiert. Gilt das auch für Cocoa-Anwendungen, oder funktioniert die OS warten, bis die Steuerung kehrt zum Laufschleife Dispatcher, und geht in einer „bekannten“ Lage zu schlafen? Hat jedes moderne Betriebssystem tun, oder ist es in der Regel sicher genug, um einfach eine App auszusetzen, egal was es tut?

Ich bin neugierig, weil damit Schlaf auftreten zu jeder Zeit bedeutet, aus der Perspektive des App könnte die Systemuhr plötzlich nach vorne um einen signifikanten Betrag springen. Das ist eine Möglichkeit, die ich in der Regel nicht berücksichtigen, während Codierung.

War es hilfreich?

Lösung

Ihre App unterbrochen ist genau dort, wo es in diesem Moment ist, wenn die CPU tatsächlich derzeit Code Ihrer App ausgeführt wird. Ihre App wird ständig Ausführungszeit durch den Task-Scheduler, der entscheidet, welche App CPU-Zeit erhält, auf dem Kern, und für wie lange. Sobald das System wirklich schlafen geht, einfach der Scheduler keine Zeit, um Ihre App bietet mehr, so wird es die Ausführung zu stoppen, wo es in diesem Moment ist, der so ziemlich überall passieren kann. Allerdings muss der Kernel in einem sauberen Zustand sein. Das heißt, wenn Sie gerade einen Anruf in den Kernel (viele libc-Funktionen tun) gemacht und dieser Ruf ist nicht an einem sicheren Punkt (zB Schlafen, für eine Bedingung warten wahr zu werden, etc.) oder mögliche kritische Kernel Schlösser halten (zB Trichter), schlafen der Kernel aussetzen, bis dieser Aufruf den User-space oder Ausführung erreicht kehrt zurück, eine solche sichere Punkt, bevor es Ihre App schließlich aus dem Task-Scheduler bricht.

Sie können einen Kernel-Port öffnen und registrieren Sie sich für Schlaf / Wach-up Veranstaltungen. In diesem Fall wird Ihre Anwendung ein Ereignis empfangen, wenn das System schlafen gehen will. Sie haben mehrere Möglichkeiten. Eine besteht darin, darauf zu antworten, dass das System fortschreiten kann. Ein weiteres ist Schlaf auszusetzen; aber sagt Apple-bestimmte Ereignisse können höchstens 30 Sekunden ausgesetzt werden, danach wird das System einfach weiter, ob die App es mag oder nicht. Und schließlich können Sie sie abbrechen; wenn auch nicht können alle Ereignisse abgebrochen werden. Wenn das System bereits beschlossen, es zu schlafen gehen, können Sie nur diese suspendieren von höchstens 30 Sekunden, oder es auf einmal erlauben, können Sie es nicht abbrechen. Sie können jedoch auch auf ein Ereignis hören, wo das System apps fragt, ob es in Ordnung ist, jetzt schlafen gehen und dort kann man „nein“, so dass ein Schlaf abgesagt wird antworten kann.

Der Unterschied zwischen „Ist es in Ordnung zu schlafen“ und „Ich bin die Planung auf dem Schlafengehen“ ist: Die erste, wenn die Energiespareinstellungen angewandt werden, gesendet wird, das heißt, wenn der Benutzer die Maus nicht bewegt hat oder es konfiguriert etwas für die Zeit eingegeben haben. In diesem Fall wird das System nur fragen, ob Schlaf in Ordnung ist. Eine App wie DVD-Player von Apple wird „nein“ sagen, weil die meisten wahrscheinlich der Benutzer eine DVD paßt und somit nicht mit dem Computer in Wechselwirkung tritt, immer noch keinen Grund, schlafen zu gehen. OTOH, wenn der Benutzer schließt sein Mac Book, Apps nicht gefragt wird, wird das System sicher schlafen gehen und informiert nur Apps, die es jetzt bis zu 30 Sekunden zu reagieren.

Wake-up-Ereignisse können auch durchaus interessant sein zu fangen. Z.B. wenn Ihr System aufwacht, offene Dateien möglicherweise nicht zugegriffen werden (ein externes Laufwerk ausgesteckt wurde) oder Netzwerk-Sockets wird nicht funktioniert nicht mehr (Netzwerk geändert hat). So können Sie wieder init bestimmte App Teile vor der Verwendung und läuft in Fehler, die mehr oder weniger erwartet.

Apples Seite in Bezug auf diese Ereignisse zu kontrollieren.

Andere Tipps

Es hängt von Ihrer App.
Wenn Sie mit externen Systemen interagieren (man denke an die Vernetzung oder etwas über usb / firewire tun, etc), dann könnte es betroffen sein. Ausführen eine Anwendung auf OSX wird für eine begrenzte Zeit (max 10 ms), wonach sie unterbrochen wird, die vom Kernel plant ein neuer Prozess aus der Prozeßwarteschlange für die Ausführung auf der CPU laufen. Dies ist transparent für die Anwendung, die „denkt“, dass er die ganze Zeit auf der CPU läuft. Somit ist ein Übergang in dem Schlaf nicht anders - abgesehen von der Zeit voraus springen
. 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: Registrieren und Aufheben der Registrierung für Schlaf- und Wach Benachrichtigungen

Ich glaube, es wird nur alle Anwendungen aussetzen, wo immer sie sich gerade befinden.

Denken Sie daran, dies ohnehin die ganze Zeit passiert. Anwendungen werden ständig unterbrochen und wieder aufgenommen Kontextwechsel fällig. Also, wirklich, könnte die Uhr zwischen 2 Anweisungen in Ihrer Anwendung springen, wenn auch in der Regel nicht in einer noticable / signifikanter Weise.

Wenn das O wartete, dass die App zu einem gewissen Hauptschleife zurückzukehren, die Sie in Situationen führen könnten, wo Anwendungen der Schlaf führen zu hängen. Wenn sie eine Menge Arbeit tun und nicht auf die Laufschleife Dispatcher Rückkehr würden sie die Maschine von dem Einschlafen verhindern. Das wäre nicht sehr gut sein. :)

Und wenn Sie die Zeit einstellen, es erscheint auch uns auf die laufenden Programme zu springen. Auch nichts Besonderes.

Sehen Sie sich diese Wikipedia Artikel . Cavver ist zu Recht darauf hingewiesen, dass Dinge wie Netzwerkverbindungen können eine Zeitüberschreitung und damit diese Dienste unterbrochen werden können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top