Study · 운영체제 · 메모리 요청 · 메모리
달라고 한 것과 실제로 받은 것은 다르다
장면
1GB 를 달라고 해도 free 명령의 free 열은 그만큼 안 줄어든다. 그런데도 프로그램은 잘 돈다. 무엇을 받은 걸까?
$ free -h
total used free buff/cache
Mem: 7.7Gi 1.2Gi 4.8Gi 1.9Gi
$ cat /proc/self/status | grep -E "VmSize|VmRSS"
# VmSize 는 달라고 한 양, VmRSS 는 실제로 붙은 양이다. 이 둘이 벌어진다
아래 재생기의 ▶를 누르면 한 스텝씩 진행된다. 금색 테두리가 지금 이야기하는 곳이고, 캡션이 무슨 일이 일어났는지 말해 준다. 굵게 밑줄 친 말은 누르면 뜻이 나온다. 빨간 딱지는 그때 벌어지는 일의 이름이고, 캡션 바로 위 회색 글자는 지금 스텝이 속한 묶음의 이름이다.
카드 아래 회색 줄은 그 일이 실제로 적혀 있는 소스의 파일 이름 : 줄 번호와 함수 이름이다. 글 안에 (:669)처럼 줄 번호만 적힌 것은 바로 앞에 적은 파일의 그 줄이라는 뜻이다. 캡션 한가운데 박힌 긴 영어 이름과 괄호 속 파일 · 줄 번호도 같다 — 건너뛰고 한글만 읽어도 뜻이 통하게 써 두었다.
장면 · 달라고 한 것과 받은 것은 다르다
0 / 9
▶ 를 누르면 페이지 32장을 달라고 했을 때 커널이 무엇을 적고 무엇을 안 하는지 본다. VmSize 는 늘어나는데 붙은 물리(RSS)와 free 명령의 free 열은 그대로인 이유가 여기 있다.
키보드 · ← → 한 스텝 · Space 재생/멈춤 · Home 처음
달라고 한 것과 받은 것은 다르다. 커널은 주소 공간만 잡아 두고 물리 메모리는 아직 붙이지 않는다.
어떻게 확인했나
소스 어디를 보고 적었는지와 무엇을 돌려서 쟀는지를 남긴 자리다. 처음 읽을 때는 건너뛰어도 된다.
- mmap 은 vma 만 만들고 물리 페이지는 안 붙인다 — do_mmap(mm/mmap.c:338) → mmap_region(mm/vma.c:2940) → vm_area_alloc(mm/vma.c:2648). 붙이는 경우는 MAP_POPULATE 나 mlock 뿐이고(조건 mm/mmap.c:577), 그때만 mm_populate 를 부른다(mm/util.c:586).
- VmSize 는 mm->total_vm 을 그대로 찍은 값이고(fs/proc/task_mmu.c:67), VmRSS 는 anon · file · shmem 카운터의 합이다(fs/proc/task_mmu.c:56·71). mmap 경로가 올리는 것은 앞쪽뿐 — vm_stat_account(mm/mmap.c:1374).
- 요청량 검사는 느슨하다 — 기본 정책 OVERCOMMIT_GUESS(mm/util.c:781)는 요청이 RAM 과 스왑을 합친 총량보다 클 때만 거절한다(mm/util.c:973).
- 1GB 를 malloc 만 하고 멈추니 VmSize 가 2,684 kB 에서 1,051,264 kB 로 늘었는데 VmRSS 는 1,408 kB 그대로였다. malloc 은 C 에서 메모리를 달라고 하는 함수인데, 이만큼 큰 요청이면 안에서 장면이 따라간 그 mmap 을 부른다 — 그래서 장면의 mmap 이야기가 이 실측에 그대로 걸린다. 달라고 한 양과 실제로 받은 양이 다르다는 것이 이 두 줄에 그대로 보인다.
항목 지도목차 ›
- 계정과 권한
- 1 로그인 — 로그인하면 무슨 일이 일어나나
- 2 계정 만들기 — 계정을 만들면 어디에 무엇이 쓰이나
- 3 권한 주기 — chmod 가 바꾸는 것은 어디에 있나
- 4 권한 검사 — 파일을 열 때 권한을 언제 보나
- 파일과 디렉터리
- 5 파일 만들기 — 파일을 만들면 무엇이 생기나
- 6 디렉터리 — 디렉터리를 만들면 무엇이 생기나
- 7 파일 읽기 — 파일을 읽으면 어디를 거치나
- 8 파일 지우기 — 파일을 지우면 정말 사라지나
- 프로세스
- 9 명령 실행 — 명령 하나를 치면 무슨 일이 벌어지나
- 10 파일 디스크립터 — 프로세스가 파일을 열면 무엇이 늘어나나
- 11 CPU 나누기 — CPU 하나를 여럿이 어떻게 나눠 쓰나
- 메모리
- 12 메모리 요청 — 메모리를 달라고 하면 바로 주나
- 13 페이지 폴트 — 처음 건드릴 때 무슨 일이 일어나나
- 14 OOM — 메모리가 모자라면 누가 죽나
- 네트워크
- 15 소켓 만들기 — 소켓을 만들면 무엇을 받나
- 16 연결 받기 — 연결이 들어오면 누가 먼저 받나
- 17 주고받기 — 데이터가 오갈 때 무엇이 움직이나