Pergunta

Quando Mac OS X vai para dormir, devido ao fechamento de um laptop ou selecionando "Sleep" no menu Apple, como se suspender um processo executando?

Suponho que processos não-janelas são simplesmente suspensa em um ponto arbitrário de execução. que também é válido para aplicativos de cacau, ou faz a espera OS até o controle retorna para o despachante loop de execução, e vai dormir em um local "conhecido"? Será que qualquer sistema operacional moderno fazer isso, ou é suficiente geralmente seguro simplesmente suspender um aplicativo, não importa o que está fazendo?

Estou curioso, porque permitir sono para ocorrer em qualquer meio momento, da perspectiva do aplicativo, o relógio do sistema poderia de repente saltar para a frente por uma quantidade significativa. É uma possibilidade que eu não costumam considerar, enquanto a codificação.

Foi útil?

Solução

Seu aplicativo é interrompida exatamente onde ele está nesse momento se o CPU é realmente atualmente em execução de código do seu aplicativo. Seu aplicativo constantemente recebe tempo de execução pelo agendador de tarefas, que decide qual aplicativo recebe tempo de CPU, em que núcleo, e por quanto tempo. Uma vez que o sistema de realmente vai para o sono, o programador simplesmente não dá tempo para a sua aplicação por mais tempo, assim ele irá parar a execução onde quer que seja, naquele momento, o que pode acontecer praticamente em todos os lugares. No entanto, o kernel deve estar em um estado limpo. Isso significa que se você acabou de fazer uma chamada para o kernel (muitas funções libc fazer) e esta chamada não é em algum ponto seguro (por exemplo, dormir, à espera de uma condição se tornar verdadeira, etc.) ou bloqueios do kernel crítica possível exploração (por exemplo funis), o kernel pode suspender dormir até esta chamada retorna para o espaço do usuário ou alcances de execução a-ponto segura, antes de finalmente cancela seu aplicativo do agendador de tarefas.

Você pode abrir uma porta do kernel e registrar para eventos Sleep / Wake-up. Nesse caso, o aplicativo irá receber um evento, quando o sistema quer ir dormir. Você tem várias possibilidades. Um deles é para responder a ela, que o sistema pode progredir. Outra é para suspender o sono; no entanto, a Apple diz que certos eventos podem ser suspensos na maioria dos 30 segundos, depois disso, o sistema só vai continuar, se o seu aplicativo goste ou não. E, finalmente, você pode cancelá-lo; embora nem todos os eventos pode ser cancelado. Se o sistema já decidiu que vai dormir, você só pode suspender o presente por no máximo 30 segundos ou permitir que ele de uma vez, você não pode cancelá-lo. No entanto, você também pode ouvir um evento, onde o sistema pede apps, se está tudo bem para ir dormir agora e lá você pode responder "não", fazendo com que um sono de ser cancelada.

A diferença entre "Está tudo bem para dormir" e "Eu estou planejando em ir para o sono" é: A primeira é enviada se o poder salvar as configurações são aplicadas, ou seja, se o usuário não moveu o mouse ou digitado nada durante o tempo configurado lá. Nesse caso, o sistema irá simplesmente perguntar, se o sono é bom. Um aplicativo como o DVD Player da Apple vai dizer "não", porque provavelmente o usuário assiste a um DVD e, portanto, não interage com o computador, ainda há razão para ir dormir. OTOH, se o usuário fecha seu livro Mac, os aplicativos não são solicitado, o sistema vai dormir com certeza e apenas Informa aplicativos, que têm agora até 30 segundos para reagir a ela.

eventos de despertar também pode ser bastante interessante para pegar. Por exemplo. se o seu sistema acorda, arquivos abertos pode ser inacessível (um drive externo foi desligado) ou sockets de rede não irá funcionar por mais tempo (rede mudou). Assim, você pode re-init certas partes do app antes de usá-los e correr para erros que são mais ou menos esperados.

página da Apple sobre a captura desses eventos.

Outras dicas

Depende do seu aplicativo.
Se você está interagindo com sistemas externos (pense rede ou fazer algo sobre usb / firewire, etc), então ele pode ser afetada. Um aplicativo em execução no OSX começa a correr por um tempo limitado (10ms máximo), após o que é interrompido pelo kernel que agenda um novo processo da fila de processo a ser executado na CPU. Este é transparente para o aplicativo, que "pensa" que corre o tempo todo sobre a CPU. Assim, a transição para o sono não é diferente - para além do tempo de salto à frente
. Se você precisa estar ciente de que houve uma transição para o modo de suspensão, consulte esta nota técnica que detalha como para receber notificações sobre a mudança de estado: O registro e cancelamento de registro para notificações de sono e vigília

Eu acredito que ele só vai suspender todas as aplicações onde quer que eles estejam.

Lembre-se, isso acontece o tempo todo mesmo. As aplicações são constantemente suspensa e retomada em razão de comutação de contexto. Então, realmente, o relógio poderia saltar entre quaisquer 2 instruções em seu aplicativo, embora geralmente não de uma forma perceptível / significativo.

Se o OS esperou o aplicativo para retornar a algum laço principal você pode executar em situações onde as aplicações fazer com que o sono para pendurar. Se eles estão fazendo um monte de trabalho e não voltar para o loop de execução despachante que iria evitar que a máquina vai dormir. Isso não seria muito bom. :)

E se você definir o tempo também parece saltar para a frente para os programas em execução. Nada de especial.

Confira esta Wikipedia artigo . Cavver está correto em afirmar que coisas como conexões de rede pode expirar e, portanto, esses serviços podem ser interrompidos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top