为什么这个应用程序不会消耗尽可能多的内存

Ste*_*eve 3 c++ linux memory performance process

我写了一个简单的应用程序来测试内存消耗.在这个测试应用程序中,我创建了四个持续消耗内存的进程,除非进程退出,否则这些进程不会释放内存.

我希望这个测试应用程序消耗大部分RAM内存并导致其他应用程序减速或崩溃.但结果与预期不一样.以下是代码:

 #include <stdio.h>
 #include <unistd.h>
 #include <list>
 #include <vector>

 using namespace std;
 unsigned short calcrc(unsigned char *ptr, int count)
 {
     unsigned short crc;
     unsigned char i;

     //high cpu-consumption code 
     //implements the CRC algorithm
     //CRC is Cyclic Redundancy Code
 }


 void* ForkChild(void* param){
    vector<unsigned char*>  MemoryVector;
    pid_t PID = fork();
    if (PID > 0){
        const int TEN_MEGA = 10 * 10 * 1024 * 1024;
        unsigned char* buffer = NULL;
        while(1){
            buffer  = NULL;
            buffer = new unsigned char [TEN_MEGA];
            if (buffer){
                 try{
                    calcrc(buffer, TEN_MEGA);
                    MemoryVector.push_back(buffer);
                 } catch(...){
                    printf("An error was throwed, but caught by our app!\n");
                    delete [] buffer;
                    buffer = NULL;
                 }
            }
            else{
                 printf("no memory to allocate!\n");
                 try{
                     if (MemoryVector.size()){
                        buffer = MemoryVector[0];
                        calcrc(buffer, TEN_MEGA);
                        buffer = NULL;
                     } else {
                        printf("no memory ever allocated for this Process!\n");
                        continue;
                     }
                 } catch(...){
                    printf("An error was throwed -- branch 2," 
                           "but caught by our app!\n");
                    buffer = NULL;
                 }
             }
         }  //while(1)
    } else if (PID == 0){
    } else {
      perror("fork error");
    }   

    return NULL;
}


int main(){
int children = 4;
    while(--children >= 0){
    ForkChild(NULL);
    };

    while(1) sleep(1);
    printf("exiting main process\n");
    return 0;
 }
Run Code Online (Sandbox Code Playgroud)
  1. TOP命令

    PID  USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND           
    2775 steve     20   0 1503m  508  312 R  99.5  0.0   1:00.46 test              
    2777 steve     20   0 1503m  508  312 R  96.9  0.0   1:00.54 test              
    2774 steve     20   0 1503m  904  708 R  96.6  0.0   0:59.92 test              
    2776 steve     20   0 1503m  508  312 R  96.2  0.0   1:00.57 test
    
    Run Code Online (Sandbox Code Playgroud)

    虽然CPU很高,但内存百分比仍为0.0.怎么可能?

  2. 自由命令

                      free  shared    buffers     cached          
    Mem:           3083796       0      55996     428296
    
    Run Code Online (Sandbox Code Playgroud)

    4G内存中的可用内存超过3G.

有没有人知道为什么这个测试应用程序没有按预期工作?

use*_*016 6

Linux使用乐观内存分配:在实际写入该页面之前,它不会物理分配内存页面.因此,您可以分配比可用内存更多的内存,而不会增加系统的内存消耗.

如果要强制系统分配(提交)物理页面,则必须写入该页面.

以下行不会发出任何写操作,因为它是默认初始化unsigned char,这是一个无操作:

buffer = new unsigned char [TEN_MEGA];
Run Code Online (Sandbox Code Playgroud)

如果要强制提交,请使用零初始化:

buffer = new unsigned char [TEN_MEGA]();
Run Code Online (Sandbox Code Playgroud)

  • -1使用`new` ?? 问题没有要求最佳实践,它询问了内存使用情况.答案简明扼要地解释了 - 介绍任何其他东西只能卷入它. (5认同)