8. 메모리 관리
<주소>
- 논리: 프로세스마다 독립, CPU가 보는 주소
- 물리: 실제 메모리 위치
- 바인딩: 주소 결정
1) compile 2) load 3) execution(run time binding) : 메모리 위치 옯길 수 있음(다이나믹)
<메모리 관리 단위 MMU>
논리적 주소를 물리적 주소로 매핑하는 HW
Address Translation: relocation, limt 레지스터
<메모리 할당>
1) 연속 할당
- 고정 분할: 영구적 분할, 동시에 로드되는 프로그램 수 고덩, 최대수행가능 크기 제한.
내부조각, 외부조각 모두 발생, 융통성 부족
- 가변 분할: 크기를 고려, 동적 변환, 외부조각 발생 (Hole)
First fit/ Best fit/ Worst fit
Compaction: Hole을 없애기 위해 한군데로 모는것. Run time 바인딩.
** Internal fragmentation: 프로그램 크기 < 분할의 크기
사용되지 않는 메모리 조각
** External fragmentation: 프로그램 크기 > 분할의 크기
빈곳이 있지만 프로그램을 넣을 수 없음
<Paging>
가상메모리를 도일한 사이즈의 페이지 단위로 분할 (4KB)
논리적 메모리: 동일한 크기의 frame
물리적 메모리; 동일한 크키의 page
내부조각 발생 가능
불연속 할당
MMU가 필요 없음
* 페이지 테이블: 논리적 주소 - 물리적 주소, 프로그램 개수만큼의 entry
Base 레지스터: 페이지 테이블을 가리킴
Length 레지스터: 페이지 테이블의 크기를 보관
페이지 테이블 조회 -> 메모리 접근 : 총 2회의 메모리 접근
ex) 2 -level page table
32bit 주소: 2^32 = 4G 의 주소공간
페이지 크기: 4K -> 1M (4G / 4K) 의 페이지 테이블 길이 (엔트리 수)
페이지 테이블 엔트리 크기: 4B -> 프로세스당 4M (4B x 1M) 의 페이지 테이블 필요
page #: 20bit = 10bit page # + 10bit page offset (2 - level)
page offset: 12bit **페이지 크기가 offset을 결정한다. 4K이므로 12비트 필요
* inverted page table: 공간복잡도 감소
페이지 프레임 하나당 페이지 테이블 엔트리 차지 - system wide
<process ID, process logical address>
- 페이지 테이블 전채 탐색
*shared page
재진입 가능 코드(Pure - code)
읽기 전용으로 하나의 코드만 메모리에 올림, 공유코드는 각 프로세스의 논리적 주소에서 동일한 위치
* 속도 향상을 위해 translation look ahead buffer (TLB): HW cache, 병렬 탐색
<page #, frame #>
TLB hit: 메모리 접근 0회
* 가상 주소 = Page # (p) + Page Offset (d)
<메모리 보호>
- Protection bit: 접근권한 읽기/쓰기...
- Valid bit: 접근 허용
invalid: 주소를 사용하지 않는경우 / swap 공간에 있는 경우
<Segmentation>
프로그램을 의미단위인 segment로 구성, code - data - stack
* 논리주소 = segment # + segment offset
base: 시작 주소, limit: 길이
STBR: 테이블 위치
STLR: 테이블 길이
공유와 보안에 있어 페이지 보다 효과적
외부조각 발생
<Segment with page>
ST가 세그먼트를 구성하는 페이지 테이블의 base 레지스터 저장
segment length = page크기의 배수
segment = 여러 페이지로 구성
Comments
Post a Comment