Czy można zasugerować systemowi Windows całkowite wyeliminowanie procesu wymiany?

13

Czy można zasugerować menedżerowi pamięci wirtualnej systemu Windows, aby wyciągnął konkretny proces z wymiany?

Sytuacja, w której często się znajduję, zwykle wykorzystuje około 50% pamięci RAM dla wszystkich normalnych programów, w szczególności IDE dla osadzonego obiektu docelowego wraz z powiązanym z nim debugerem.

Potem zostawiam proces głodny pamięci - np. Wireshark lub coś, co gromadzi dane przez weekend, wszystko zostaje zamienione - tak jak powinno. Po zakończeniu dużego procesu większość procesów zostaje zamieniona.

Następnie sporadyczne przerwy w zamianie procesu z powrotem powodują problemy z debuggerem, prawdopodobnie z powodu problemów z czasem w komunikacji między IDE a sprzętowym debuggerem. Tak więc kontrola nad urządzeniem docelowym może być sporadyczna, dopóki wystarczająca liczba prób nie usunie danych debugowania w IDE z powrotem z wymiany.

Greg
źródło
To byłoby bardzo przydatne! Z punktu widzenia użytkowników denerwujące jest oczekiwanie na proces wymiany po każdym kliknięciu lub akcji użytkownika. O wiele lepiej byłoby powiedzieć: „odwróć ten proces!” , idź na kawę i wróć do responsywnego systemu!
Tomas
Nie znam specyfiki procesu zamiany systemu Windows, ale czy jest to coś, czego szukasz? W komentarzach powinien znajdować się działający przykład binarny.
Rik
1
Kiedyś miałem podobne pytanie i napisałem program na podstawie odpowiedzi, które otrzymałem na Stack Overflow.
Kerrek SB
@Kerrek, próbowałem skompilować kod pod MinGW i dostałem błędy przy każdym odczycie „Nie udało się odczytać jednego bajtu z 0x161000, błąd 299 (odczyt 0 bajtów)”. Ponieważ mam tylko system Windows w pracy, nie byłem wystarczająco odważny, aby uruchomić losowy plik binarny, który załączyłeś, więc problem mógł wystąpić w mojej kompilacji.
Greg
1
@KrekrekSB, wydaje się niewielkim problemem. Może dotykasz obszaru pamięci, który nie jest zmapowany? W każdym razie myślę, że twoja odpowiedź zasługuje na nagrodę :) PS: odwracanie wydaje się znacznie wolniejsze niż mogłoby być, w porównaniu do prędkości HDD. Wydaje się, że wąskim gardłem jest gdzie indziej, ale gdzie?
Tomas

Odpowiedzi:

1

KerrekSB opracował specjalne narzędzie do tego celu:

/programming//a/2940209/684229

Jest dostępny w GiTHUB z plikami binarnymi: https://github.com/louisdx/unpage

Podczas uruchamiania pojawia się wiele błędów „Nie udało się odczytać jednego bajtu z 0x .... 000, błąd 299 (odczyt 0 bajtów)”, ale to nie jest problem, narzędzie działa świetnie.

Tomas
źródło
„ale to jest problem”? Nie sądzę, że to problem.
Kerrek SB,
Cytat: „narzędzie, które próbuje przywrócić wszystkie aplikacje do pamięci fizycznej”. W przypadku „procesu głodnego pamięci” plakatu może to nie działać.
harrymc
@harrymc cytat z pytaniem: After the big process is finished, most processes are left in swap.. Prawdopodobnie zakończył już „proces głodny pamięci”.
Rik
@KerrekSB oczywiście, to była literówka. Dzięki :-)
Tomas,
@Tomas Znalazłem to . Mając bardzo ograniczoną wiedzę na temat c ++, zweryfikowałem, że za każdy nieudany dostęp strona jest rzeczywiście chroniona przez bit PAGE_GUARD. Użyłem if (meminfo.Protect > 50) { std::cerr << meminfo.Protect << " - " << PAGE_GUARD << std::endl; }tuż przed linią ReadProcessMemory. PAGE_GUARD to 256 i mam 260 z uszkodzonymi stronami. Można więc pozbyć się błędów. Ktoś z pewną wiedzą na temat języków C ++ i stronicowania musi czytać bit PAGE_GUARD.
Rik
1

Możesz użyć Process Lasso, aby nadać procesowi priorytet strony Pamięć :

Począwszy od systemu Windows Vista, każda strona pamięci ma priorytet w zakresie od 0 do 7. Lista rezerwowa jest podzielona na osiem list, z których każda obsługuje strony o innym priorytecie. Gdy Menedżer pamięci chce pobrać stronę z listy rezerwowej, najpierw pobiera strony z list o niskim priorytecie. „

Process Lasso może pomóc w zarządzaniu priorytetami pamięci, umożliwiając ustawianie trwałych priorytetów pamięci dla procesów, dzięki czemu ich strony pamięci wirtualnej mają określony priorytet przy każdym uruchomieniu.

Process Lasso ma dwie wersje: bezpłatną i komercyjną (18,95 USD z wersją próbną).

harrymc
źródło
Obawiam się, że odpowiadasz na zupełnie inne pytanie. Nadanie procesowi priorytetu pamięci to inne zadanie, prawdopodobnie bezużyteczne w kontekście OP i ja naszkicowałem: kiedy już masz proces, który jest w trakcie wymiany i chcesz go odwrócić. Nie chcesz zapobiegać zamianie.
Tomas
@Tomas: To nie jest moje zrozumienie. Żądanie to ma zapobiec wymianie danego procesu. Jeśli sam proces nie jest zaprogramowany do blokowania stron w pamięci, kolejnym najlepszym rozwiązaniem jest nadanie mu najwyższego priorytetu pamięci, aby zmniejszyć prawdopodobieństwo jego zamiany.
harrymc
3
@harrymc, OP mówi, kiedy świnia pamięci działa: „wszystko zamienia się - tak jak powinno”, więc tego chce OP. Tyle, że w poniedziałek rano chce, aby zestawy robocze ważnych procesów zostały wprowadzone naraz, a nie w dryblingach i szarościach z powodu błędów stron w czasie.
mgkrebbs,
@mgkrebbs: To inne rozwiązanie problemu, które moim zdaniem jest niemożliwe. Moje rozwiązanie polega na tym, że jeśli IDE nigdy nie zostanie zamienione, nie ma potrzeby wymiany go z powrotem. „Proces głodny pamięci” będzie miał tylko kilka megabajtów mniej pamięci RAM, co nie wpłynie zbytnio na jego wydajność.
harrymc