Monthly Archives: 10월 2004 - Page 2

Solaris 5.8 malloc 후 free 시 bug ?!

Solaris 5.8에서 gcc 3.4.1로 아래 소스를 돌려서 프로세스상황을 살펴보면..


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(int argc, char **argv)
  4. {
  5.   char *a = NULL; char s;int j;

  6.   a = malloc(100000000); // (상태1) 100메가 메모리를 할당. 가상메모리만 할당됨
  7.   printf(“Memory Allocated. Press Enter to Continue\n”);gets(s);

  8.   for (j=0;j<100000000;j++) // (상태2) 강제로 데이터를 쓴다. 실제메모리 할당됨.
  9.     a[j]=‘1’;
  10.   printf(“Memory Writed. Press Enter to Continue\n”);gets(s);

  11.   free(a); // (상태3) 메모리할당을 해제한다.
  12.   printf(“Memory Freed. Press Enter to Exit\n”);gets(s);
  13. }

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