2011-01-13 15 views
10

Zastanawiam się, czy można zapobiec zamianie pamięci na obiekt (klasę lub strukturę) na dysk?Czy można zatrzymać wymianę pamięci na dysk?

Edycja: Jeśli chodzi o to, dlaczego powiedziano mi, że niektóre dane, z którymi będę pracować, nie mogą być zapisane na dysku.
Nie oczekuję, że pozostanie wystarczająco długo, aby dane mogły zostać zamienione, ale pomyślałem, że warto to sprawdzić.

+4

Dlaczego chcesz temu zapobiec? =) – Jens

+2

Masz na myśli, oprócz używania go? Zazwyczaj martwienie się o takie rzeczy jest pozostawione systemowi operacyjnemu. Po prostu za pomocą tego zmniejszasz szansę na umieszczenie go w przestrzeni wymiany. Jeśli nie korzystałeś z niego ostatnio, istnieje duże prawdopodobieństwo, że umieścisz go na dysku. Czy na dysku są umieszczane obiekty często używane? – Crisfole

+2

Czuję mikrooptymalizację. Skąd wiesz, że to dla ciebie problem? –

Odpowiedz

4

Być może szukasz SecureString class, który nie zostanie zamieniony na dysk.

+0

Wątpię, że to jest to, czego szuka osoba pytająca, ale dzięki za link :) –

+3

Czy jest jakaś referencja, które dowody, że SecureString nie zostanie zamieniony? Widzę, że może to być GCed, nie jest łączone i jest niejawnie zaszyfrowane. Jeśli SecureString nie zostanie zamieniony, jego implementacja może dać wskazówkę. – atamanroman

+1

To nie jest dokładne. SecureString istnieje szczególnie po to, aby uniknąć powrotu łańcucha do pliku stronicowania. –

0

Niezupełnie, to rzecz systemu operacyjnego.

Zapewniamy, że strategia stronicowania systemu Windows będzie priorytetowo traktować utrzymywanie w pamięci najczęściej używanych stron, więc jeśli dana strona jest ważna dla aplikacji, będzie tam w miarę możliwości.

0

Um, dobre pytanie .. możesz całkowicie wyłączyć zamianę w oknach (size = 0), ale idk jeśli to wystarczy, aby zapobiec zamianie .NET.

+0

wygląda na to, że może to być jedyny sposób :( – Dreaddan

3

Jest to technicznie możliwe. Strony pamięci można zablokować w pamięci RAM za pomocą funkcji API VirtualLock(). Problem polega na tym, że musisz podać adres strony, którą chcesz zablokować. Nie możesz uzyskać tego adresu w żaden udokumentowany sposób z garbage collectora. Nie składa się też żadna obietnica, że ​​adres dla sterty nr 0 generatora będzie powtarzalny. Po pierwsze, rozmiar tej sterty jest dynamiczny, zwykle w zakresie od 2 do 8 megabajtów, w zależności od schematu alokacji programu.

Po prostu losowe blokowanie dużego zakresu z nadzieją, że złapiesz większość z nich też nie działa. Proces uzyskuje limit blokowanych stron. Nie jest zbyt duży, przede wszystkim dlatego, że jest tak destabilizujący dla działania maszyny. Smoki żyją tutaj.

+0

Można by pomyśleć, że ms dostarczył .net equiv z VirtualLock. – Dreaddan

8

Nadal nie wiem, dlaczego chcesz to zrobić. W kontekście języka C# musisz zrobić dwie rzeczy: "przypiąć" pamięć, aby nie mogła zostać przeniesiona przez odśmiecanie, a następnie zablokować ją, aby nie została zamieniona.

Oto miły blogu, który opisuje jak to zrobić pierwsza część (przypinania):

http://www.matthew-long.com/2005/10/18/memory-pinning/

Teraz trzeba adres i zakres przedmiotu, aby móc powołać VirtualLock:

http://msdn.microsoft.com/en-us/library/Aa366895

Zauważ, że VirtualLock tylko blokuje strony (jednostki 4k), dzięki czemu obszar pamięci musi być przynajmniej tak duża, a dostosowane do początku strony . Zakładam, że należy go wywołać w kontekście unsafe, chociaż nie jestem pewien.

Poprzedni wpis na ten temat: Prevent an object from being paged out (VirtualLock equivalent)

Kolejny związany blogu: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

4

zrobiłbym coś zupełnie innego:

zbudować piękny natywną owijania C++ DLL z telefonem pożądane funkcje/alokacje/cokolwiek, co , które również sprawi, że dane nie zostaną zamienione (VirtualLock, jak ktoś tu powiedział). Użyj go z C#.

Mimo wszystko, natywnie jest to możliwe, po prostu jesteś teraz związany z C#. Więc obejdź to!

0

W zależności od środowiska można to również zrobić na poziomie systemu operacyjnego - wystarczy użyć bardzo mocnej maszyny z dużą ilością pamięci RAM i całkowicie wyłączyć funkcję stronicowania/wymiany. Oznacza to, że lepiej nie przekraczać tej pamięci RAM, ale to właśnie tam powraca zadanie do C# - można ograniczyć maksymalne wykorzystanie pamięci dzięki inteligentnemu projektowi.

https://www.howtogeek.com/126430/htg-explains-what-is-the-windows-page-file-and-should-you-disable-it/

Powiązane problemy