查看剩余内存size

来源:互联网 发布:大文件传输软件 编辑:程序博客网 时间:2024/05/17 08:54

linux版

从/proc/meminfo中读取内存信息

linux版实验

实验环境 : debian7.5

// @file business_server.cpp#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h> #include <sys/sysctl.h>#include "business_server.h"// linux版 : 查看剩余内存的测试代码unsigned long long getTotalSystemMemory();void server_proc(){    do {        getTotalSystemMemory();        sleep(1);    } while (1);}unsigned long long getTotalSystemMemory(){    // http://man.openbsd.org/sysctl.3    // https://www.unix.com/man-page/debian/3/sysctl/    // CTL_HW 在debian下没CTL_HW这个MIB的索引, 在unix下才有    // 看了procps的实现,是从/proc/meminfo文件中读的内存总量和内存余量    char sz_buf[1024] = {'\0'};    char* p_sub_str = NULL;    FILE* p_file = NULL;    bool b_mem_total_kb = false;    long l_mem_total_kb = 0;    bool b_mem_free_kb = false;    long l_mem_free_kb = 0;    p_file = fopen("/proc/meminfo", "rb");    if (NULL != p_file) {        do {            if (b_mem_total_kb && b_mem_free_kb) {                break; // all find :)                               }            if (NULL == fgets(sz_buf, sizeof(sz_buf), p_file)) {                break; // file read over            }            // MemTotal:         494592 kB            if (!b_mem_total_kb) {                p_sub_str = strstr(sz_buf, "MemTotal:");                if (NULL != p_sub_str) {                    b_mem_total_kb = true;                    p_sub_str += strlen("MemTotal:");                    l_mem_total_kb = strtoul(p_sub_str, NULL, 10);                }            }            // MemFree:           23756 kB            if (!b_mem_free_kb) {                p_sub_str = strstr(sz_buf, "MemFree:");                if (NULL != p_sub_str) {                    b_mem_free_kb = true;                    p_sub_str += strlen("MemFree:");                    l_mem_free_kb = strtoul(p_sub_str, NULL, 10);                }            }        } while (1);        fclose(p_file);        p_file = NULL;    }    if (b_mem_total_kb && b_mem_free_kb) {        printf("%ldKB/%ldKB\n", l_mem_free_kb, l_mem_total_kb);    } else {        printf("can't get memory info :(");    }    return 0;}

win版

GlobalMemoryStatusEx

win版实验

// 查看剩余内存的测试代码unsigned long long getTotalSystemMemory();int main(int argc, char** argv){    NS_SOCKET_EASY::thread_env_socket_init();    do {        getTotalSystemMemory();        Sleep(1000);    } while (1);    printf("%s\n", LINE80);    printf("THE END\n");    printf("%s\n", LINE80);    NS_SOCKET_EASY::thread_env_socket_uninit();    return 0;}unsigned long long getTotalSystemMemory(){    MEMORYSTATUSEX status;    status.dwLength = sizeof(status);    LONGLONG llMemAll = 0;    LONGLONG llMemFree = 0;    LONGLONG llMemMbAll = 0;    LONGLONG llMemMbFree = 0;    GlobalMemoryStatusEx(&status);    llMemAll = (LONGLONG)status.ullTotalPhys;    llMemMbAll = (LONGLONG)(llMemAll * 1.0f / 1024 / 1024);    llMemFree = (LONGLONG)status.ullAvailPhys;    llMemMbFree = (LONGLONG)(llMemFree * 1.0f / 1024 / 1024);    // 可用物理内存/物理内存总size    printf("%lldMB/%lldMB\r", llMemMbFree, llMemMbAll);    return status.ullTotalPhys;}
// test_request_memory.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>#include <stdlib.h>#include <stdio.h>#include <list>// 测试代码 : 分配小内存,统一释放int _tmain(int argc, _TCHAR* argv[]){    LONGLONG llsize_request = 0;    size_t st_memory = (size_t)1024 * 1024; // 1MB    std::list<char*> my_mem_list;    std::list<char*>::iterator it;    char* p_tmp = NULL;    // 分配比较大的内存要用malloc, 如果用new, 分配不出来时, 会报错.    // 不能一次分配超过2gb的内存,即使有12gb空闲内存    // 由于内存碎片的原因,申请1GB, 也只能成功一次    // 如果一次申请512MB, 也只能申请成功2次, 难道没有那么大块的内存了么?    // 如果一次申请256MB, 可以申请成功5次    // 如果一次申请16MB, 可以申请成功1800MB    // 如果一次申请4MB, 可以申请成功1900MB    // 如果一次申请1MB, 可以申请成功1944MB    // 如果一次申请32KB, 可以申请成功1988MB, 但是也不会超过2GB    // 是不是winx86程序最多可以申请的总内存size,就是以2GB为边界呢?    // 实验过了,如果是winx64程序,申请的总内存可以超过2GB, 但是很奇怪,居然申请的总内存大小超过了物理内存大小...    // 是不是内存交换到硬盘上了? 每当内存快没有时,可用物理内存就跳到几百MB :)    // 实验结论 : 一次最好只申请适当的内存, 每次申请不要太多.    //      这样可以在系统中挤出最大可能的可用内存块(e.g. 统一申请小内存,压入队列,程序退出时,统一释放list)    do {        p_tmp = (char*)malloc(st_memory);        if (NULL == p_tmp) {            break;        }        my_mem_list.push_back(p_tmp);        llsize_request += (LONGLONG)st_memory;        printf("was requested %lldMB\r", (LONGLONG)(llsize_request * 1.0f / 1024 / 1024));        Sleep(1);    } while (1);    printf("\n");    printf("free memory\r\n");    for (it = my_mem_list.begin(); it != my_mem_list.end(); it++) {        p_tmp = *it;        if (NULL != p_tmp) {            free(p_tmp);            p_tmp = NULL;        }    }    my_mem_list.clear();    system("pause");    return 0;}
原创粉丝点击