2011-01-14 71 views
7

Hệ thống của tôi: bộ nhớ vật lý: 3GB
Windows XP Service Pack 3 (32bit) Swap kích thước tập tin: 30GB
kích thước phân bổ bản đồ bộ nhớ lớn nhất?

Mục tiêu: Để biết kích thước bản đồ bộ nhớ có thể lớn nhất tôi có thể phân bổ trên máy tính của tôi.

Khi tôi chạy đoạn mã sau để cấp phát tệp bản đồ bộ nhớ 2GB, cuộc gọi không thành công.

handle = CreateFileMapping (INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, INT_MAX, NULL);

Tôi đã rất bối rối bởi điều này, bởi vì tôi có thể phân bổ một tệp bản đồ bộ nhớ lên đến kích thước tệp hoán đổi hệ thống là 30GB bằng cách liên tục gọi CreateFileMapping với 100mb tại một thời điểm.

Sau khi khởi động lại máy và chạy lại ứng dụng yêu cầu 2GB tệp ánh xạ bộ nhớ để CreateFileMapping nó hoạt động và nó trả về một xử lý hợp lệ. Vì vậy, điều này dẫn tôi một chút bối rối những gì đang xảy ra dưới mui xe với các cửa sổ?

Vì vậy, tình huống này, tôi có thể tạo nhiều tệp ánh xạ bộ nhớ nhỏ bằng cách sử dụng tất cả tệp trang hệ thống (30GB), nhưng khi yêu cầu phân bổ duy nhất 2gb cuộc gọi không thành công. Khi khởi động lại máy và chạy cùng một ứng dụng, cuộc gọi thành công!

Một số ghi chú:
1) Tệp ánh xạ bộ nhớ không được tải vào không gian địa chỉ ảo quá trình, không có chế độ xem nào cho tệp.
2) Hệ điều hành có thể cấp phát các tệp ánh xạ bộ nhớ 100MB nhỏ lên 30gb tệp trang của hệ thống! Ngay bây giờ là kết luận duy nhất tôi có thể đến, là người quản lý bộ nhớ ảo Windows XP SP3 (32bit) không thể dự trữ thành công 2gb được yêu cầu trong tệp trang hệ thống và sau đó không thành công do phân mảnh bộ nhớ hệ thống (nó bị lỗi). có vẻ như nó cần phải dự trữ phân bổ bộ nhớ tiếp tục, mặc dù tệp trang là 4kb mỗi bộ nhớ). Sau khi khởi động lại, tôi cho rằng phân mảnh bộ nhớ hệ thống ít hơn, do đó cho phép cùng một cuộc gọi thành công và phân bổ một tệp ánh xạ bộ nhớ có kích thước 2GB.

Tôi đã chạy một số thử nghiệm, sau khi chạy máy trong một ngày, tôi bắt đầu một ứng dụng nhỏ sẽ cấp phát một tệp bản đồ bộ nhớ 300MB và sau đó phát hành nó. Sau đó nó sẽ tăng kích thước lên 1mb và thử lại. Cuối cùng nó dừng lại ở 700mb và báo cáo (không đủ tài nguyên hệ thống). Sau đó tôi sẽ đi qua và đóng cửa mỗi ứng dụng và điều này sẽ lần lượt ngăn chặn các thông báo lỗi và nó cuối cùng tiếp tục phân bổ một tập tin ánh xạ bộ nhớ của kích thước 3.5gb!

Vì vậy, câu hỏi của tôi là những gì đang xảy ra ở đây? Phải có một số loại phân mảnh bộ nhớ xảy ra trong nội bộ với trình quản lý bộ nhớ ảo, bởi vì phân bổ 100MB bộ nhớ ánh xạ tập tin sẽ tiêu thụ lên đến 30gb của tập tin trang hệ thống (cam kết giới hạn).

Cập nhật
Kết luận là nếu bạn đang đi để tạo ra một bộ nhớ ánh xạ tập tin lớn được hỗ trợ bởi các tập tin trang hệ thống với INVALID_HANDLE_VALUE, sau đó các tập tin hệ thống trang (swap file) cần phải được thay đổi kích thước với kích thước yêu cầu và ở trong trạng thái không bị phân mảnh cho số phân bổ lớn> 2gb! Mặc dù dưới tải IO nặng nó vẫn có thể thất bại. Để khắc phục tất cả những vấn đề này, bạn có thể tạo tệp của riêng mình với kích thước cần thiết (tôi đã làm 1tb) và bản đồ bộ nhớ cho tệp đó thay thế.

Cập nhật cuối cùng
Tôi chạy cái test tương tự trên 7 hộp Windows, và trước sự ngạc nhiên của tôi nó hoạt động mỗi lần duy nhất (lên đến kích thước tập tin trang hệ thống) mà không cần chạm bất cứ điều gì. Vì vậy, tôi đoán đây chỉ là một lỗi, phân bổ bộ nhớ lớn có thể không thường xuyên hơn trên Windows XP so với Windows 7.

+0

Kết luận duy nhất tôi có thể đến, là bảng chứa 2gb tệp trang 4kb quá lớn để bộ nhớ hệ thống có thể xử lý sao cho không thành công. – Chad

+0

Đây là một bí ẩn. Bất kể bộ nhớ ảo và vật lý của bạn lớn đến mức nào, cho dù bạn đang chạy bao nhiêu tiến trình, bạn không thể tạo tệp ánh xạ mem lớn hơn ~ 300MB trên Windows 32 bit. –

Trả lời

5

Vấn đề là tập tin phân mảnh. Bộ nhớ vật lý (RAM) không có gì để làm với bất cứ điều gì ở đây. Trong hệ thống bộ nhớ ảo, 'bộ nhớ' được cấp phát từ hệ thống tệp. Bộ nhớ vật lý chỉ là một tối ưu hóa để tăng tốc độ truy cập vào bộ nhớ.

Khi bạn yêu cầu tệp ánh xạ bộ nhớ có quyền ghi, hệ thống phải có tệp có các trang liền kề miễn phí. Tệp hoán đổi hệ thống thường bị phân mảnh. Nếu ổ đĩa của bạn bị phân mảnh độc đáo, bạn sẽ có thể tạo một tệp ánh xạ bộ nhớ lớn bằng cách sử dụng tệp bạn chọn (không phải tệp trang hệ thống).

Vì vậy, nếu bạn thực sự phải có tệp bộ nhớ 2GB được ánh xạ, bạn cần tạo một tệp trên ổ đĩa lúc cài đặt. Điều này làm thay đổi vấn đề tạo một tệp 2GB liền kề để cài đặt, nhưng khi được tạo, bạn nên ổn.

+0

Chống phân mảnh tệp trang hệ thống cho bạn biết cách thức hoạt động của nó – Chad

+0

Đã tạo thành công ánh xạ: 22,743mb – Chad

+0

Câu hỏi Tergiver. Theo tải IO nặng hoặc sử dụng bình thường của hệ điều hành phân bổ của tôi có thể đi từ 20gb xuống chỉ 6gb và đôi khi xuống tất cả các cách để 300mb. Giả định của tôi là trình quản lý bộ nhớ ảo của Windows đã đặt các trang trong tệp trang hệ thống phá vỡ khả năng tìm kiếm các trang tiếp tục miễn phí. Mặc dù chờ 30 phút sau khi chạy chương trình IO nặng, tôi lại có thể phân bổ lại 20GB. Bất kỳ ý tưởng gì đang xảy ra? Tôi đoán các cửa sổ cần thời gian để dỡ bỏ các trang đó. – Chad

0

Hãy chiếm vị trí nhà phát triển Windows. Giả sử một số người dùng thực hiện các bước sau:

  1. Tạo bản đồ bộ nhớ.
  2. điền một số bộ nhớ với dữ liệu nhạy cảm
  3. unmap từ file
  4. Tiếp tục sử dụng bộ nhớ
  5. Windows cần dỡ bỏ những trang này cho nhiệm vụ quan trọng.

Độ phân giải - bộ nhớ được ánh xạ sẽ thành công khi hoán đổi. Nhưng nó không có nghĩa là ánh xạ sẽ được hoán đổi.

3

Vì vậy, câu hỏi của tôi là những gì đang xảy ra ở đây? Phải có một số loại phân mảnh bộ nhớ xảy ra trong nội bộ với trình quản lý bộ nhớ ảo, vì việc phân bổ 100MB bộ nhớ ánh xạ các tệp sẽ tiêu thụ tối đa 30 GB của tệp trang hệ thống (giới hạn cam kết).

Nghe đúng. Nếu bạn không cần khối lượng bộ nhớ tiếp giáp lớn, đừng hỏi họ nếu bạn có thể nhận được cùng một lượng bộ nhớ trong các đoạn nhỏ hơn.

Để tìm kích thước bản đồ bộ nhớ có thể lớn nhất tôi có thể phân bổ trên máy của mình.

  • Hãy thử nó với kích thước X.
  • Nếu thất bại, hãy thử với kích thước X/2 và lặp lại.

này giúp bạn một đoạn trong thời gian chạy, có lẽ không phải là đoạn lớn nhất chính xác càng tốt, nhưng trong vòng hệ số 2.

+0

Ý tưởng đầu tiên của tôi là phân mảnh không gian địa chỉ ảo. tuy nhiên điều này không nên đóng một vai trò ở đây, vì không có địa chỉ ảo nào có liên quan - chúng chỉ được gán khi bạn ánh xạ một khung nhìn. Phân mảnh khác có thể là gì? – Suma

+0

Có thats một cách hợp lệ để làm điều đó, nhưng tôi tò mò hơn lý do tại sao thấy rằng nó sẽ được dành riêng trong tập tin hệ thống trang những gì đang gây ra các cuộc gọi để thất bại? là do sự phân mảnh bộ nhớ hệ thống. Kết luận duy nhất tôi có thể đến, là bảng để chứa 2gb của 4kb tập tin trang là quá lớn cho bộ nhớ hệ thống để xử lý vì vậy nó không thành công. – Chad

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