Я написал простое приложение для тестирования потребления памяти. В этом тестовом приложении я создал четыре процесса для непрерывного потребления памяти, эти процессы не освободят память, если процесс не завершится.Почему это приложение не потребляет столько памяти, сколько ожидалось
Я ожидал, что это тестовое приложение будет потреблять большую часть памяти ОЗУ и привести к замедлению или сбою другого приложения. Но результат не такой, как ожидалось. Ниже приведен код:
#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;
}
ТОП команда
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
Хотя процессор высок, но память процент остается 0.0. Как это возможно?
Свободная команда
free shared buffers cached Mem: 3083796 0 55996 428296
свободной памяти больше, чем 3G 4G из оперативной памяти.
Кто-нибудь знает, почему это тестовое приложение работает не так, как ожидалось?
Linux фактически не будет выделять страницы памяти, если вы * запись * им. Я не вижу, чтобы вы писались в своем буфере где угодно. –
@ 한국 매미 'new []' default-инициализирует все элементы. –
@CoryNelson Да, и инициализация по умолчанию 'unsigned char' является no-op: запись не требуется. –