2010-03-30 42 views
11

Khi tôi hiểu nó, MEM_RESERVE thực sự là bộ nhớ 'miễn phí', tức là có sẵn để sử dụng bởi quy trình của tôi, nhưng vẫn chưa được phân bổ? Hoặc nó đã được phân bổ trước đó, nhưng từ đó đã được giải phóng?Sự khác nhau chính xác giữa các trạng thái MEM_RESERVE và MEM_COMMIT là gì?

Cụ thể, hãy xem trong đầu ra địa chỉ của tôi bên dưới cách tôi gần hết dung lượng địa chỉ ảo (99900 KB miễn phí, 2307872 thành MEM_PRIVATE. Nhưng các tiểu bang cho thấy rằng 44,75% trong số đó thực sự là MEM_RESERVE. miễn phí, trong quá trình của tôi ... nhưng có lẽ phân mảnh

0:000> !address -summary 
--------- PEB a8bd8000 not found ---- 

-------------------- Usage SUMMARY -------------------------- 
    TotSize (  KB) Pct(Tots) Pct(Busy) Usage 
    259af000 ( 616124) : 22.29% 23.12% : RegionUsageIsVAD 
    618f000 ( 99900) : 03.61% 00.00% : RegionUsageFree 
    13e22000 ( 325768) : 11.78% 12.22% : RegionUsageImage 
    42c04000 (1093648) : 39.56% 41.04% : RegionUsageStack 
    42d000 ( 4276) : 00.15% 00.16% : RegionUsageTeb 
    2625d000 ( 625012) : 22.61% 23.45% : RegionUsageHeap 
      0 (  0) : 00.00% 00.00% : RegionUsagePageHeap 
      0 (  0) : 00.00% 00.00% : RegionUsagePeb 
     1000 (  4) : 00.00% 00.00% : RegionUsageProcessParametrs 
     1000 (  4) : 00.00% 00.00% : RegionUsageEnvironmentBlock 
     Tot: a8bf0000 (2764736 KB) Busy: a2a61000 (2664836 KB) 

-------------------- Type SUMMARY -------------------------- 
    TotSize (  KB) Pct(Tots) Usage 
    618f000 ( 99900) : 03.61% : <free> 
    13e22000 ( 325768) : 11.78% : MEM_IMAGE 
    1e77000 ( 31196) : 01.13% : MEM_MAPPED 
    8cdc8000 (2307872) : 83.48% : MEM_PRIVATE 

-------------------- State SUMMARY -------------------------- 
    TotSize (  KB) Pct(Tots) Usage 
    57235000 (1427668) : 51.64% : MEM_COMMIT 
    618f000 ( 99900) : 03.61% : MEM_FREE 
    4b82c000 (1237168) : 44.75% : MEM_RESERVE 

Largest free region: Base 7e4a1000 - Size 000ff000 (1020 KB) 

theo dõi:

Vì vậy, trong điều kiện của ví dụ của tôi, quá trình này được báo cáo 'ra khỏi bộ nhớ', nhưng trên thực tế nó có thể làm cho việc phân bổ, nhưng ai đó MEM_RESERVED nhiều hơn mức cần thiết tại thời điểm đó, ngăn người khác thậm chí có thể phân bổ?

Trả lời

7

MEM_RESERVE được phân bổ theo quy trình. I E. không gian địa chỉ được xem xét sử dụng. Tuy nhiên, nó đã không được cam kết. Để thực sự sử dụng bộ nhớ để lưu trữ, nó phải được cam kết. Mark Russinovich có an excellent post, mô tả tất cả các chi tiết. Từ bài đăng

Chuyển đổi của Testlimit có bộ nhớ ảo nhưng không thực sự là cam kết. Ltd. bộ nhớ ảo không thể thực sự lưu trữ dữ liệu hoặc mã, nhưng ứng dụng đôi khi sử dụng một phòng để tạo ra một khối lượng lớn các bộ nhớ ảo và sau đó cam kết nó như cần thiết để đảm bảo rằng các cam kết bộ nhớ giáp vào địa chỉ không gian. Khi một quá trình cam kết một vùng của bộ nhớ ảo, hệ điều hành đảm bảo rằng nó có thể duy trì tất cả dữ liệu mà quá trình lưu trữ trong bộ nhớ hoặc trong bộ nhớ vật lý hoặc trên đĩa . Điều đó có nghĩa là quá trình có thể chạy lên với giới hạn khác: giới hạn cam kết .

+0

Vì vậy, trong ví dụ của tôi, quá trình này báo cáo 'hết bộ nhớ', nhưng thực sự nó có thể phân bổ, nhưng ai đó MEM_RESERVED nhiều hơn mức cần thiết tại thời điểm đó, ngăn người khác thậm chí có thể phân bổ? – pj4533

+0

MEM_RESERVED là một quá trình, do đó, quá trình dành riêng bộ nhớ đó không phải ai khác (như trong một quy trình khác). –

+0

Chắc chắn, nhưng vấn đề là quá trình này báo cáo rằng phân bổ không thành công, vì vậy vấn đề là ai đó (một số hệ thống con trong quá trình NÀY) MEM_RESERVED bộ nhớ nhiều hơn, và ngăn cản một số hệ thống con khác tạo phân bổ? – pj4533

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