2008-09-22 19 views
15

Cuando Mac OS X se queda dormido, al cerrar una computadora portátil o al seleccionar "Suspender" en el menú de Apple, ¿cómo suspende un proceso de ejecución?¿Qué sucede con mi aplicación cuando mi Mac se va a dormir?

Supongo que los procesos sin ventanas simplemente se suspenden en un punto arbitrario de ejecución. ¿Es eso también cierto para las aplicaciones de Cocoa, o espera el sistema operativo hasta que el control regrese al despachador de bucle de ejecución y se vaya a dormir en una ubicación "conocida"? ¿Hace algo de sistema operativo moderno, o suele ser lo suficientemente seguro como para simplemente suspender una aplicación sin importar lo que está haciendo?

Tengo curiosidad, porque permitir que el sueño ocurra en cualquier momento significa, desde la perspectiva de la aplicación, que el reloj del sistema podría repentinamente saltar hacia delante en una cantidad significativa. Esa es una posibilidad que normalmente no considero mientras estoy codificando.

Respuesta

20

Su aplicación se interrumpe exactamente donde está ese momento si la CPU actualmente está ejecutando el código de su aplicación. Su aplicación obtiene constantemente tiempo de ejecución por el programador de tareas, que decide qué aplicación obtiene el tiempo de CPU, en qué núcleo y durante cuánto tiempo. Una vez que el sistema realmente se queda dormido, el programador simplemente no le da tiempo a su aplicación por más tiempo, por lo que detendrá la ejecución donde sea que esté en ese momento, lo que puede ocurrir prácticamente en todas partes. Sin embargo, el kernel debe estar limpio. Eso significa que si acaba de hacer una llamada al kernel (muchas funciones de libC lo hacen) y esta llamada no está en un punto seguro (por ejemplo, dormir, esperar que una condición se convierta en verdad, etc.) o mantener bloqueos críticos del kernel (ej. embudos), el kernel puede suspender el reposo hasta que esta llamada regrese al espacio del usuario o la ejecución llegue a tal punto seguro antes de que finalmente cancele su aplicación del programador de tareas.

Puede abrir un puerto kernel y registrarse para eventos de reposo/activación. En ese caso, su aplicación recibirá un evento cuando el sistema quiera irse a dormir. Tienes varias posibilidades.Una es responder a ella, que el sistema puede progresar. Otro es suspender el sueño; sin embargo, Apple dice que ciertos eventos pueden suspenderse a lo sumo 30 segundos, luego de eso, el sistema continuará, independientemente de si a su aplicación le gusta o no. Y finalmente, puedes cancelarlo; aunque no todos los eventos pueden ser cancelados. Si el sistema ya decidió que va a dormir, solo puede suspenderlo por un máximo de 30 segundos o permitirlo de inmediato, no puede cancelarlo. Sin embargo, también puede escuchar un evento, donde el sistema le pregunta a las aplicaciones, si está bien ir a dormir ahora y allí puede responder "no", lo que hace que se cancele un sueño.

La diferencia entre "¿Está bien dormir" y "Estoy pensando en ir a dormir" es: la primera se envía si se aplica la configuración de ahorro de energía, es decir, si el usuario no se ha movido el mouse o tipeado algo para el tiempo configurado allí. En ese caso, el sistema solo preguntará, si el sueño está bien. Una aplicación como el reproductor de DVD de Apple dirá "no" porque lo más probable es que el usuario mire un DVD y, por lo tanto, no interactúe con la computadora, aún no hay motivo para irse a dormir. OTOH, si el usuario cierra su Mac Book, no se le preguntan las aplicaciones, el sistema se dormirá con seguridad y solo informa a las aplicaciones, que ahora tienen hasta 30 segundos para reaccionar.

Los eventos de despertador también pueden ser muy interesantes de atrapar. P.ej. si su sistema se activa, es posible que no se pueda acceder a los archivos abiertos (se desenchufó una unidad externa) o que los conectores de red ya no funcionen (la red ha cambiado). Por lo tanto, puede volver a iniciar ciertas partes de la aplicación antes de usarlas y ejecutar errores que son más o menos esperados.

Apple's page regarding catching these events.

1

Creo que suspenderá todas las aplicaciones donde sea que estén.

Recuerde, esto sucede todo el tiempo de todos modos. Las aplicaciones se suspenden constantemente y se reanudan debido al cambio de contexto. Entonces, en realidad, el reloj podría saltar entre dos instrucciones en su aplicación, aunque por lo general no de manera notable o significativa.

Si el sistema operativo esperó a que la aplicación retornara a algún bucle principal, podría encontrarse con situaciones en las que las aplicaciones hacen que la suspensión se cuelgue. Si están haciendo un gran trabajo y no regresan al despachador de bucle de ejecución evitarían que la máquina se quede dormida. Eso no sería muy bueno. :)

+0

Pero no tendría precedentes para el sistema operativo para solicitar que la aplicación se suspende, a continuación, obliga a que si no lo hace en un período de tiempo especificado. Así que a los buenos ciudadanos se les permite limpiar y a los malos ciudadanos no se les permite crear problemas. – benzado

0

Y si configura la hora, también parece avanzar hacia los programas en ejecución. Nada especial tampoco.

3

Depende de su aplicación.
Si está interactuando con sistemas externos (piense en la creación de redes o haciendo algo sobre usb/firewire, etc.), entonces podría verse afectado. Una aplicación que se ejecuta en OSX se ejecuta durante un tiempo limitado (10 ms máximo), después de lo cual es interrumpida por el kernel, que programa un nuevo proceso desde la cola de proceso para ejecutarse en la CPU. Esto es transparente para la aplicación, que "piensa" que se ejecuta todo el tiempo en la CPU. Por lo tanto, una transición al sueño no es diferente, aparte del tiempo que se adelanta.
Si tiene que ser consciente de que hubo una transición al modo por favor refiérase a esta nota técnica que detalla cómo recibir notificaciones sobre el cambio de estado dormir: Registering and unregistering for sleep and wake notifications

0

Control hacia fuera este article Wikipedia. Cavver está en lo cierto al afirmar que cosas como las conexiones de red pueden caducar y, por lo tanto, esos servicios pueden verse interrumpidos.

Cuestiones relacionadas