كيفية الحصول على الاستخدام الحالي لوحدة المعالجة المركزية وذاكرة الوصول العشوائي في C++؟

StackOverflow https://stackoverflow.com/questions/479722

  •  20-08-2019
  •  | 
  •  

سؤال

هل من الممكن، في لغة C++، الحصول على الاستخدام الحالي لذاكرة الوصول العشوائي (RAM) ووحدة المعالجة المركزية (CPU)؟هل هناك استدعاء دالة مستقلة عن النظام الأساسي؟

هل كانت مفيدة؟

المحلول

وهناك مكتبة مفتوحة المصدر التي تعطي هذه (والمزيد من المعلومات نظام الاشياء) عبر العديد من المنابر: SIGAR API

ولقد استعملت في المشاريع الكبيرة نسبيا وأنه يعمل بشكل جيد (باستثناء بعض الحالات الزاوية على OS X الخ.)

نصائح أخرى

للأسف، تعتمد هذه الأشياء بشكل كبير على نظام التشغيل الأساسي، لذلك لا توجد مكالمات مستقلة عن النظام الأساسي.(ربما توجد بعض الأطر المجمعة، لكني لا أعرف أيًا منها.)

في نظام التشغيل Linux، يمكنك إلقاء نظرة على getrusage() استدعاء وظيفة، على نظام التشغيل Windows يمكنك استخدامها GetProcessMemoryInfo () لاستخدام ذاكرة الوصول العشوائي.قم أيضًا بإلقاء نظرة على الوظائف الأخرى في واجهة برمجة تطبيقات حالة العملية من ويندوز.

وليس هناك وظيفة منصة مستقلة لهذا أن أعرف. إذا كنت تخطط لاستهداف إصدارات متعددة من Windows أن تدرك أن تنفيذ يختلف في بعض الإصدارات. أنا ضربت هذه المشكلة عند اختبار التطبيق تحت NT 3.51 على سبيل المثال ... (القديمة، وأنا أعلم).

وهنا بعض التعليمات البرمجية I المستخدمة في الجانب ذاكرة الأشياء. هذا لا يعمل عبر المنصات الأخرى من النوافذ، وسوف يعود فقط 0 عندما جمعت دون WIN32 تعريف:

وتحرير: نسيت أن أذكر، هذا الرمز الانقسامات وقذائف أسفل إلى أقرب MB، ومن هنا >> 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;
}

لا، لا يوجد، وليس في هذا المعيار.

إذا كنت تحتاج حقا هذه المعلومات، سيكون لديك لكتابة #ifdefs الخاصة بالنظام الأساسي أو رابط ضد مكتبة التي توفرها.

في لينكس، وهذا سوف تستخدم / إجراءات / الذات / الوضع. مطلوب مزيد من العمل لتحويل هذا إلى رقم. أجد هذا مفيد لأنه على الرغم من مجرد لطباعة استخدام الذاكرة مباشرة إلى الشاشة كسلسلة.

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();
}

وليس هناك منصة وسيلة مستقلة للقيام بذلك. وعلى الرغم من ويندوز، يمكنك الحصول على استخدام وحدة المعالجة المركزية ومقاييس الأداء باستخدام PDH.dll (الأداء مساعد بيانات) واجهات برمجة التطبيقات المتعلقة بها في التعليمات البرمجية.

هنا أكثر على كيفية استخدامها.

وليس مباشرة.

ولكن يمكنك استخدام المكتبة التي تجرد نظام التشغيل (مثل ACE).
وعلى الرغم من هذه القوة من قبل ثقيلة بعض الشيء إذا كنت ترغب فقط في وحدة المعالجة المركزية والذاكرة.

وإذا كان هذا لا يزال قضية يرجى مراجعة:

http://sourceforge.net/projects/cpp-cpu-monitor/

فهو يوفر لك المثال كيفية الحصول على وحدة المعالجة المركزية وذاكرة الوصول العشوائي استخدام لينكس (اختبار على ديبيان و CentOS) وتعليمة بسيط جدا لكيفية تثبيت.

لا تتردد إلى التساؤل عما إذا كان لديك أي أسئلة بخصوص هذا مشروع صغير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top