Pergunta

Estou executando um programa de modo de usuário na prioridade normal. Meu programa está em busca de um problema NP, e, como resultado, utiliza-se uma grande quantidade de memória, que eventualmente acaba no arquivo de swap.

Em seguida, o meu mouse congela-se, e ele leva uma eternidade para o gerenciador de tarefas para abrir e deixe-me terminar o processo.

O que eu quero saber é como posso parar o meu sistema operacional Windows a partir completamente trancar a partir deste mesmo que apenas 1 dos meus 2 núcleos estão sendo usados.

Edit: Obrigado pelas respostas.

Eu sei que tornando-se usar menos memória vai ajudar, mas ele simplesmente não faz sentido para mim que todo o OS deve travar.

Foi útil?

Solução

O problema é que, quando um outro programa (por exemplo, explorer.exe) vai executar, todo o seu código e memória foi trocada. Para abrir espaço para o outro programa Windows tem os dados de gravação pela primeira vez que seu programa está usando para o disco, em seguida, carregar a memória do outro programa. Cada nova página de código que é executado no outro programa requer acesso ao disco, fazendo-a funcionar lentamente.

Eu não sei o padrão de acesso do seu programa, mas eu estou supondo que toca todas as suas páginas de memória muito em uma forma aleatória, o que torna o problema pior, porque assim que o Windows expulsa uma página de memória do seu programa, de repente você precisar dele novamente e Windows tem de encontrar alguma outra página para dar o mesmo tratamento.

Para dar outros processos mais RAM para se viver, você pode usar SetProcessWorkingSetSize para reduzir a quantidade máxima de memória RAM que seu programa pode usar. Claro que isso vai fazer o seu programa executado mais lentamente porque tem de fazer mais troca.

Outra alternativa você pode tentar é adicionar mais unidades ao sistema, e distribuir os arquivos de swap sobre aqueles. Você pode ter um CPU dual-core, mas você tem apenas uma única unidade. Distribuir o arquivo de swap sobre várias unidades permite que o Windows equilíbrio entre trabalho através deles (embora eu não tenho experiência em primeira mão de como ele faz isso).

Outras dicas

A resposta óbvia é "usar menos memória". Quando seu aplicativo usa-se toda a memória disponível, o sistema operacional tem a página do gerenciador de tarefas (etc.) para dar espaço para a sua aplicação. Quando você alternar programas, o sistema operacional tem que página os outros programas de backup em (como eles são necessários). Leituras de disco são mais lentos do que a memória lê, então tudo parece ser indo mais devagar.

Se você quiser evitar isso, tem sua aplicação gerenciar sua própria memória, ou utilizar um algoritmo melhor do que força bruta. (Existem genética algoritmos, recozimento simulado, etc.)

Eu não acho que há uma resposta de programação para esta questão, além de "reestruturar seu aplicativo para usar menos memória." O problema swapfile é mais provável devido ao gargalo no acesso ao disco, especialmente se você estiver usando um disco rígido IDE ou um arquivo de swap altamente fragmentado.

É um pouco extremo, mas você sempre pode minimizar o seu arquivo de troca para que você não tem todo o thashing disco, e seu programa não tem permissão para alocar a quantidade de memória virtual. Sob o painel de controle avançado / guia Avançado / Perfromance memória / / Virtual, definir o arquivo de página para tamanho personalizado e digite um valor de 2mb (menor permitidos no XP). Quando uma alocação falhar, você deve obter uma exceção e ser capaz de saída graciosa. Ele não chega a resolver o seu problema, apenas acelera-lo;)

Outra pena coisa considerando seria se você é ona plataforma de 32 bits, porta para um sistema de 64 bits e obter uma caixa com RAM muito mais endereçável.

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