2009-02-14 36 views
10

Tôi có một chương trình cần rất nhiều bộ nhớ và nó bị treo ngay khi không gian địa chỉ ảo 2GB được tiếp cận. Trình thám hiểm quy trình Sysinternals hiển thị cột này là "kích thước ảo". Làm cách nào để xác định "kích thước ảo" này với mã C (hoặc C++)?Cách xác định quy trình "kích thước ảo" (WinXP)?

Ok, tôi phải truy vấn bộ đếm hiệu suất cho "Byte ảo". Perfmon hiển thị chuỗi truy vấn (hoặc cách nó được gọi) như, ví dụ, '\ Process (firefox) \ Virtuelle Größe' trên cài đặt Win XP của Đức của tôi.

Làm cách nào để xác định chuỗi truy vấn cho 'quy trình hiện tại' và có tên không được bản địa hóa cho nó không?

Trả lời

8

Theo MSDN: Memory Performance InformationPROCESS_MEMORY_COUNTERS_EX.PrivateUsage giống với VM Kích thước trong Trình quản lý tác vụ trong Windows XP. GetProcessMemoryInfo sẽ hoạt động:

PROCESS_MEMORY_COUNTERS_EX pmcx = {}; 
pmcx.cb = sizeof(pmcx); 
GetProcessMemoryInfo(GetCurrentProcess(), 
    reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&pmcx), pmcx.cb); 

Bây giờ pmcx.PrivateUsage giữ kích thước VM của quy trình.

+0

Tôi đoán điều này sẽ là những gì ProcessExplorer hiển thị trong cột 'private byte', vì vậy nó không phải là những gì tôi đang tìm kiếm. – theller

+0

PROCESS_MEMORY_COUNTERS_EX.PrivateUsage giống với VM Size trong Task Manager theo http://msdn.microsoft.com/en-us/library/aa965225 (VS.85).aspx. – dalle

+7

Trong khi kích thước VM cũng không phải là những gì tôi đang tìm kiếm trang MSDN bạn đã đề cập có những gì tôi cần: MEMORYSTATUSEX.ullTotalVirtual – MEMORYSTATUSEX.ullAvailVirtual – theller

1

Bạn truy vấn bộ đếm hiệu suất.
Có API đầy đủ cho điều này trong API win32, read about it here.
Bạn có thể xem tất cả các quầy hiệu suất nếu bạn chạy chương trình có tên 'perfmon.exe'

+0

Bạn không có đoạn mã, vui lòng? – theller

1

Bạn có thể sử dụng bộ đếm hiệu suất. Đối tượng Process có giá trị "Byte ảo".

+1

IIUC, GetProcessMemoryInfo không cung cấp thông tin * này *. – theller

+0

bạn nói đúng. sửa chữa. –

0

Trong không gian địa chỉ WindowsXP 32 bit được chia thành hai phần 2GB: một phần cho chương trình và phần kia cho hạt nhân. Bạn có thể tăng phần ứng dụng lên 3GB bằng cách sử dụng /3GB switch in the boot.ini file.

+0

Tôi biết điều đó. Câu hỏi đặt ra là, tôi đã vượt quá giới hạn bao xa. – theller

0

Bạn không cần bộ đếm hiệu suất. Chỉ cần sử dụng NAPI (Câu hỏi thường gặp về Win32)

xem trên nhóm win32 news: //nntp.aioe.org/comp.os.ms-windows.programmer.win32 cho mã C.

1

Tôi cần điều tương tự như người bán hàng, nhưng tiếc là cần thiết cho một quy trình khác với quy trình của riêng tôi. Bởi vì điều này, tự trả lời bằng cách sử dụng "MEMORYSTATUSEX.ullTotalVirtual – MEMORYSTATUSEX.ullAvailVirtual" không hoạt động đối với tôi, vì GlobalMemoryStatusEx() (hàm trả về MEMORYSTATUXEX) chỉ hoạt động cho tiến trình hiện tại.

Cho đến nay, tôi đã không thể tìm thấy chính xác những gì tôi đang tìm kiếm mà không sử dụng bộ đếm hiệu suất (tôi đã không tham gia vào những điều đó vì chúng trông phức tạp hơn những gì tôi đang tìm kiếm). Tôi đã rất gần bằng cách lặp đi lặp lại xung quanh và sử dụng "VirtualQueryEx" để khám phá không gian địa chỉ của quá trình mong muốn, đếm lên tất cả các khu vực mà không có một nhà nước của MEM_FREE. Trong các bài kiểm tra của tôi, nó có vẻ là 17M liên tục cao hơn tôi mong đợi khi so sánh với Process Explorer. ... ngoài ra, nó chắc chắn không phải là điều kiện tự do.

Dù sao, tôi biết điều này là phân loại không trả lời, nhưng tôi nghĩ tôi ít nhất là tài liệu về tiến trình tôi đã thực hiện cho việc này cho bất kỳ ai tình cờ gặp điều này tiếp theo.

+0

Tôi đã cố gắng tìm ra điều tương tự. Ngoài việc thêm một tin nhắn ống hoặc cửa sổ tin nhắn cho quá trình khác mà tôi đang theo dõi, tôi là tươi ra khỏi ý tưởng. –

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