개체 (클래스 또는 구조체)의 메모리가 디스크로 스왑되는 것을 방지 할 수 있는지 궁금합니다.메모리가 디스크로 스왑되지 않도록 할 수 있습니까?
편집 : 제가 작업하게 될 데이터 중 일부가 디스크에 기록 될 수 없다는 이유는 무엇입니까?
데이터를 스왑 아웃 할 수있을만큼 길게 머물러 있지만 기대할 가치가 있다고 생각하지는 않습니다.
개체 (클래스 또는 구조체)의 메모리가 디스크로 스왑되는 것을 방지 할 수 있는지 궁금합니다.메모리가 디스크로 스왑되지 않도록 할 수 있습니까?
편집 : 제가 작업하게 될 데이터 중 일부가 디스크에 기록 될 수 없다는 이유는 무엇입니까?
데이터를 스왑 아웃 할 수있을만큼 길게 머물러 있지만 기대할 가치가 있다고 생각하지는 않습니다.
디스크로 교체되지 않는 SecureString
class을 찾고있을 수 있습니다.
질문자가 찾고있는 것이 아닌가 의심 스럽지만, 링크 감사합니다. –
SecureString이 스왑되지 않는다는 증거가 있습니까? GCed 될 수 있고 풀링되지 않고 암시 적으로 암호화된다는 것을 알았습니다. SecureString이 스왑되지 않으면 구현시 힌트가 제공 될 수 있습니다. – atamanroman
정확하지 않습니다. SecureString은 페이징 파일에서 문자열을 다시 보는 것을 피하기 위해 특히 존재합니다. –
실제로는 운영 체제의 문제입니다.
Windows의 페이징 전략이 가장 자주 액세스되는 페이지를 메모리에 유지하는 것이 우선되므로 안심하십시오. 특정 페이지가 응용 프로그램에서 중요하다면 가능한 한 많이 페이지에 놓이게됩니다.
음, 좋은 질문 .. Windows에서 스왑을 완전히 비활성화 (크기 = 0) 할 수 있지만 idk가 .NET 스와핑을 방지하기에 충분할 경우 비활성화 할 수 있습니다.
이것이 유일한 방법 일 수 있습니다. :( – Dreaddan
이것은 기술적으로 가능합니다. 메모리 페이지는 VirtualLock() API 함수로 RAM에 잠글 수 있습니다. 문제는 잠겨 원하는 페이지의 주소를 제공해야한다는 것입니다. 가비지 수집기에서 문서화 된 방식으로이 주소를 가져올 수 없습니다. 또한, 예를 들어 gen # 0 힙에 대해 과 동일한 주소가 반복 가능하다는 약속도하지 않습니다. 하나의 경우, 힙의 크기는 동적이며 보통 프로그램의 할당 패턴에 따라 2 ~ 8MB 정도입니다.
큰 범위를 무작위로 잠그면 그 중 대부분을 잡을 수있는 희망은 작동하지 않습니다. 프로세스가 잠글 수있는 페이지의 할당량을 얻습니다. 무엇보다 기계의 작동에 너무 불안정하기 때문에 그다지 크지 않습니다. 용들이 여기에 살고 있습니다.
당신은 ms가 VirtualLock의 .net equiv를 제공했을 것이라고 생각했을 것입니다. – Dreaddan
왜 이렇게하고 싶은지 아직 확실하지 않습니다. 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
나는 완전히 다른 뭔가를 할 거라고 :에
이 좋은 기본 포장 C++ DLL 구축을 당신의 원하는 기능/할당/뭐든간에 (여기 누군가가 말한대로 VirtualLock) 데이터가 교환되지 않는지 확인하십시오 . C#에서 사용하십시오.
결국 기본적으로 C#에 바인딩되어있을 가능성이 있습니다. 그래서 주위를 돌아보십시오!
환경에 따라 OS 레벨에서이 작업을 수행 할 수도 있습니다. RAM이 많은 실제 가동되지 않는 컴퓨터를 사용하고 페이징/스왑을 완전히 비활성화하십시오. RAM을 초과하지 않는 것이 좋겠지 만 C#으로 돌아가는 작업입니다. 스마트 디자인으로 최대 메모리 사용량을 제한 할 수 있습니다.
왜 이것을 방지 하시겠습니까? =) – Jens
사용 외에 사용 하시겠습니까? 일반적으로 그런 종류의 것에 대해 걱정하는 것은 운영체제에 달려 있습니다. 간단히 사용하면 스왑 공간에 배치 될 가능성이 줄어 듭니다. 최근에 사용하지 않았다면 디스크에 넣을 수 있습니다. 자주 사용되는 개체가 디스크에 놓여있는 것을 보십니까? – Crisfole
마이크로 최적화의 냄새가납니다. 이것이 당신에게 어떤 문제가 있음을 어떻게 알 수 있습니까? –