시나브로

4. 메모리 관리 시스템 본문

Cloud/[스터디] 그림으로 배우는 리눅스 구조

4. 메모리 관리 시스템

sa1347 2025. 10. 26. 18:16

개요

지원하면서, 카페 커뮤니티를 통해 리눅스, 도커, 쿠버네티스 관련 스터디를 하게 되었다

교재를 토대로 챕터를 정하여 토론하는 방식으로 진행한다

 

프로세스 메모리와 가상 메모리 관련 내용인데, 역시나 몰랐던 부분을 많이 알게 되었다

2번 정도 읽어서 이해가 조금 되었으며, 적으면서 해야 기억에 남을거같아 글을 쓰게 되었다

 

 

내용

메모리 관련 정보 수집하기

이해를 위해 필자는 Python, Go 언어 프로그램으로 코드화 하였고, Shell 실행 스크립트를 기재함

 

리눅스는 시스템에 설치된 메모리 전체를 커널이 관리함

(커널의 메모리 관리 시스템(memory management subsystem) 기능을 사용해서 관리함)

메모리는 각 프로세스와 커널 자체도 사용함

 

free : 메모리 관련 정보 수집 명령어

total free buff/cache available used shared
전체 메모리 용량 명목상 비어있는 메모리 버퍼나 캐시 사용 가능한 메모리 사용 중인 메모리에
buff/cache 뺀 값
-

 

used

프로세스, 커널이 사용하는 메모리 다 포함 (교재는 프로세스 사용 메모리만 나와있음)

프로세스 메모리 사용량에 따라 늘어나고, 종료하면 커널이 해당 프로세스의 메모리를 모두 해제함

 

memuse.py 스크립트 내용

데이터를 작성해서 메모리 사용한 후, 사용하기 전의 전체 메모리 사용량과 사용 후의 남은 용량을 보여줌

이때, used의 구체적인 값은 중요하지 않음

 

buff/cache

페이지 캐시, 버퍼 캐시가 사용하는 메모리 용량 (8장에 페이지 캐시, 버퍼 캐시 참조)

접근 속도가 느린 저장 장치에 있는 파일 데이터를,

속도가 빠른 메모리에 일시적 저장해서 속도가 빠른 것처럼 보이게 하는 커널 기능임

저장 장치에 있는 파일 데이터를 읽어와서 메모리에 데이터를 캐시함 (임시로 쌓아둠)

 

buff-cache.sh 스크립트 내용

페이지 캐시 전후로 buff/cache 값의 변화를 확인함

free 실행하면서 시스템 전체 메모리 사용량을 표시 → 1Gib 파일을 작성하고, 삭제 후에(페이지 캐시 삭제) 전체 메모리 사용량 확인함

 

sar 명령어로 메모리 관련 정보 수집하기

예시) sar -r 1 5

sar 명령어 사용하면 두 번째 지정한 인수(초 단위)로 free 명령어보다 데이터를 자세하게 확인 및 수집할 수 있음

free

total free buff/cache available used shared
전체 메모리 용량 명목상 비어있는 메모리 버퍼나 캐시 사용 가능한 메모리 사용 중인 메모리에
buff/cache 뺀 값
-

 

sar -r

kbmemfree kbavail kbmemused %memused kbbuffers kbcached
kbcommit %commit kbavail kbinact kbdirty  

 

 

메모리 재활용 처리

시스템 부하가 높아지면 free 메모리가 줄어듬

커널의 메모리 관리 시스템 : 재활용 가능한 메모리 영역을 해제 → free 값을 늘림

 

프로세스 삭제와 메모리 강제 해제

재활용 가능한 메모리를 해제해도 부족현상이 해결되지 않으면

시스템은 Out Of Memory (OOM) 상태가 됨

 

OOM Killer 기능이 동작함

ㄴ 종료 가능한 적당한 프로세스를 강제 종료 시켜서 메모리에 빈 공간을 만듬

예고없이 어떤 프로세스가 종료되었다면 dmesg 명령어로 oom-kill 동작여부를 확인해볼것

 

 

가상 메모리

하드웨어와 소프트웨어(커널)를 연동해서 구현함

 

가상 메모리가 없을때 생기는 문제점

메모리 단편화 (fragmentation of memory)

전체 메모리는 300 byte인데, 각각 100 byte씩 3개의 영역으로 나눠짐 → 100보다 큰 영역 확보가 안됨

이런 경우 하나로 합칠 수 없고, 일일이 관리해야 하므로 불편함 생김

합쳐서 300 byte로 사용할수없음

 

멀티 프로세스 구현 어려움

프로세스를 A 영역에서 (300~400, 400~500) 사용 중일때, 동일한 실행 파일을 B 영역에 실행할 수 없음

ㄴ 이미 A에서 사용중이기 때문, B에서 실행시켜도 올바르게 동작하지 않음

ㄴ 동시에 여러 프로그램을 실행하려면, 배치 장소가 겹치지 않도록 관리해야함

 

비정상적인 메모리 접근

어떤 프로세스가 A에서 실행 중인데 B 주소를 지정하면,

사용하는 영역이 아님에도 접근 가능한 문제가 생김

ㄴ 데이터 누출 또는 손상의 위험성이 발생함

 

 

가상 메모리 기능

프로세스가 메모리에 접근할때 직접 접근하는 대신에 가상 주소를 사용해서 간접 접근하는 기능

 

메모리의 실제 주소를 물리주소 라고 함

이런 주소를 사용해서 접근 가능한 범위를 주소 공간 이라고 함

예) 프로세스가 주소 100에 접근하면, 실제 메모리에서는 주소 600에 존재하는 데이터에 접근함

 

readelf 명령어나 cat /proc/<pid>/maps 출력결과에 나오는 주소는 실제로는 가상 주소

실제 메모리에 직접 접근하거나, 물리 주소를 직접 지정하는 방법은 없음

 

 

페이지 테이블 (page table)

가상 주소를 물리 주소로 변환하기 위해 사용함

커널 메모리 내부에 저장되고, 커널이 작성함

CPU는 모든 메모리를 페이지 단위로 관리함 → 주소는 페이지 단위로 변환됨

 

페이지 테이블 엔트리 (page table entry) 

페이지 테이블에서 한 페이지에 대응하는 데이터

가상 주소와 물리 주소 대응 정보를 포함함

 

페이지 폴트 (page fault)

예) 페이지 테이블(주소 300~500에는 물리 메모리가 할당 안된 상태)

가상 주소가 300~500 byte 확보했지만 물리 메모리가 연결되어있지 않은 상태일때

프로세스가 접근하면 CPU에서 페이지 폴트가 발생함 → 예외 상황

ㄴ CPU에서 실행 중인 명령이 중단됨

ㄴ 커널 메모리에 배치된 페이지 폴트 핸들러 처리가 실행됨

ㄴ 커널은 핸들러를 이용해서 프로세스가 비정상적인 메모리 접근을 일으켰음을 감지함

ㄴ SIGSEGV 시그널을 프로세스에 송신함

ㄴ 프로세스 강제 종료됨

 

segv.go와 segv-c.c 언어 스크립트 내용

비정상 메모리 접근 전후를 보여줌

 

 

마무리

(내용 후 작성 예정)

 

 

 

'Cloud > [스터디] 그림으로 배우는 리눅스 구조' 카테고리의 다른 글

6. 장치 접근  (0) 2025.11.02