Pregunta

Cuando Mac OS X entra en modo de suspensión, debido a que se cierra una computadora portátil o se selecciona "Suspender" en el menú de Apple, ¿cómo suspende un proceso en ejecución?

Supongo que los procesos sin ventana simplemente se suspenden en un punto de ejecución arbitrario.¿Eso también es cierto para las aplicaciones Cocoa, o el sistema operativo espera hasta que el control regrese al despachador del bucle de ejecución y entre en suspensión en una ubicación "conocida"?¿Algún sistema operativo moderno hace eso 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 adelantarse repentinamente en una cantidad significativa.Esa es una posibilidad que normalmente no considero mientras codifico.

¿Fue útil?

Solución

Su aplicación se interrumpe exactamente en ese momento si la CPU está actualmente ejecutando el código de su aplicación.Tu aplicación recibe constantemente Tiempo de ejecución por el programador de tareas, que decide qué aplicación obtiene tiempo de CPU, en qué núcleo y durante cuánto tiempo.Una vez que el sistema en realidad entra en suspensión, el programador simplemente ya no le da tiempo a su aplicación, por lo que detendrá la ejecución dondequiera que esté en ese momento, lo que puede suceder prácticamente en todas partes.Sin embargo, el núcleo debe estar limpio.Eso significa que si acaba de realizar una llamada al kernel (muchas funciones de libC lo hacen) y esta llamada no se realiza en algún punto seguro (p. ej.durmiendo, esperando a que una condición se cumpla, etc.) o posiblemente manteniendo bloqueos críticos del kernel (p. ej.embudos), el kernel puede suspender la suspensión hasta que esta llamada regrese al espacio del usuario o la ejecución alcance un punto seguro antes de que finalmente cancele su aplicación del programador de tareas.

Puede abrir un puerto del kernel y registrarse para eventos de suspensión/activación.En ese caso, su aplicación recibirá un evento cuando el sistema quiera entrar en modo de suspensión.Tienes varias posibilidades.Una es responderle para que el sistema pueda progresar.Otra es suspender el sueño;sin embargo, Apple dice que ciertos eventos se pueden suspender como máximo durante 30 segundos, después de eso, el sistema simplemente continuará, le guste o no a su aplicación.Y finalmente, puedes cancelarlo;aunque no todos los eventos se pueden cancelar.Si el sistema ya decidió entrar en modo de suspensión, sólo puedes suspenderlo por máximo 30 segundos o permitirlo de una vez, no puedes cancelarlo.Sin embargo, también puede escuchar un evento, donde el sistema pregunta a las aplicaciones si está bien irse a dormir ahora y allí puede responder "no", lo que provoca que se cancele el sueño.

La diferencia entre "¿Está bien dormir" y "Estoy planeando irme a dormir" es:El primero se envía si se aplican las configuraciones de ahorro de energía, es decir, si el usuario no ha movido el mouse ni escrito nada durante el tiempo allí configurado.En ese caso, el sistema simplemente preguntará si está bien dormir.Una aplicación como el reproductor de DVD de Apple dirá "no", porque lo más probable es que el usuario vea un DVD y, por tanto, no interactúe con el ordenador, por lo que no hay motivo para irse a dormir.OTOH, si el usuario cierra su Mac Book, no se solicitan las aplicaciones, el sistema seguramente entrará en suspensión y solo informará a las aplicaciones, que ahora tienen hasta 30 segundos para reaccionar.

Los eventos de despertar también pueden ser muy interesantes de ver.P.ej.Si su sistema se reactiva, es posible que no se pueda acceder a los archivos abiertos (se ha desconectado una unidad externa) o que los enchufes de red ya no funcionen (la red ha cambiado).Por lo tanto, puede reiniciar ciertas partes de la aplicación antes de usarlas y encontrarse con errores más o menos esperados.

La página de Apple sobre cómo detectar estos eventos.

Otros consejos

Depende de tu aplicación.
Si está interactuando con sistemas externos (piense en una red o haciendo algo a través de USB/firewire, etc.), entonces podría verse afectado.Una aplicación que se ejecuta en OSX se ejecuta durante un tiempo limitado (máximo 10 ms), después del cual es interrumpida por el kernel que programa un nuevo proceso de la cola de procesos para que se ejecute en la CPU.Esto es transparente para la aplicación, que "piensa" que se ejecuta todo el tiempo en la CPU.Por lo tanto, la transición al sueño no es diferente, aparte del tiempo que se adelanta.
Si necesita saber que hubo una transición al modo de suspensión, consulte esta nota técnica que detalla cómo recibir notificaciones sobre el cambio de estado: Registro y cancelación del registro de notificaciones de sueño y activación

Creo que simplemente suspenderá todas las aplicaciones dondequiera que se encuentren.

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

Si el sistema operativo esperó a que la aplicación volviera a algún bucle principal, podría encontrarse con situaciones en las que las aplicaciones provoquen que la suspensión se cuelgue.Si están trabajando mucho y no regresan al despachador del bucle de ejecución, impedirían que la máquina entre en modo de suspensión.Eso no sería muy bueno.:)

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

Mira esta Wikipedia artículo.Cavver tiene razón al afirmar que cosas como las conexiones de red pueden expirar y, por lo tanto, esos servicios pueden interrumpirse.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top