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)
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.怎么可能?
自由命令
free shared buffers cached
Mem: 3083796 0 55996 428296
Run Code Online (Sandbox Code Playgroud)
4G内存中的可用内存超过3G.
有没有人知道为什么这个测试应用程序没有按预期工作?
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)
归档时间: |
|
查看次数: |
264 次 |
最近记录: |