linux2025. 12. 28. 16:53

/proc/meminfo의 값들을 계산할 때도 zoneinfo에서 사용되는 page 정보들을 이용해 계산되는가

 
 
 
 

네, 정확히 맞습니다!

/proc/meminfo의 값들은 /proc/zoneinfo의 페이지 정보들을 집계해서 계산됩니다.

/proc/meminfo의 주요 항목 계산

 
 
c
// linux/mm/page_alloc.c에서
si_meminfo() 함수가 zoneinfo를 읽어서 meminfo 계산

MemTotal = Σ(모든 zone의 managed)
MemFree = Σ(모든 zone의 free)
MemAvailable = MemFree + 회수 가능한 페이지들
MemUsed = MemTotal - MemFree
```

## 당신의 RPi4 데이터로 검증
```
/proc/zoneinfo에서:
Node 0, DMA:      managed = 220735,  free = 215866
Node 0, DMA32:    managed = 253815,  free = 133994
Node 1, DMA32:    managed = 497449,  free = 380141
                  ──────────────────  ──────────────
                  합계 = 971999       합계 = 730001

↓ 이를 /proc/meminfo로 변환 ↓

MemTotal = 971999 × 4 = 3,887,996 KB
MemFree = 730001 × 4 = 2,920,004 KB

/proc/meminfo의 다른 항목들도 zoneinfo 기반

 
 
bash
MemTotal       = Σ managed
MemFree        = Σ free
MemAvailable   = MemFree + (회수 가능한 파일 캐시)
Buffers        = 버퍼 캐시 (zoneinfo의 nr_file_pages 관련)
Cached         = 파일 캐시 (zoneinfo의 nr_active_file + nr_inactive_file)
Active         = Σ nr_active_anon + nr_active_file
Inactive       = Σ nr_inactive_anon + nr_inactive_file
AnonPages      = Σ nr_anon_pages
Slab           = Σ (nr_slab_reclaimable + nr_slab_unreclaimable)

커널 소스코드

 
 
c
// mm/page_alloc.c
void si_meminfo(struct sysinfo *val)
{
    unsigned long pages = 0;
    
    // 모든 zone 순회
    for_each_zone(zone) {
        pages += zone->managed_pages;      // MemTotal 계산
    }
    val->totalram = pages;
    
    // MemFree 계산
    val->freeram = global_node_page_state(NR_FREE_PAGES);
    
    // 기타 항목들...
}

실제 확인 방법

 
 
bash
# zoneinfo의 managed 합계
awk '/managed/{sum+=$2} END {print "MemTotal = " sum*4 " KB"}' /proc/zoneinfo

# zoneinfo의 free 합계
awk '/pages free/{sum+=$3} END {print "MemFree = " sum*4 " KB"}' /proc/zoneinfo

# /proc/meminfo 값과 비교
grep "MemTotal\|MemFree" /proc/meminfo
```

## 더 상세한 대응관계
```
/proc/meminfo 항목          zoneinfo 출처
─────────────────────────────────────────────
MemTotal                    Σ managed
MemFree                     Σ free
MemAvailable                MemFree + 회수 가능
Buffers                     (버퍼 캐시)
Cached                      Σ nr_file_pages
Active(anon)                Σ nr_active_anon
Inactive(anon)              Σ nr_inactive_anon
Active(file)                Σ nr_active_file
Inactive(file)              Σ nr_inactive_file
AnonPages                   Σ nr_anon_pages
Slab                        Σ nr_slab_reclaimable + 
                              nr_slab_unreclaimable
KernelStack                 Σ nr_kernel_stack
PageTables                  Σ nr_page_table_pages
```

## 계층 관계
```
/proc/zoneinfo (세부 정보)
        ↑
        │ (커널이 집계)
        ↓
/proc/meminfo (통합 정보)
        ↑
        │ (사용자가 조회)
        ↓
free, top 등의 도구

결론:

  • ✅ /proc/meminfo는 /proc/zoneinfo 정보를 실시간으로 집계해서 만들어짐
  • ✅ zoneinfo의 managed/free 합계 × 4K = meminfo의 MemTotal/MemFree
  • ✅ 둘 다 같은 커널 메모리 관리 데이터 구조에서 나옴

'linux' 카테고리의 다른 글

ftrace script  (0) 2025.12.28
/proc/zoneinfo 해석 방법  (0) 2025.12.28
zone, free_area, list_head[MIGRATE_TYPES] 관련  (0) 2025.12.28
raspberry pi 4 커널 빌드 및 교체 시 주의 사항  (0) 2025.12.26
gst와 omx IL의 관계  (0) 2022.11.03
Posted by easy16