Background
- 프로세스: 프로그램이 실행중인 상태 (메인 메모리에 명령어가 적재되어 있는 상태)
- 메모리: 각자 자신의 주소를 가지고, 여러 바이트로 이루어져있는 배열
- cpu는 메모리에서 명령어를 하나 fetch한 후 실행
- 메모리 공간은 base/limit 레지스터로 각 프로세스의 공간을 구분한다
Address Binding
- Symbolic Address >> Relocatable Address (Compiler)
- Relocatable Address >> Absolute Address (Loader)
- Logical Address: CPU에 의해 결정되는 주소
- MMU (Memory Management Unit)
- Logical >> Physical (MMU가 해줌)
MMU
- Dynamic Loading
- 프로그램을 실행시킬 때 메인메모리에 프로그램과 관련 데이터를 모두 적재하는 것이 아니라 필요한 부분만 호출하는 것이 메모리를 효율적으로 사용하는 것
- Static Loading
- Dynamic Linking and Shared Libraries
- DLLs: Dynamically Linked Libraries
- system 라이브러리는 프로그램이 실행될 때 링크된다.
- Static Linking: 프로그램이 로드될 때 함께 링크
- Dynamic Linking: 프로그램이 실행될 때까지 기다렸다가 링크
- Shared Library: 여러 프로세스에 공유된다 (Window: .dll / Linux: .so)
Contiguous Memory Allocation (연속 메모리 할당)
- 프로그램 전체를 메모리에 할당하기 때문에 연속적이다.
- Memory Protection:
- base <= (접근 주소) < base + limit
- base 레지스터는 메모리상의 프로세스 시작주소를 물리 주소로 저장 (limit 레지스터는 사이즈를 저장)
- 해당 프로세스의 영역이 아닌 곳에 접근하려고 할 때 trap을 발생시킴
Dynamic Storage Allocation
- First-Fit: 만족하는 첫번째 free 영역
- Best-Fit: 만족하는 free 영역 중 가장 작은 영역
- Worst-Fit: 만족하는 free 영역 중 가장 큰 영역
First-Fit, Best-Fit 방법이 Worst-Fit 보다 효율적인 방법
Fragmentation
https://velog.io/@supssson/메모리-단편화
Paging
-
프로세스의 물리 주소를 연속적이지 않게 쪼개는 방법
-
외부 단편화를 피할 수 있음 (내부 단편화는 존재)
-
free hole을 압축시킬 필요가 없다.
-
OS와 하드웨어의 도움이 필요한 메모리 관리 기법
-
physical 메모리를 고정된 사이즈로 나눈 블록: frame (프레임)
-
logical 메모리를 고정된 사이즈로 나눈 블록: page (페이지)
-
이 둘을 맵핑 시킨다 (Logical Address와 Physical Address를 Binding 시킬 필요가 없음)
- Page = 4KB
- Page Table은 각 프로그램마다 별도로 존재, 수만개의 페이지가 존재하기 때문에 메모리에 저장 (Main Memory)
- 모든 메모리 접근 연산에 2번의 메모리 access가 필요함 (Page Table에 접근, Page Table로부터 얻은 주소로 실제 메모리에 접근)
- Page-table base register (PTBR)은 페이지 테이블 시작 주소를 가리킴
- Page-table length register (PTLR)은 테이블 크기를 보관
- 메모리에 항상 2번 접근하는 것은 매우 비효율적, 따라서 일종의 캐시인 TLB 사용
- TLB는 페이지 테이블 정보의 일부를 가지고 있음
ref: https://youtu.be/0BQwhwlz5qs