top 또는 prstat 에서 SIZE, RES 필드가 정확한건가요?
솔라리스 5.8에서 프로그램을 하나 만들었습니다. 공유메모리를 200MB 정도 사용하고 있습니다.
근데 top을 실행해보면 그 공유메모리에 attach한 프로세스의 SIZE가 처음부터 200MB로 나옵니다.
이건 뭐 그렇다 칩니다. manual을 보니 size필드는 공유메모리공간도 포함이 되는거 같으니까요.
근데 RES항목은 처음에는 700K 였다가 계속 조금씩 조금씩 증가하더군요.
결국 며칠 지나면 top에서 SIZE도 200MB RES도 200MB로 출력이 되는군요. prstat도 마찬가지구요!
RES가 조금씩 증가하는 원인을 디버깅해서 찾아보니 지역변수에 공유메모리에 있는 데이터를 memcpy하는 부분을 호출하면 RES가 증가하더라구요. 이해가 안됩니다.
지역변수를 사용하는데, 무슨 동적메모리 할당하고 free를 안해줘서 계속 커지는것도 아닌데...
메모리는 2GB이고 이런 비슷한 프로세스 수십개가 수행이 되야 하는데, 다른 코드에는 메모리릭이 발생할 만한게 없습니다. 다 지역변수만 사용하니까요. 이거 어떻게 이해를 해야할까요? 에
선배님들, 해결방법좀 제시해 주십시요. 부탁합니다!
대충 의사코드입니다.
/* -------------------------------------- */
void fun()
{
struct {
int index;
time_t time;
char data[128];
} local_data;
/* sm_data는 main함수에서 공유메모리에 attach한 포인터 */
memcpy(&local_data, sm_data, sizeof(struct local_data));
}
/* -------------------------------------- */
댓글 달기