이것이 점프 투 공작소

가상메모리에 대해 알아보자, 리눅스의 메모리 조회 명령어까지 본문

리눅스

가상메모리에 대해 알아보자, 리눅스의 메모리 조회 명령어까지

겅겅겅 2022. 12. 18. 19:43

가상메모리란?

프로세스가 바라보는 물리 메모리를 추상화 한 공간입니다. 페이징기법을 통해 관리됩니다.

실행하려는 프로그램의 일부만 실제 메모리에 적재하여 실제 물리 메모리 크기보다 큰 프로세스를 실행 할 수 있게 해줍니다.

 

MMU(Memory Management Unit)

MMU(Memory Management Unit)는 가상 메모리를 사용하기 위한 하드웨어 장치입니다.

가상주소(프로세스가 참조하는 주소)를 물리주소(실제 메모리 주소)로 변환해주는 역할을 수행합니다.

TLB(Translation Lookaside buffer)는 가상메모리가 사용하는 페이지테이블(paging table)의 캐시를 저장합니다. (perf로 확인 가능합니다.)

 

논리주소와 물리주소

출처 : https://truemind5.blogspot.com/2017/05/13.html

논리주소 Logical address

CPU에 의해 프로그램이 실행되고 있을 때 논리주소가 만들어집니다.

CPU는 프로세스들이 연속되어 메모리게 적재된다고 생각하고 동작합니다. 따라서 CPU가 메모리에 접근하기 위해 임의의 연속된 메모리를 할당해주어야 하는데 이 주소를 논리주소라고 합니다.

물리 주소 Physical address

MMU의 재배치 레지스터(Relocation register)를 통해 변환된 논리주소와 매핑된 실제 물리 메모리의 주소입니다. 

 

페이징(paging) 시스템과 페이징 테이블(paging table)

페이징 시스템에서 가상 메모리의 논리 주소 공간의 단위는 페이지(page), 물리 메모리의 물리 주소 공간은 프레임(frame) 단위로 관리됩니다.  

즉 페이징 시스템이란 메모리의 물리주소 공간을 프레임(frame)단위로 자른 뒤 페이지를 프레임에 할당하는 시스템을 말합니다. 페이징을 이용하게 되면 프로세스 단위가 아닌 페이지 단위로 메모리에서 swap out/ in 됩니다.

(주로 4kb 크기로 페이징되며, 아키텍쳐에 따라 조금씩 다릅니다, 페이지 크기와 프레임 크기는 동일합니다.)

 

페이징 시스템을 사용하게 되면 프로세스가 불연속적으로 물리 메모리에 올라갈 수 있기에 CPU가 물리 메모리에 할당된 프로세스를 순차적으로 실행 할 수 없는 상황이 생길 수 있습니다.

이를 해결하기 위해 페이지 테이블을 사용합니다.

 

페이지 테이블(paging table)

물리 메모리의 프레임(frame)번호와 프로세스의 페이지(page)번호를 엔트리로 가지고 있는 테이블입니다.

프로세스마다 테이블이 따로 할당됩니다. 

페이지 테이블을 사용함으로서 프로세스를 연속적으로 처리할 수 있게됩니다.

CPU는 PTBR(페이지 테이블 베이스 레지스터, 각 프로세스의 페이지 테이블이 적재된 주소를 가지고있는 레지스터)를

통하여 페이지 테이블에 접근합니다.

 

페이지 테이블 엔트리 (PTE)

페이지 테이블 엔트리에서 페이지 번호를 찾으면 페이지에 할당된 프레임의 시작 주소를 알 수 있습니다.

출처 : https://examradar.com/page-table-structure-page-table-questions-answers/

추가적인 PTE의 구성요소는 다음과 같습니다.

  • Frame Number : 프레임 번호
  • Present/Absent (유효비트) : 메인 메모리에 페이지가 존재하는지 확인하는 비트 필드, 0이면 page fault예외 발생
  • Protection : 읽기전용 0, 읽기 쓰기 1
  • Reference : 참조 비트 (최근 참조 됐는지 판단하여 페이지 교체 알고리즘을 적용 시킬 수 있음)
  • Caching : 해당 페이지를 캐싱할지 선택
  • modified bit : 오염 또는 수정 여부를 판단하는 비트로, 페이지 내용이 변경됐음을 알려 페이지 교체시 하드 디스크에 다시 기록하게 한다.

페이징에서의 주소 변환

p : 페이지 번호

d : 변위

f : 프레임 번호

논리주소<p, d> 는 페이지 테이블을 통해 물리주소<f, d>로 변환됩니다.

예를들어 논리주소<5(페이지번호), 2(변위)> , PTE<5(페이지), 1(프레임번호)> ,  8번 프레임(10번지 시작)

이 있다고 가정해봅시다.

 

1. CPU에서 실행중인 프로세스가 논리주소<5, 2>를 참조

2. 페이지 테이블의 페이지 번호 5번에 적재된 프레임 번호 8번으로 이동 

3. 8번 프레임의 시작 주소 확인(10번지) 변위 크기만큼(+2) 계산하여 12번지를 참조

 

요구 페이징

프로세스를 메모리에 적재할 때 모든 페이지를 적재하지 않고, 필요한 페이지만을 적재합니다.

이를 요구페이징이라고 합니다.

요구페이징 동작순서

1. CPU가 특정 페이지에 접근하는 명령어 실행

2. 해당 페이지가 현재 메모리에 있을 경우(유효 비트 1), CPU는 페이지가 적재된 프레임에 접근된다.

3. 해당 페이지가 현재 메모리에 없을 경우(유효 비트 0) 페이지폴트 접근

4. 페이지 폴트 처리 루틴은 해당 페이지를 메모리를 메모리로 적재하고 유효 비트를 1로 설정한다.

5. 다시 1번으로

pure demand paging과 pre paging

  • pure demand paging
    • 최초 프로세스를 실행 할 때 메모리에 아무런 페이지가 없는 상태에서 실행하게 되면, 페이지 폴트가 발생하게 되고 페이지 폴트 처리 루틴에 따라 해당 페이지를 메모리에 적재합니다. 당장 실행에 필요 없는 부분은 Backing store에 저장하게 됩니다.
  • pre paging
    • pure demand paging과 다르게 필요할거같은 페이지를 미리 메모리에 적재하고 사용하는 방식을 말합니다.

 

 

가상 메모리 조회(vmstat, PS,pmap)

vmstat

vmstat 조회

  • free : idle 메모리 양
  • buff : 버퍼 용도로 사용된 메모리 양 (쓰기)
  • cache : 캐시 용도로 사용된 메모리 양 (읽기)
  • active : active 메모리 양 (-a 옵션으로 확인 buff+cache 메모리 중 최근 사용된 메모리)
  • incat : inactive 메모리 양 (-a 옵션으로 확인 buff+cache 메모리 중 회수 가능한 메모리)
  • swpd : 사용중인 swap 공간 (0이면 비활성화)
  • si : 디스크에서 swap in된 메모리 양 (/s) (0이면 비활성화)
  • so : 디스크에 swap out된 메모리 양 (/s) (0이면 비활성화)

PS

ps u 사용자에 프로세스 정보를 확인합니다.

  • %CPU : CPU사용 비율의 추정치
  • %MEM : 메모리 사용비율의 추정치
  • VSZ : 페이지 단위의 가상메모리 사용량
  • RSS : 실제 메모리 사용량

top -o %MEM (메모리 내림차순 정렬 )

  • VIRT : 가상 메모리 크기
  • RES : 실제 메모리 크기

pmap

sudo pmap -x 프로세스ID

pmap 명령어를 통해 해당 프로세스의 메모리 주소 및 사용량을 확인 할 수 있습니다.

  • Kbytes : 가상메모리크기
  • RSS : 실제 할당 공간
  • Mapping : 할당 목적