Notice
Recent Posts
Recent Comments
Link
어떻게 하면 잘 정리했다고 소문이 날까...
[OS 7편] Memory Management 본문
총 6개의 하위 내용으로 구성됩니다.
1. 주소 바인딩
2. MMU (Memory Management Unit)
3. 메모리 관련 용어
4. 물리적 메모리 할당 방식
5. 페이징 기법 (Paging)
6. 세그멘테이션 (Segmentation)
✔️ 주소 바인딩
- 바이트 단위 주소 부여.
- Logical 주소 VS Physical 주소
- Logical 주소
- 프로세스마다 독립적으로 가지는 주소 공간.
- 각 프로세스가 0부터 시작.
- CPU가 보는 주소는 Logical 주소.
- Physical 주소
- 실제 메모리에 올라가는 위치.
- Logical 주소
- 주소 바인딩
- 프로세스의 논리적 주소를 물리 메모리의 물리적 주소에 연결시키는 방법.
- Symbolic Address -> Logical Address -> Physical Address
- 주소 바인딩의 종류
- 컴파일 타임 바인딩
- 물리적 메모리 주소가 컴파일 시 결정.
- 시작 위치 변경 시 재 컴파일.
- 절대 코드 생성. (컴파일 했을 때 주소 = 실행 주소)
- 로드 타임 바인딩
- 프로세스가 시작할 때 물리적 메모리 주소 결정.
- Loader가 책임 하에 물리적 메모리 결정(고정).
- 컴파일러가 재배치 가능한 코드를 생성한 경우 사용가능한 방식.
- 런 타임 바인딩
- 프로그램 시작 후에도 프로세스 상 메모리의 위치 변경 가능.
- CPU는 주소 참조할 때마다 address mapping table로 바인딩 점검.
- 하드웨어 적인 지원이 필요함. (MMU, 기준 레지스터, 한계 레지스터)
- 컴파일 타임 바인딩
✔️ Memory Management Unit
- Logical 주소를 Physical 주소로 매핑해주는 HW 장치.
- 사용자 프로세스가 CPU에서 실행되며 모든 주소 값에 Base Register 값을 더한다. (=주소 바인딩)
- 연속 적재를 가정.
- CPU나 사용자는 물리 주소를 몰라도 됨.
- Context Switching 시 Base Register 값이 변경됨.
- Limit Register : 프로세스가 프로세스 자신의 크기를 넘어서는 주소 공간 참조하려고 하는 지 확인. (프로세스의 크기)
- HW support for address translation
- Limit Register와 비교 시 그 값을 넘어서면 소프트웨어 인터럽트인 트랩을 발생시킨다.
✔️ 메모리 관련 용어
- Dynamic Loading
- 프로그램 전체를 메모리에 미리 올려두는 것이 아닌 해당 루틴이 호출될 때 메모리에 로드하는 것.
- memory utitlization이 향상.
- 가끔식 사용되는 많은 양의 코드의 경우 유용.
- OS의 지원 없이 프로그램 자체 구현 가능. (OS가 라이브러리를 통해 지원 가능)
- Overlays
- 메모리에 프로세스의 부분 중 실제 필요한 정보만 올림.
- 프로세스의 크기가 메모리의 크기보다 큰 경우 사용.
- 사용자에 의해 구현됨.
- Dynamic Loading VS Overlays
- Dynamic Loading for multiple process (더 많은 프로세스를 올려두고 사용)
- Overlays for single process (메모리 보다 큰 프로세스를 올려두고 사용하기 위함)
- Dynamic Linking
- Linking 작업을 실행 시간까지 미루는 것.
- Static Linking
- 라이브러리가 프로그램 실행 파일 코드에 포함됨.
- 실행 파일의 크기가 커짐.
- 메모리 낭비.
- 라이브러리가 실행 시 연경됨.
- 라이브러리 호출 부분에 라이브러리 루틴을 찾기 위한 stub이라는 작은 코드를 둠.
- OS의 도움이 필요.
- Swapping
- 전체 프로세스를 일시적으로 메모리 바깥 Storage(=Swapping Area) 로 내쫓는 것.
- Swap in / Swap out
- 일반적으로 중기 스케줄러(Swapper)에 의해 swap-out 시킬 프로세스 선정.
- 컴파일 타임, 로드 타임 바인딩은 원래 메모리 위치로 swap-in, 런 타임 바인딩은 빈 공간으로 swap-in.
- swap time은 transfer time과 동일.
✔️ 물리적 메모리 할당 방식
- OS 상주 영역: 인터럽트 벡터 위치, 낮은 주소 영역
- 사용자 프로세스 영역: 높은 주소 영역
- 사용자 프로세스 영역의 할당 방법
- 분할 방식
- 연속 분할: 각각 프로세스가 메모리의 연속된 공간에 적재
- 고정 분할 방식
- 물리적 메모리를 영구적 분할로 나눔.
- 물리적 메모리에 load 되는 프로세스의 수를 고정.
- 외부, 내부 조각 발생.
- 가변 분할 방식
- 분할을 미리 하지 않고, 분할의 크기 및 개수가 동적으로 변함.
- 프로그램 크기 고려해서 할당.
- 기술적 관리 기법 필요.
- 외부 조각 발생 가능.
- Hole
- 가용 메모리 공간
- 다양한 크기의 hole이 여기저기 존재.
- 프로세스 도착 시 가능한 hole 할당.
- OS는 다음 정보 유지 1) 이미 할당된 공간 2) Hole
- 어떤 hole을 할당해야 하는가? -> Dynamic Storage Allocation Problem
- First-Fit: 사이즈가 n이상인 것 중 최초로 찾아지는 hole에 할당.
- Best-Fit: 사이즈가 n이상인 것 중 가장 작은 Hole 할당
- 탐색 + 가장 작은 hole 생성
- Worst-Fit: 가장 큰 Hole에 할당.
- 안쓰는 Hole을 한군데로 모아보자 -> Compaction
- 외부조각 해결 방법.
- 사용 중인 메모리 영역을 한 군데로 모으고 Hole을 한 군데로 모아 block 만들기.
- 비용이 많이 들고, 바인딩 점검이 필요.
- Run-time binding이 지원되어야 함.
- 고정 분할 방식
- 불연속 분할: 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라감.
- 페이징 기법
- 하나의 프로세스 공간을 같은 크기 페이지로 나누기.
- 물리적 공간 또한 같은 페이지 크기로 자르기(=frame)
- MMU가 복잡해짐.
- 세그멘테이션
- 같은 크기가 아닌 Code, Data, Stack 등의 세그먼트로 나누어 적재.
- 의미 단위로 나누기.
- 페이징 기법
- 연속 분할: 각각 프로세스가 메모리의 연속된 공간에 적재
- 분할 방식
✔️ 페이징 기법
- 프로세스의 가상 메모리를 동일한 사이즈의 페이지로 나눔.
- 일부는 backing storage에 일부는 RAM에 저장.
- 보통 페이지의 크기는 4KB이다.
- 물리 메모리도 같은 크기의 프레임으로 나눔.
- 모든 프로세스가 각각 주소 변환을 위한 페이지 테이블을 가짐.
- 페이지 테이블을 이용해 logical address를 physical address 접근하는 것에 사용.
- page table은 메인 메모리에 위치.
- 외부 조각은 없고, 내부 조각은 발생 가능.
- Page Table
- 페이지 테이블은 메인 메모리에 상주.
- 페이지 테이블 base register는 page table의 위치, length register는 페이지 테이블의 크기 -> OS가 사용하는 table 접근용 레지스터.
- 속도 향상을 위해 TLB(Table Look Aside Buffer)라 불리는 캐시 사용.
- 고속의 주소변환용 캐시.
- TLB(Table Look-aside Buffer)
- page table의 일부를 가짐.
- 논리적 주소 p와 연결된 f 프레임 번호를 가지고 있어야 함.
- TLB는 TLB 항목 전체를 검색 해야 함.
- Associative Register와 병형 탐색이 가능.
- TLB는 context-switch 시에 flush 된다.
- 2단계 페이지 테이블
- 현대의 컴퓨터는 주소 공간이 매우 큰 프로그램 지원.
- 32비트의 주소 이용 시 2의 32승 바이트 주소 공간을 가지는 프로그램 지원 가능.
- 페이지가 4KB라면 1M의 페이지 테이블 항목이 필요.
- 각 페이지 테이블 항목이 4바이트 라면 4MB의 메모리 공간 필요.
- page table을 페이지로 구성해보자는 아이디어에서 출발.
- 사용하지 않는 주소 공간에 대한 outer page table의 엔트리는 NULL 값으로 세팅.
- 2단계 테이블은 공간, 시간적인 측면에서는 손해지만, 2단계를 사용해야 NULL 처리를 할 수 있다.
- Mutilevel paging and performance
- 주소 공간이 크면, 다단계 페이지 테이블이 필요.
- 여러 단계의 메모리 접근이 필요한데, TLB 로 접근 시간을 줄일 수 있다.
- page table에는 frame 번호와 invalid, valid 여부가 같이 있다.
- Memory Protection
- Protection Bit (보호 비트)
- 페이지 접근 권한(read, write, read-only)
- 유효, 무효 비트(valid, invalid bit)
- valid의 경우, 해당 주소의 frame에 페이지가 존재하며 프로세스를 구성하는 유용한 내용이 존대.
- invliad의 경우, 해당 주소의 frame에 유효한 내용이 없어 접근 불가, 사용 불가(swap area에 내려가 있음)
- Protection Bit (보호 비트)
- 역 페이지 테이블
- 프레임에 대한 페이지 테이블(한 시스템에 하나), 물리적 주소에 대한 페이지 테이블.
- 페이지 테이블이 큰 이유
- 모든 프로세스의 logical 주소에 해당하는 모든 페이지에 대해 page table entry가 존재.
- page가 메모리에 있든 없든 엔트리는 존재.
- 페이지 프레임 하나 당 page table entry를 둔 것.
- 단점
- 물리적 주소로부터 논리적 주소를 얻기 쉬운 구조.
- 페이지 테이블에 해당 주소가 있는 지 여부 판단을 위해 전체 테이블 탐색이 필요.
- 개선
- associative register(병행 제어)
- 공간 Overhead 감소하나 시간 Overhead 증가.
- Shared Page
- 공유 가능한 부분은 한 번만 load 하기.
- read-only로 하여 프로세스 간에 하나의 코드만 메모리에 적재.
- shared code는 모든 프로세스에 동일한 logical address space에 존재해야 함.
- 2가지 조건 약속
- 1. Read-only
- 2. 동일한 logical address에 위치.
✔️ 세그멘테이션
- 프로그램을 여러 개의 의미 단위의 Segment로 구성.
- code, data, stack 함수 등 logical unit으로 구성.
- logical 주소: 세그먼트 번호 | 순서
- segment table
- base : physical memory에서 세그먼트까지의 위치.
- limit: segment의 길이
- STBR(Segment Table Base Register): segment table의 시작 위치.
- STLR(Segment Table Limit Register): 프로세스가 사용하는 segment의 개수.
- 세그먼트 아키텍처
- 각 세그먼트 별로 Protection Bit가 존재.
- sharing: 세그먼트가 의미 단위이기 때문에 sharing과 protection에서 페이징 기법보다 효과적.
- Allocation: First Fit/ Best Fit -> 외부 조각 발생 가능.
- 의미 단위라서 개수가 적고, 테이블 길이도 페이징 보다 작음.
- Paged - Segmentation
- 세그먼트 하나가 페이지 크기의 배수가 되게끔 하여 세그멘테이션에서 발생하는 외부 조각의 문제를 해결해 페이징 기법의 약점 보호.
'CS 지식 > OS(운영체제)' 카테고리의 다른 글
[OS 9-1편] File System (0) | 2023.07.25 |
---|---|
[OS 8편] Virtual Memory (0) | 2023.07.13 |
[OS 6-2편] Process Synchronization (0) | 2023.06.02 |
[OS 5편] CPU Scheduling (0) | 2023.03.30 |
[OS 4편] 프로세스 관리 (0) | 2023.03.21 |