← 모든 기록
Operating System · 2026.10.07

Week 6 Malloc Lab의 Place 함수 개선

Place 함수의 블록 배치 방향을 바꿔 91점에서 94점으로 개선한 과정과 임계값 최적화가 Util 향상으로 이어지지 않는 이유.

Week 6 Malloc Lab의 Place 함수 개선 대표 이미지

91점

Results for mm malloc:
trace  valid  util     ops      secs  Kops
 0       yes   99%    5694  0.000097 58883
 1       yes   99%    5848  0.000137 42593
 2       yes   99%    6648  0.000125 53014
 3       yes   99%    5380  0.000108 49907
 4       yes   66%   14400  0.000128112588
 5       yes   96%    4800  0.002112  2273
 6       yes   95%    4800  0.002148  2234
 7       yes   55%   12000  0.039567   303
 8       yes   51%   24000  0.044914   534
 9       yes   95%   14401  0.000110131276
10       yes   75%   14401  0.000072199184
Total          85%  112372  0.089518  1255
 
Perf index = 51 (util) + 40 (thru) = 91/100

94점

 1       yes   99%    5848  0.000132 44236
 2       yes   99%    6648  0.000152 43651
 3       yes   99%    5380  0.000113 47822
 4       yes   66%   14400  0.000128112941
 5       yes   95%    4800  0.002264  2120
 6       yes   95%    4800  0.002106  2279
 7       yes   95%   12000  0.005402  2222
 8       yes   88%   24000  0.005127  4681
 9       yes   99%   14401  0.000076189987
10       yes   62%   14401  0.000066217210
Total          91%  112372  0.015745  7137
 
Perf index = 54 (util) + 40 (thru) = 94/10

91 → 94점 개선 트러블 슈팅

  • 처리량 점수는 최대, Util을 올렸어야 함

점수가 낮았던 Trace

a 0 16
a 1 112
a 2 16
a 3 112
a 4 16
a 5 112
a 6 16
a 7 112
a 8 16
a 9 112
a 10 16
a 11 112
a 12 16
a 13 112
a 14 16
a 15 112
  • 이런 식의 작은 크기의 블록과 큰 크기의 블록이 반복되며 단편화를 유도하는 Trace

해결 방법은?

  • 작은 크기의 블록과 큰 크기의 블록 반복 시의 외부 단편화를 해결해야 함

기존 Place 함수

할당 후:  [S][L][S][L][S][L][S][L][  free  ]
L free:   [S][ ][S][ ][S][ ][S][ ][  free  ]
           → 구멍들이 S에 막혀서 합쳐지지 않음
           → 더 큰 요청이 오면 들어갈 곳이 없어 힙 확장(sbrk)

변경 Place 함수

할당 후:  [S][S][S][S][   free   ][L][L][L][L]
L free:   [S][S][S][S][      하나의 큰 free 블록      ]
           → 해제된 L들이 연속으로 붙어 있어 하나로 coalesce
           → 큰 요청도 기존 공간에서 처리 가능

변경 Place 함수 로직

size_t origin_size = GET_SIZE(HDRP(bp));
    remove_free_block(bp);
 
    // total_size += size;
    // total_n += 1;
    // threshold = (threshold * 0.5) + 0.5*((double)total_size / total_n);
    hist[size_bin(size)]++;
    if ((++n_alloc & 63) == 0)
        threshold = otsu_threshold();
 
    if ((origin_size - size) < MIN_BLOCK_SIZE)
    {
        PUT(HDRP(bp), PACK(origin_size, 1));
        PUT(FTRP(bp), PACK(origin_size, 1));
        return bp;
    }
    else if (size >= threshold)
    {
        PUT(HDRP(bp), PACK(origin_size - size, 0));
        PUT(FTRP(bp), PACK(origin_size - size, 0));
        insert_free_block(bp);
 
        bp = NEXT_BLKP(bp);
        PUT(HDRP(bp), PACK(size, 1));
        PUT(FTRP(bp), PACK(size, 1));
        return bp;
    }
    else
    {
        PUT(HDRP(bp), PACK(size, 1));
        PUT(FTRP(bp), PACK(size, 1));
 
        PUT(HDRP(NEXT_BLKP(bp)), PACK(origin_size - size, 0));
        PUT(FTRP(NEXT_BLKP(bp)), PACK(origin_size - size, 0));
        insert_free_block(NEXT_BLKP(bp));
        return bp;
    }

로직

Threshold (임계값) 기준

Threshold > size라면

  • 기존 place 함수와 동일하게 왼쪽에 블록 할당

Threshold ≤ size라면

  • 오른쪽에 블록 할당

free 시 공간이 쪼개져 있는 형태가 아닌 하나의 큰 가용 블록을 얻기 위함

임계값을 정하는 부분이 조금은 난잡 (3가지 방법)

// total_size += size;
    // total_n += 1;
    // threshold = (threshold * 0.5) + 0.5*((double)total_size / total_n);
    hist[size_bin(size)]++;
    if ((++n_alloc & 63) == 0)
        threshold = otsu_threshold();
  • 고정값 (100)
  • (threshold * 0.5) + 0.5*((double)total_size / total_n)기존에다가 입력되어 들어오는 size를 0.5로 업데이트
  • Otsu (오츠) 알고리즘 사용
    • 임계값을 따로 정하지 않음
    • 클래스 간의 분산 최대화

하지만

임계값을 구하는 로직을 개선하더라도 Util값이 증가하지는 않음

임계값 개선이 Util 향상으로 이어지지 않는 이유

임계값을 구하는 로직을 정교하게 다듬더라도 메모리 이용률(Util)은 크게 오르지 않음

Util을 높이려면 힙의 최대 크기를 늘리지 않고, 이미 해제된 가용 메모리를 최대한 재활용해야함

할당 요청이 들어오는 바로 그 시점에 요청을 감당할 만큼 충분히 큰 가용 블록이 존재해야함. 이를 위해서는 블록이 해제될 때 인접한 블록도 함께 비어 있어 병합이 일어나야 하고 병합된 결과가 이후 요청에 실제로 쓰일 수 있을 만큼의 크기를 가져야 한다.

즉 Util은 해제 순서와 블록의 물리적 배치, 그리고 그로 인한 단편화 정도에 의해 결정된다.

반면 임계값은 가용 블록들을 크기 분포에 따라 분산이 고르게 유지되도록 잘 나누는 역할을 함. 이는 블록을 어느 그룹에 둘지를 정하는 분류의 문제이지, 인접 블록이 함께 해제되어 큰 공간이 만들어지는지와는 직접적인 관련이 없다. 따라서 임계값이 최적화되는 방향과 Util이 개선되는 방향 사이에는 거리가 있다.

이를 달리 표현하면, 임계값이 "충분히 괜찮은" 수준으로 블록을 나누고 있다면 그 이상 정교한 임계값은 Util 개선에 기여하지 못할 수 있다. 분리 품질이 일정 수준을 넘어서면, 이후의 성능은 임계값이 아니라 배치 정책과 병합 효율에 의해 좌우되기 때문이다.

결론

Place 함수 개선을 통한 단편화 극복은 성공적이었으나 임계값을 통한 Util 향상은 방향성이 다르다

이어 읽으면 좋은 기록