프로세스가 완전히 교체되지 않도록 Windows에 힌트를 줄 수 있습니까?


13

Windows 가상 메모리 관리자에게 특정 프로세스를 스왑에서 가져 오도록 암시 할 수 있습니까?

내가 자주 찾는 상황은 일반적으로 모든 일반 프로그램에 RAM의 약 50 %를 사용하는 것입니다. 하나는 임베디드 대상의 IDE와 관련 디버거와 함께 사용됩니다.

그런 다음 wireshark 또는 주말에 데이터를 축적하는 메모리 배고픈 프로세스를 실행 상태로 둡니다. 모든 것이 스왑 아웃됩니다. 큰 프로세스가 완료된 후 대부분의 프로세스는 스왑 상태로 남아 있습니다.

IDE와 하드웨어 디버거 사이의 통신 타이밍 문제로 인해 디버거에 문제가 발생했을 때 프로세스를 다시 스왑하기 위해 산발적으로 일시 중지됩니다. 따라서 충분한 시도로 IDE의 디버그 데이터가 스왑에서 벗어날 때까지 대상 장치의 제어가 산발적 일 수 있습니다.


이것은 매우 유용합니다! 사용자의 관점에서 볼 때, 각 클릭 또는 사용자 작업 후 교체 프로세스를 기다리는 것은 성가신 일입니다. "이 과정을 바꾸지 마십시오!" 라고 말하는 것이 훨씬 좋습니다 . 커피를 마시고 반응 형 시스템으로 돌아갑니다!
Tomas

나는 Windows의 스와핑 프로세스의 세부 사항에 익숙하지 않지만 이것이 당신이 찾고있는 것입니까? 주석에는 작동하는 바이너리 예제가 있어야합니다.
Rik

1
한때 비슷한 질문 이 있었고 Stack Overflow에 대한 답변을 기반으로 프로그램을 작성했습니다.
Kerrek SB 2016

@ Kerrek, MinGW에서 코드를 컴파일하려고 시도 할 때마다 "0x161000에서 1 바이트를 읽지 못했습니다. 오류 299 (0 바이트 읽음)"라는 오류가 발생했습니다. 직장에 Windows 만 있기 때문에 첨부 한 임의의 바이너리를 실행할만큼 용감하지 않아서 컴파일에 문제가있을 수 있습니다.
Greg

1
@ KerrekSB는 사소한 문제처럼 보입니다. 어쩌면 매핑되지 않은 메모리 영역을 만지고 있습니까? 어쨌든 나는 당신의 대답이 현상금을받을 가치가 있다고 생각합니다 :) PS : 언 스왑은 HDD 속도와 비교할 때보 다 느리게 보입니다. 병목 현상이 다른 곳인 것 같습니다.
Tomas

답변:


1

KerrekSB는 이러한 목적을 위해 특별한 도구를 개발했습니다.

/programming//a/2940209/684229

바이너리가있는 GiTHUB에서 사용할 수 있습니다 : https://github.com/louisdx/unpage

실행 중에 "0x .... 000에서 1 바이트를 읽지 못했습니다. 오류 299 (0 바이트를 읽음)"오류가 많이 발생하지만 문제는 아닙니다. 도구가 훌륭하게 작동합니다.


"하지만 문제가 있습니까?" 나는 그것이 문제라고 생각하지 않습니다.
Kerrek SB

인용 : " 모든 응용 프로그램 을 실제 메모리로 되돌리려 고 시도하는 도구 ". 포스터의 "메모리 배고픈 프로세스"에서는 작동하지 않을 수 있습니다.
harrymc

@harrymc 질문에서 인용하십시오 : After the big process is finished, most processes are left in swap.. 아마 그는 이미 "메모리 배고픈 과정"을 끝냈다.
Rik

@KerrekSB는 물론 오타였습니다. 감사합니다 :-)
Tomas

@Tomas 나는 이것을 발견 했다 . c ++에 대한 나의 제한된 지식으로 모든 실패한 액세스에 대해 페이지가 실제로 PAGE_GUARD 비트에 의해 보호되는지 확인했습니다. 나는 -line if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }직전에 사용했다 ReadProcessMemory. PAGE_GUARD는 256이며 실패한 페이지는 260입니다. 따라서 오류를 제거 할 수 있습니다. 일부 C ++ 및 페이징 지식이있는 사람은 PAGE_GUARD 비트를 읽어야합니다.
Rik

1

프로세스 올가미 를 사용하여 프로세스에 메모리 페이지 우선 순위 를 부여 할 수 있습니다 .

Windows Vista부터 각 메모리 페이지의 우선 순위는 0에서 7까지입니다. 대기 목록은 각기 다른 우선 순위의 페이지를 처리하는 8 개의 목록으로 나뉩니다. 메모리 관리자가 대기 목록에서 페이지를 가져 오려면 우선 순위가 낮은 목록에서 페이지를 먼저 가져옵니다. "

프로세스 올가미는 프로세스에 영구 메모리 우선 순위를 설정하여 가상 메모리 페이지가 실행될 때마다 특정 우선 순위로 설정되도록함으로써 메모리 우선 순위를 관리하는 데 도움을 줄 수 있습니다.

프로세스 올가미에는 무료 버전과 상업용 버전이 있습니다 (시험 사용시 18.95 달러).


나는 당신이 완전히 다른 질문에 대답하는 것을 두려워합니다. 프로세스 프로세스에 메모리 우선 순위를 부여하는 것은 다른 작업으로, 아마도 컨텍스트 OP에서 쓸모가 없으며 스케치했습니다. 스왑 상태의 프로세스가 있고 스왑하지 않으려는 경우. 스왑을 방지하고 싶지 않습니다.
Tomas

@Tomas : 그건 내 이해가 아닙니다. 요청은 주어진 프로세스가 스왑 아웃되는 것을 방지하는 것입니다. 프로세스 자체가 페이지를 메모리에 잠그도록 프로그래밍되지 않은 경우 다음으로 가장 좋은 해결책은 스왑 아웃을 줄이기 위해 메모리 우선 순위를 가장 높게하는 것입니다.
harrymc

3
OP, @harrymc, OP는 메모리 호그가 실행될 때 "모든 것이 필요에 따라 스왑 아웃"되므로 OP가 원하는 것을 말합니다. 월요일 아침에 그는 시간이 지남에 따라 페이지 오류로 인해 멍청한 멍청한 녀석이 아닌 중요한 프로세스의 작업 세트를 한 번에 가져 오기를 원합니다.
mgkrebbs

@ mgkrebbs : 그것은 불가능한 것으로 생각되는 문제에 대한 다른 해결책입니다. 내 솔루션은 IDE가 스왑 아웃되지 않으면 다시 스왑 할 필요가 없다는 것입니다. "메모리 굶주린 프로세스"는 RAM에 몇 메가 바이트가 적어 성능에 큰 영향을 미치지 않습니다.
harrymc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.