Solaris 5.8에서 gcc 3.4.1로 아래 소스를 돌려서 프로세스상황을 살펴보면..
- #include <stdio.h>
- #include <stdlib.h>
- int main(int argc, char **argv)
- {
- char *a = NULL; char s;int j;
- a = malloc(100000000); // (상태1) 100메가 메모리를 할당. 가상메모리만 할당됨
- printf(“Memory Allocated. Press Enter to Continue\n”);gets(s);
- for (j=0;j<100000000;j++) // (상태2) 강제로 데이터를 쓴다. 실제메모리 할당됨.
- a[j]=‘1’;
- printf(“Memory Writed. Press Enter to Continue\n”);gets(s);
- free(a); // (상태3) 메모리할당을 해제한다.
- printf(“Memory Freed. Press Enter to Exit\n”);gets(s);
- }
free(a) 부분에서 분명 실 메모리가 해제되어 , 반환되어야 하나 top 에서는 그대로 남아있는것 처럼 나온다.
메모리 Alloc한 상태 (상태1)
PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND
1093 guru 1 58 0 96M 648K sleep 0:00 .00% MemoryTest메모리 Write한 상태 (상태2)
PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND
1093 guru 1 58 0 96M 96M sleep 0:00 .00% MemoryTest메모리 Free한 상태 (상태3)
PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND
1093 guru 1 58 0 96M 96M sleep 0:00 .00% MemoryTest
물론 이소스를 리눅스나,윈도우에서 실행하면 모두 제대로 반환 처리 된다.
감시프로세스가 알람을 띄우기 때문에, 이를 원복하도록 하기위해 여기저기 검색을 해봤다.
Doug Lee 가 만든 dlmalloc 이란 소스를 찾아서 malloc 대신 dlmalloc을 쓰면, 제대로 해제가 된다.
메모리 dlmalloc후 Free한 상태 (상태3)
PID USERNAME LWP PRI NICE SIZE RES STATE TIME CPU COMMAND
1093 guru 1 58 0 96M 648K sleep 0:00 .00% MemoryTest
음.. 솔라리스 5.8의 문제인걸까.. 아니면 gcc 3.4.1 에 들어있는 malloc 의 문제인걸까.
가만, 리눅스에 gcc 도 역시 버전은 3.4.1 이다. 그럼 솔라리스에서 이상하게 처리하는건가.. 에구.. 몰것다.
하여튼 dlmalloc 으로 문제는 해결.
남은 문제는.. 이렇게 해도 free 시 가상메모리는 해제가 안된다는것.
리눅스에서는 분명 free(a) 시에 가상메모리까지도 해제가 되는데.. 훔.
음 그건 말이져.. 솔라리스 만의 메모리 관리방법 때문에 그렇습니다. 솔라리는 남은 메모리를 파일시스템 버퍼로 잡습니다. 그런다음 프로그램에서 필요로 하면 그 프리한 파일시스템 버퍼에서 안쓰는걸 그 프로세스를 위해 할당 합니다. 그런 다음 프로세서가 그 메모리를 다 쓰고 반환하면 시스템은 그걸 바로 프리리스트 쪽으로 넘기지 않고 일단 재사용의 가능성을 생각해서 프로세스를 위해 할당을 해놓습니다. 그래서 위와 같은 현상이 벌어집니다. 그래서 top 으로 보면 프리 메모리가 항상 얼마 안남아져 보입니다. 그럼 그 메모리의 반환 시점은 언제냐.. 시스템이 판단했을때 필요 업다라고 생각이 들때, 그리고 다른 프로세스가 메모리를 원할때 입니다. 좀 솔라리스의 메모리 메니지먼트 하는 부분이 특이해서 그렇습니다. 하지만 이 부분은 썬만의 자랑이라고도 할수 있습니다.
대충 그렇다고 파악은 하지만, 버추얼메모리가 아닌 실 사용메모리는 내가 free 하면 돌려줘야 하는게 아닐까 ? 기본적인 malloc 과 dlmalloc 의 차이는 이해가 잘 안됨.
IBM AIX 도 비슷한 방식으로 메모리 관리가 되는듯 하던데..
그래서 AIX 의 경우 평소에도 Free 메모리가 거이 1~2% 밖에 없는것으로 보이는거고… 메모리의 부족시점은 page fault 발생 빈도로 찾는다던데…
훔.. 그럼 메모리쪽 알람을 처리하는 프로세스는 어찌 도는거지 ? 메모리 부족시에 알람을 띄워줘야 하는 놈들이 분명히 있을텐데 말이지.
실제로 내가 일하는 모 싸이트에서도 그런 문제가 있어서 메모리 알람은 안하구 이따 ㅋㅋ -_-;
-_-;