क्या यह संभव है, सी ++ में, वर्तमान रैम और सीपीयू उपयोग प्राप्त करने के लिए? क्या कोई प्लेटफॉर्म-इंडेंटेंट फ़ंक्शन कॉल है?सी ++ में वर्तमान सीपीयू और रैम उपयोग कैसे प्राप्त करें?
उत्तर
वहाँ एक खुला स्रोत पुस्तकालय है कि कई प्लेटफार्मों पर (और बहुत कुछ प्रणाली की जानकारी सामान) देता है: SIGAR API
मैं काफी बड़ी परियोजनाओं में इसका इस्तेमाल किया है और यह ठीक काम करता है (के लिए छोड़कर ओएस एक्स आदि पर कुछ कोने के मामले)
नहीं, मानक में नहीं है, नहीं।
यदि आपको वास्तव में इस जानकारी की आवश्यकता है, तो आपको प्लेटफ़ॉर्म-विशिष्ट #ifdefs या लाइब्रेरी के विरुद्ध लिंक लिखना होगा जो इसे प्रदान करता है।
अफसोस की बात यह है कि इन चीजों को अंतर्निहित ओएस पर भारी निर्भर करता है, इसलिए कोई मंच-स्वतंत्र कॉल नहीं है। (हो सकता है कि वहाँ कुछ आवरण चौखटे हैं, लेकिन मैं किसी भी पता नहीं है।)
लिनक्स पर आप, getrusage() समारोह कॉल पर एक नज़र हो सकता था विंडोज पर आप रैम प्रयोग के लिए GetProcessMemoryInfo() उपयोग कर सकते हैं। विंडोज़ के Process Status API में अन्य कार्यों को भी देखें।
इस बारे में मुझे पता है कि इसके लिए एक मंच स्वतंत्र कार्य नहीं है। यदि आप विंडोज के कई संस्करणों को लक्षित करने की योजना बनाते हैं, तो जागरूक रहें कि कार्यान्वयन कुछ संस्करणों में भिन्न है। उदाहरण के लिए एनटी 3.51 के तहत एक ऐप का परीक्षण करते समय मैंने इस समस्या को मारा ... (पुरातन, मुझे पता है)।
यहां कुछ कोड है जो मैंने चीजों की स्मृति पक्ष के लिए उपयोग किया है। यह विंडोज़ के अलावा प्लेटफार्मों में काम नहीं करता है, और WIN32 परिभाषित किए बिना संकलित किए जाने पर केवल 0 लौटाएगा:
संपादित करें: मैं उल्लेख करना भूल गया, यह कोड निकटतम एमबी में विभाजित और गोल करता है, इसलिए >> 20 सभी जगह।
// get memory info...
int getTotalRAM()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullTotalPhys>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwTotalPhys>>20);
}
#endif
return ret;
}
int getAvailRAM()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullAvailPhys>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwAvailPhys>>20);
}
#endif
return ret;
}
int getTotalMemory()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullTotalPhys>>20) + (int)(m.ullTotalVirtual>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwTotalPhys>>20) + (int)(m.dwTotalVirtual>>20);
}
#endif
return ret;
}
int getAvailMemory()
{
int ret = 0;
#ifdef WIN32
DWORD v = GetVersion();
DWORD major = (DWORD)(LOBYTE(LOWORD(v)));
DWORD minor = (DWORD)(HIBYTE(LOWORD(v)));
DWORD build;
if (v < 0x80000000) build = (DWORD)(HIWORD(v));
else build = 0;
// because compiler static links the function...
BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0;
HINSTANCE hIL = LoadLibrary(L"kernel32.dll");
GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx");
if(GMSEx)
{
MEMORYSTATUSEX m;
m.dwLength = sizeof(m);
if(GMSEx(&m))
{
ret = (int)(m.ullAvailPhys>>20) + (int)(m.ullAvailVirtual>>20);
}
}
else
{
MEMORYSTATUS m;
m.dwLength = sizeof(m);
GlobalMemoryStatus(&m);
ret = (int)(m.dwAvailPhys>>20) + (int)(m.dwAvailVirtual>>20);
}
#endif
return ret;
}
सीधे नहीं।
लेकिन आप एक पुस्तकालय का उपयोग कर सकते हैं जो ओएस (जैसे एसीई) को सारणीबद्ध करता है।
यदि आप केवल सीपीयू और मेमोरी चाहते हैं तो यह थोड़ा भारी हो सकता है।
ऐसा करने के लिए कोई मंच स्वतंत्र तरीका नहीं है। हालांकि विंडोज़ के लिए, आप अपने कोड में PDH.dll (प्रदर्शन डेटा सहायक) और इसके संबंधित एपीआई का उपयोग करके सीपीयू उपयोग और प्रदर्शन मीट्रिक प्राप्त कर सकते हैं।
लिनक्स पर, यह/proc/self/status का उपयोग करेगा। इसे एक संख्या में बदलने के लिए और अधिक काम की आवश्यकता है। मुझे यह उपयोगी लगता है, हालांकि, स्ट्रिंग के रूप में सीधे स्क्रीन पर मेमोरी उपयोग को मुद्रित करने के लिए।
static string memory_usage() {
ostringstream mem;
PP("hi");
ifstream proc("/proc/self/status");
string s;
while(getline(proc, s), !proc.fail()) {
if(s.substr(0, 6) == "VmSize") {
mem << s;
return mem.str();
}
}
return mem.str();
}
हैं जो अब भी इसलिए है की जाँच करें:
http://sourceforge.net/projects/cpp-cpu-monitor/
यह आप कैसे एक Linux (Debian और CentOS पर परीक्षण) के सीपीयू और RAM उपयोग पाने के लिए एक उदाहरण देता है और एक काफी कैसे स्थापित करें के सरल निर्देश।
कृपया यह पूछने के लिए स्वतंत्र रहें कि क्या आपके पास इस छोटी परियोजना के बारे में कोई प्रश्न है या नहीं।
यह दुखद क्यों है? सीपीयू/रैम/NUMA/(यहां एक या अधिक शब्दकोष डालें) की विविध विविधता प्लेटफॉर्म स्वतंत्र रिपोर्टिंग तंत्र को कुछ हद तक सीमित बनाती है। – MSN
गेट्रेजेज अधिकांश फ़ील्ड सेट नहीं करता है, अभी के लिए, राम लिंक आपके लिंक के अनुसार सेट नहीं है –