11. 가상메모리 (Virtual Memory System)
개요
실제 각 프로세스마다 충분한 메모리를 할당하기에는 메모리 크기가 한계가 있음
예: 리눅스는 하나의 프로세스가 4GB임
통상메모리는 8GB, 16GB
폰노이만 구조 기반이므로 코드는 메모리에 반드시 있어야함.
메모리와 process간의 dependency가 큰편
RAM을 관리하는 방법의 하나로 실제 메모리주소가 아닌 가상 메모리 주소를 주는방식
가상메모리가 필요한 이유
여러 프로세스 동시 실행 시스템
메모리 용량 부족이슈
프로세스 메모리 영역간에 침범이슈
가상메모리: 메모리가 실제 메모리보다 많아보이게 하는 기술
실제 사용하는 메모리는 작다는 점에 착안하여 고안된 기술
프로세스간 공간 분리로, 프로세스 이슈가 전체 시스템에 영향을 주지 않음
기본아이디어
프로세스는 가상 주소를 사용하고, 실제 해당 주소에서 데이터를 읽고/쓸때만 물리주소로 바꿔주면 됨.
virtual address(가상주소): 프로세스가 참조하는주소
[0~4GB]
이 중에 일부만 물리주소에 올라간다.
physical address(물리주소): 실제 메모리 주소
MMU(Memory Management Unit)
CPU에 코드 실행시 가상 주소 메모리 접근이 필요할때 해당 주소를 물리 주소값으로 변환해주는 하드웨어 장치.
(CPU에서 코드 실행시 가상주소 먼저 접근)
가상메모리(Virtual Memory)와 MMU
CPU는 가상메모리를 다루고, 실제 해당주소 접근시 MMU하드웨어 장치를 통해서 물리메모리에 접근한다.
하드웨어 장치를 이용해야 주소변환이 빠르게 때문에 별도장치(MMU)를 둠.
[CPU]=> virtual address => [MMU] => physical address => [Memory]
프로세스 생성시, 페이지 테이블 정보 생성
PCB등에서 해당 페이지 테이블 접근 가능하고, 관련정보는 물리메모리에 적재
프로세스 구동시, 해당 페이지 테이블 base주소가 별도 레지스터에 저장(CR3)
CPU가 가상 주소 접근시, MMU가 페이지 테이블 base주소를 접근해서, 물리 주소를 가져옴.
가상메모리 메커니즘
페이징시스템
페이징(paging)개념
크기가 동일한 페이지로 가상주소공간과 이에 매칭하는 물리주소공간 관리
하드웨어 지원이 필요
Intel X 86 시스템(32bit)에서는 4KB, 2MB, 1GB 지원
리눅스에서는 4KB로 paging
페이지 번호를 기반으로 [가상주소:물리주소] 매핑정보를 기록하고 사용함.
예
프로세스(4GB)의 PCB에 Page Table 구조체를 가리키는 주소가 들어있음
Page Table에는 가상주소와 물리주소간 매핑정보가 있음.
페이징 시스템 구조
page 또는 page frame: 고정된 크기의 block(4KB)
paging system
가상주소 v = (p,d)
p: 가상메모리 페이지
d: p안에서 참조하는 위치(변위, offset)
페이지크기가 4KB인 예
가상주소의 0bit~ 11bit가 변위(d)를 나타내고
12bit이상이 페이지 번호가 될수있음.
참고: 프로세스가 4GB를 사용하는 이유: 32bit 시스템에서 2³²가 4GB
page table(페이지테이블)
물리주소에 있는 페이지 번호와 해당 페이지의 첫 물리주소 정보를 매핑한 표.
physical address에 들어가져있는지 여부를 확인하는 정보도 가지고있음.
paging system 동작
해당 프로세스에서 특정 가상 주소에 엑세스를 하려면
해당 프로세스의 page table에 해당 가상주소가 포함된 page번호가 있는지 확인
page 번호가 있으면 이 page가 매핑된 첫 물리주소를 알아내고(p')
p'+d가 실제 물리주소가 됨.
다중단계 페이징 시스템
32bit 시스템에서 4KB 페이지를 위한 페이징시스템은
하위 12bit 는 offset
상위 20bit 가 페이징 번호, 즉 2의 20승개의 페이지 정보필요
페이징 정보를 단계를 나누어 생성
필요없는 페이지는 생성하지 않으면 공간절약가능
필요한 페이지만 페이지 테이블 생성하여 사용
MMU와 TLB(컴퓨터 구조)
MMU가 물리주소를 확인하기 위해 메모리를 갔다와야함.
시간이 오래걸림
TLB(Translation Lookaside Buffer): 페이지 정보 캐쉬를 두고 caching
페이징 시스템과 공유메모리
프로세스간 동일한 물리주소를 가리킬수있음(공간절약, 메모리시간할당시간절약)
세그멘테이션
가상 메모리를 서로 크기가 다른 논리적 단위인 세그먼트(Segment)로 분할
페이징 기법에서는 가상 메모리를 같은 크기의 블록으로 분할
예: X86 리얼모드
CS(code Segment), DS(Data Segment), SS(Stack Segment), ES(Extra Segment)로 세그먼트를 나누어 메모리 접근
기존 80286 =>[보호모드 <= protection ring (user/kernel)] <-> 8086/80186CPU 소프트웨어
부팅시 모드가 리얼모드 => 보호모드로
세그먼트 가상주소
v = (s,d)
s: 세그먼트 번호
d: 블록 내 세그먼트 변위(offset)
세그멘테이션 기법
세그멘테이션은 크기가 다른 세그먼트 단위로 물리 메로리에 로딩
참고
내부단편화(페이지기법)
페이지 블록만큼 데이터가 딱 맞게 채워져 있지 않을 때, 공간낭비
외부단편화(세그멘테이션 기법)
물리메모리가 원하는 연속된 크기의 메모리를 제공해주지 못하는 경우
세그멘테이션/ 페이징 모두 하드웨어 지원필요
다양한 컴퓨터 시스템에 이식성을 중요시하는 리눅스는 페이징 기법을 기반으로 구현.
페이지 폴트, 세그멘테이션은 image가 많아서, evernote에 정리.
Last updated