gpt4 book ai didi

c++ - 为什么这个应用程序没有像预期的那样消耗内存

转载 作者:IT王子 更新时间:2023-10-29 00:57:59 24 4
gpt4 key购买 nike

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

我预计此测试应用程序会消耗最多的 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;
}
  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

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

  2. 自由命令

                      free  shared    buffers     cached          
    Mem: 3083796 0 55996 428296

    4G RAM 中的空闲内存超过 3G。

有人知道为什么这个测试应用不能按预期工作吗?

最佳答案

Linux 使用乐观内存分配:它不会物理上分配内存页,直到该页被实际写入。因此,您可以分配比可用内存更多的内存,而不会增加系统的内存消耗。

如果你想强制系统分配(提交)一个物理页面,那么你必须写入给它。

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

buffer = new unsigned char [TEN_MEGA];

如果你想强制提交,使用零初始化:

buffer = new unsigned char [TEN_MEGA]();

关于c++ - 为什么这个应用程序没有像预期的那样消耗内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18909115/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com