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) 시에 가상메모리까지도 해제가 되는데.. 훔.