2011-01-13 17 views
10

Tôi đã tự hỏi nếu nó có thể ngăn chặn bộ nhớ của một đối tượng (lớp hoặc cấu trúc) từ được trao đổi vào đĩa?Bạn có thể ngừng bộ nhớ bị đổi sang đĩa không?

Chỉnh sửa: Đối với lý do tại sao tôi đã được thông báo một số dữ liệu tôi sẽ làm việc với không thể ghi vào đĩa.
Tôi không mong đợi nó được để lại đủ lâu để dữ liệu được hoán đổi nhưng nghĩ rằng nó đáng để kiểm tra.

+4

Tại sao bạn muốn ngăn điều này? =) – Jens

+2

Bạn có nghĩa là ngoài việc sử dụng nó? Thông thường lo lắng về loại điều đó là trái với hệ điều hành. Đơn giản chỉ cần bằng cách sử dụng nó, bạn làm giảm cơ hội của nó được đặt trong không gian trao đổi của bạn. Nếu bạn chưa sử dụng nó gần đây, rất có thể là ok để đặt nó trên đĩa. Bạn có thấy các đối tượng thường xuyên được sử dụng đang được đặt trên đĩa không? – Crisfole

+2

Tôi ngửi thấy một tối ưu hóa vi mô. Làm thế nào để bạn biết đây là một vấn đề cho bạn? –

Trả lời

4

Bạn có thể đang tìm kiếm SecureString class, sẽ không được đổi thành đĩa.

+0

Tôi nghi ngờ đó là những gì người hỏi đang tìm kiếm, nhưng cảm ơn cho liên kết :) –

+3

Có bất kỳ tài liệu tham khảo nào có sẵn để chứng minh rằng SecureString không bị hoán đổi không? Tôi thấy rằng nó có thể được GC, không nhận được gộp lại và được mã hóa hoàn toàn. Nếu SecureString không được hoán đổi, việc thực hiện của nó có thể đưa ra một gợi ý. – atamanroman

+1

Điều này không chính xác. SecureString tồn tại đặc biệt để tránh nhìn thấy chuỗi trở lại trong tệp hoán trang. –

0

Không thực sự, đó là điều hệ điều hành.

Chỉ cần yên tâm rằng chiến lược phân trang của Windows sẽ ưu tiên giữ trong bộ nhớ các trang được truy cập thường xuyên nhất, vì vậy nếu một trang nhất định quan trọng đối với ứng dụng của bạn, nó sẽ ở đó càng nhiều càng tốt.

0

Um, câu hỏi hay .. bạn có thể vô hiệu hóa hoán đổi trong cửa sổ hoàn toàn (size = 0), nhưng idk nếu điều đó đủ để ngăn chặn. NET từ trao đổi.

+0

có vẻ như đây là cách duy nhất :( – Dreaddan

3

Đây chỉ là kỹ thuật có thể. Các trang bộ nhớ có thể bị khóa trong RAM với hàm VirtualLock() API. Vấn đề là, yêu cầu cung cấp địa chỉ của (các) trang bạn muốn khóa. Bạn không thể lấy địa chỉ này theo bất kỳ cách nào được ghi lại từ bộ thu gom rác. Nó cũng không hứa hẹn rằng, cùng một địa chỉ cho, ví dụ, heap gen # 0 sẽ lặp lại được. Đối với một, kích thước của đống đó là năng động, thường nằm trong khoảng từ 2 đến 8 megabyte, tùy thuộc vào mẫu phân bổ của chương trình.

Chỉ cần khóa ngẫu nhiên một phạm vi rộng lớn với hy vọng rằng bạn sẽ bắt được hầu hết trong số chúng cũng không hoạt động. Quá trình nhận hạn ngạch các trang có thể khóa. Nó không phải là rất lớn, trên tất cả bởi vì nó là như vậy gây bất ổn cho hoạt động của máy. Rồng sống ở đây.

+0

Bạn sẽ nghĩ rằng ms sẽ cung cấp một equiv .net của VirtualLock. – Dreaddan

8

Tôi vẫn chưa rõ lý do bạn muốn thực hiện việc này. Trong ngữ cảnh của C#, bạn phải làm hai việc: "pin" bộ nhớ để nó không thể được di chuyển bằng cách thu gom rác, và sau đó khóa nó để nó không bị hoán đổi.

Đây là một bài viết trên blog đẹp mô tả làm thế nào để làm phần đầu tiên (ghim):

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

Bây giờ bạn cần địa chỉ và phạm vi của các đối tượng để có thể gọi VirtualLock:

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

Lưu ý rằng VirtualLock chỉ khóa trang (đơn vị thuộc 4K), do đó khu vực bộ nhớ của bạn cần phải có ít nhất là lớn, và liên kết để khởi đầu của một trang . Tôi giả định rằng nó cần phải được gọi trong một bối cảnh unsafe, mặc dù tôi không chắc chắn.

đăng tải trước đây về chủ đề này: Prevent an object from being paged out (VirtualLock equivalent)

Một bài viết trên blog có liên quan: http://geekswithblogs.net/robp/archive/2008/08/13/speedy-c-part-3-understanding-memory-references-pinned-objects-and.aspx

4

Tôi muốn làm điều gì đó hoàn toàn khác nhau:

Xây dựng một đẹp tự nhiên gói C++ DLL với bạn các hàm/phân bổ mong muốn/bất cứ điều gì cũng sẽ đảm bảo rằng dữ liệu không được đổi chỗ (VirtualLock như ai đó đã nói ở đây). Sử dụng nó từ C#.

Sau khi tất cả, thực sự nó có thể, nó chỉ là bạn đang bị ràng buộc để C#. Vì vậy, có được xung quanh nó!

0

Tùy thuộc vào môi trường của bạn, bạn cũng có thể thực hiện điều này ở cấp hệ điều hành - chỉ cần sử dụng máy thực sự mạnh mẽ với nhiều RAM và tắt phân trang/hoán đổi hoàn toàn. Nó có nghĩa là bạn tốt hơn không bao giờ vượt qua RAM đó, nhưng đó là nơi mà nhiệm vụ trở lại C# - bạn có thể hạn chế sử dụng bộ nhớ tối đa với thiết kế thông minh.

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

Các vấn đề liên quan