É possível sugerir ao Windows que traga um processo completamente fora de troca

13

É possível sugerir ao gerenciador de memória virtual do Windows que troque um processo específico fora da troca?

Normalmente, a situação em que me encontro é usar cerca de 50% da minha RAM para todos os programas normais, sendo um deles um IDE para um destino incorporado, juntamente com o depurador associado.

Então deixo um processo com fome de memória em execução - por exemplo, wireshark ou algo que está acumulando dados durante um fim de semana, tudo é trocado - como deveria. Após a conclusão do grande processo, a maioria dos processos fica em troca.

Em seguida, o sporadic faz uma pausa para trocar o processo novamente, causando problemas com o depurador, provavelmente devido a problemas de tempo nas comunicações entre o IDE e o depurador de hardware. Portanto, o controle do dispositivo de destino pode ser esporádico até que tentativas suficientes retirem os dados de depuração no IDE da troca.

Greg
fonte
Isso seria muito útil! Do ponto de vista dos usuários, é irritante aguardar o processo de troca após cada clique ou ação do usuário. Seria muito melhor dizer: "troque esse processo!" , tome um café e retorne a um sistema responsivo!
Tomas
Não estou familiarizado com as especificidades do processo de troca do Windows, mas isso é algo que você está procurando? Deve haver um exemplo binário de trabalho nos comentários.
Rik 12/12
1
Certa vez, tive uma pergunta semelhante e escrevi um programa com base nas respostas que recebi no Stack Overflow.
Kerrek SB
@ Kerrek, tentei compilar seu código no MinGW e obtive erros em cada leitura "Falha ao ler um byte de 0x161000, erro 299 (leitura de 0 bytes)". Como só tenho o Windows em funcionamento, não tive coragem de executar o binário aleatório que você anexou para que o problema pudesse estar na minha compilação.
Greg
1
@KerrekSB, parece um pequeno problema. Talvez você esteja tocando na área de memória que não está mapeada? Enfim, acho que sua resposta merece a recompensa :) PS: a troca parece muito mais lenta do que poderia ser, em comparação com a velocidade do disco rígido. Parece que o gargalo está em outro lugar, mas onde?
Tomas

Respostas:

1

O KerrekSB desenvolveu uma ferramenta especial para esse fim:

/programming//a/2940209/684229

Está disponível no GiTHUB com binários: https://github.com/louisdx/unpage

Durante a execução, você recebe muitos erros "Falha ao ler um byte de 0x .... 000, erro 299 (0 bytes de leitura)", mas isso não é um problema, a ferramenta funciona muito bem.

Tomas
fonte
"mas é um problema"? Eu não acho que seja um problema.
19413 Kerrek SB
Citação: "ferramenta que tenta recuperar todos os aplicativos na memória física". Com o "processo de fome de memória" do pôster, isso pode não funcionar.
precisa
@harrymc citar a questão: After the big process is finished, most processes are left in swap.. Então, presumivelmente, ele já terminou o "processo de fome de memória".
Rik
@KerrekSB é claro, isso foi um erro de digitação. Obrigado :-)
Tomas
@ Tomas eu encontrei isso . Com meu conhecimento muito limitado de c ++, verifiquei que, para cada acesso com falha, a página é realmente protegida pelo bit PAGE_GUARD. Eu usei if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }logo antes da ReadProcessMemorylinha. PAGE_GUARD é 256 e recebi 260 com as páginas com falha. Portanto, é possível se livrar dos erros. Alguém com algum conhecimento em c ++ e paginação precisa ler o bit PAGE_GUARD.
Rik
1

Você pode usar o Process Lasso para dar a um processo uma prioridade da página Memória :

A partir do Windows Vista, cada página de memória tem uma prioridade que varia de 0 a 7. A Lista de espera é dividida em oito listas, cada uma manipulando páginas de uma prioridade diferente. Quando o Gerenciador de memória deseja obter uma página da lista de espera, ele pega primeiro as páginas das listas de baixa prioridade. "

O Process Lasso pode ajudar a gerenciar as prioridades de memória, permitindo que prioridades de memória persistentes sejam definidas para processos, para que suas páginas de memória virtual sejam definidas para uma prioridade específica a cada execução.

O Process Lasso tem duas versões: gratuita e comercial (US $ 18,95 com avaliação).

harrymc
fonte
Receio que você esteja respondendo a perguntas completamente diferentes. Dar prioridade ao processo de processo é uma tarefa diferente, provavelmente inútil no contexto do OP e eu esboçado: quando você já possui um processo que está em troca e deseja desassociá-lo. Você não quer impedir que ele seja trocado.
Tomas
@ Tomas: Esse não é o meu entendimento. A solicitação é para impedir que um determinado processo seja trocado. Se o processo em si não estiver programado para bloquear suas páginas na memória, a próxima melhor solução é dar a mais alta prioridade de memória para diminuir a probabilidade de troca.
harrymc
3
@harrymc, o OP diz que quando o porco da memória é executado, "tudo é trocado - como deveria", e é isso que o OP quer. Acontece que, na segunda-feira de manhã, ele deseja que os conjuntos de trabalho dos processos importantes sejam trazidos de uma só vez, e não em dribs e drabs por falhas de página ao longo do tempo.
mgkrebbs
@mgkrebbs: Essa é uma solução diferente para o problema, que acredito ser impossível de executar. Minha solução é que, se o IDE nunca for trocado, não haverá necessidade de trocá-lo novamente. O "processo com fome de memória" terá apenas alguns megabytes a menos de RAM, o que não afetará muito seu desempenho.
harrymc