2011-01-13 3 views
10

개체 (클래스 또는 구조체)의 메모리가 디스크로 스왑되는 것을 방지 할 수 있는지 궁금합니다.메모리가 디스크로 스왑되지 않도록 할 수 있습니까?

편집 : 제가 작업하게 될 데이터 중 일부가 디스크에 기록 될 수 없다는 이유는 무엇입니까?
데이터를 스왑 아웃 할 수있을만큼 길게 머물러 있지만 기대할 가치가 있다고 생각하지는 않습니다.

+4

왜 이것을 방지 하시겠습니까? =) – Jens

+2

사용 외에 사용 하시겠습니까? 일반적으로 그런 종류의 것에 대해 걱정하는 것은 운영체제에 달려 있습니다. 간단히 사용하면 스왑 공간에 배치 될 가능성이 줄어 듭니다. 최근에 사용하지 않았다면 디스크에 넣을 수 있습니다. 자주 사용되는 개체가 디스크에 놓여있는 것을 보십니까? – Crisfole

+2

마이크로 최적화의 냄새가납니다. 이것이 당신에게 어떤 문제가 있음을 어떻게 알 수 있습니까? –

답변

4

디스크로 교체되지 않는 SecureString class을 찾고있을 수 있습니다.

+0

질문자가 찾고있는 것이 아닌가 의심 스럽지만, 링크 감사합니다. –

+3

SecureString이 스왑되지 않는다는 증거가 있습니까? GCed 될 수 있고 풀링되지 않고 암시 적으로 암호화된다는 것을 알았습니다. SecureString이 스왑되지 않으면 구현시 힌트가 제공 될 수 있습니다. – atamanroman

+1

정확하지 않습니다. SecureString은 페이징 파일에서 문자열을 다시 보는 것을 피하기 위해 특히 존재합니다. –

0

실제로는 운영 체제의 문제입니다.

Windows의 페이징 전략이 가장 자주 액세스되는 페이지를 메모리에 유지하는 것이 우선되므로 안심하십시오. 특정 페이지가 응용 프로그램에서 중요하다면 가능한 한 많이 페이지에 놓이게됩니다.

0

음, 좋은 질문 .. Windows에서 스왑을 완전히 비활성화 (크기 = 0) 할 수 있지만 idk가 .NET 스와핑을 방지하기에 충분할 경우 비활성화 할 수 있습니다.

+0

이것이 유일한 방법 일 수 있습니다. :( – Dreaddan

3

이것은 기술적으로 가능합니다. 메모리 페이지는 VirtualLock() API 함수로 RAM에 잠글 수 있습니다. 문제는 잠겨 원하는 페이지의 주소를 제공해야한다는 것입니다. 가비지 수집기에서 문서화 된 방식으로이 주소를 가져올 수 없습니다. 또한, 예를 들어 gen # 0 힙에 대해 과 동일한 주소가 반복 가능하다는 약속도하지 않습니다. 하나의 경우, 힙의 크기는 동적이며 보통 프로그램의 할당 패턴에 따라 2 ~ 8MB 정도입니다.

큰 범위를 무작위로 잠그면 그 중 대부분을 잡을 수있는 희망은 작동하지 않습니다. 프로세스가 잠글 수있는 페이지의 할당량을 얻습니다. 무엇보다 기계의 작동에 너무 불안정하기 때문에 그다지 크지 않습니다. 용들이 여기에 살고 있습니다.

+0

당신은 ms가 VirtualLock의 .net equiv를 제공했을 것이라고 생각했을 것입니다. – Dreaddan

8

왜 이렇게하고 싶은지 아직 확실하지 않습니다. C#의 컨텍스트에서는 두 가지 작업을 수행해야합니다. 가비지 수집에서 재배치 할 수 없도록 메모리를 "고정"한 다음 스왑 아웃하지 않도록 잠급니다. 여기

은 첫 번째 부분 (고정)을 수행하는 방법을 설명하는 좋은 블로그 게시물입니다 :

이제

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

당신이 VirtualLock를 호출 할 수있는 객체의 주소와 범위를 필요

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

VirtualLock 있음은 그래서 당신의 메모리 영역은 적어도 그 커야하고, 페이지의 시작에 정렬 페이지 (4K 단위)를 잠급니다 . 나는 그것이 확실하지 않지만 unsafe 컨텍스트에서 호출되어야한다고 가정합니다.

주제에

이전 게시물 : Prevent an object from being paged out (VirtualLock equivalent)

또 다른 관련 블로그 게시물 : http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

4

나는 완전히 다른 뭔가를 할 거라고 :에

이 좋은 기본 포장 C++ DLL 구축을 당신의 원하는 기능/할당/뭐든간에 (여기 누군가가 말한대로 VirtualLock) 데이터가 교환되지 않는지 확인하십시오 . C#에서 사용하십시오.

결국 기본적으로 C#에 바인딩되어있을 가능성이 있습니다. 그래서 주위를 돌아보십시오!

0

환경에 따라 OS 레벨에서이 작업을 수행 할 수도 있습니다. RAM이 많은 실제 가동되지 않는 컴퓨터를 사용하고 페이징/스왑을 완전히 비활성화하십시오. RAM을 초과하지 않는 것이 좋겠지 만 C#으로 돌아가는 작업입니다. 스마트 디자인으로 최대 메모리 사용량을 제한 할 수 있습니다.

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

관련 문제