Logical vs. Physical Address
Logical Address (virtual address)
- 프로세스마다 독립적으로 가지는 주소 공간
- 각 프로세스마다 0번지부터 시작
- CPU가 보는 주소는 logical address
Physical Address
Address Binding : 주소 결정하는 것
- Symbolic -> Logical -> Physical
- Symbolic : 사용자 입장. 함수명.
- Logical : 0번지부터 시작하는 프로세스 가상 주소 공간
- Physical : 프로세스가 메모리에 실제로 올라가는 위치
언제 Logical -> Physical로 변환되는가?
- Compile time binding
- 컴파일 시점
- Logical 주소 공간을 그대로 사용해야 함. (absolute code)
- 공간적 비효율 발생
- 주소 공간을 변경하고 싶다면 Compile 한번 더 해야 함
- Load time binding
- 실행 시점
- Loader의 책임 하에 물리적 메모리 주소 부여
- 컴파일러가 재배치가능 코드(relocatable code)를 생성한 경우 가능
- Execution time binding (Runtime binding)
- 실행 시점에 물리적 메모리 공간 할당되는 것은 Load time과 동일
- 하지만 실행 이후에도 물리적 주소가 바뀔 수 있음
CPU는 logical memory를 바라본다.
- logical address는 변하지 않는다.
- CPU는 logical address를 바라보고, 연산 시행 시 주소 변환을 통해 physical address로 변환해 값을 읽어온다.
Memory Management Unit (MMU)
logical address를 physical address로 매핑해주는 hardware device
base(relocation) register와 limit register로 구성.
limit register는 logical address의 유효성을 검사. 에러 시 trap 작동.
- MMU scheme
사용자 프로세스가 CPU에서 수행되며 생성해내는 모든 주소값에 대해 base register의 값을 더한다.
- user program
logical address 만을 다룬다.
실제 physical address를 볼 수 없고, 필요도 없음.
Dynamic Loading
프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴에 불려질 때 메모리에 load (필요할 때마다)
- memory utilization의 향상
- 프로그램은 방어적으로 작성. 때문에 메모리를 사용하는 빈도가 다름.
- 가끔 사용하는 많은 양의 코드를 메모리에 미리 얹어두면 비효율적.
- 운영체제의 지원 없이도 프로그램 자체에서 구현 가능
(Manual) Overlays
메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림
- 프로세스의 크기가 메모리보다 클 때 유용
- 운영체제의 지원 없이 사용자에 의해 구현
- 작은 공간의 메모리를 사용하던 초기 시스템에서 프로그래머가 수작업으로 구현 (복잡)
Schematic View of Swapping
프로세스를 일시적으로 메모리에서 backing store로 쫓아내는 것
- Swap out : 메모리 -> backing store
- Swap in : backing store -> 메모리
- 일반적으로 중기 스케줄러(Swapper)에 의해 쫓아낼 프로세스 선정
- CPU 우선 순위가 낮은 프로세스를 swapped out
- CPU 우선 순위가 높은 프로세스를 메모리 위치로 swap in
- 효율적인 swap 구현을 위해서는 runtime binding이 효율적. (그렇지 않으면 이전 저장 위치로 복구해야 함)
Dynamic Linking (= Library)
Linking을 실행 시간(runtime)까지 미루는 기법.
Link : Compile된 실행 파일을 여러 개 묶어서 하나의 실행 파일로 만드는 과정.
- Static Linking
라이브러리가 프로그램의 실행 파일 코드에 포함
실행 파일의 크기가 커짐
동일한 라이브러리를 각 프로세스가 메모리에 올리므로 메모리 낭비
- Dynamic Linking
라이브러리가 실행시 연결(Link)됨.
라이브러리 코드를 직접 포함하지 않음. 대신,
라이브러리 호출 부분에 라이브러리 루틴의 위치 찾기 위한 STUB이라는 작은 코드를 둠.
라이브러리가 이미 메모리에 있으면 주소로 가고 없으면 디스크에서 읽음.
운영체제의 도움 필요.
Allocation of Physical Memory
메모리는 일반적으로 두 영역으로 나뉘어 사용
- 사용자 프로세스 영역 (높은 주소 영역)
사용자 프로세스 영역의 할당 방법
- Contiguous Allocation (연속 할당)
각각의 프로세스가 메모리의 연속적 공간에 적재되도록 하는 것
- Non-Contiguous Allocation
하나의 프로세스가 메모리 여러 영역에 분산되어 올라갈 수 있음
Address Binding 어려워 질 수 있다.
- OS 상주 영역 + interrupt vector (낮은 주소 영역)
Contiguous Allocation (연속 할당)
- 고정 분할 (Fixed Partition)
물리적 메모리를 몇 개의 영구적 파티션으로 나눔
- 분할의 크기는 모두 같을 수도, 다를 수도
- 분할마다 하나의 프로그램 적재
- 융통성 없음 (최대 동시 로드 프로그램 수 제한)
- 외부 조각과 내부 조각 발생
외부 조각 (External Fragmentation)
- 프로그램 크기보다 분할 크기가 작은 경우
- 프로그램에 배정되지 않았으나 분할 크기가 작아 프로그램이 올라갈 수 없는 작은 분할
내부 조각 (Internal Fragmentation)
- 프로그램 크기보다 분할 크기가 큰 경우
- 분할의 크기가 커 프로그램이 배정되었지만 사용되지 않는 메모리 조각
- 가변 분할 (Variable Partition)
프로그램 실행마다 메모리에 순서대로 할당
- 프로그램 끝나면 메모리에서 Swap out
- 가변 분할해도 외부조각(Hole) 발생 가능 (프로그램 끝날 때마다)
- 운영체제는 할당 공간, 가용 공간에 대한 정보 관리
Dynamic Storage-Allocation problem
가변 분할 방식에서 size N을 만족하는 가장 적절한 Hold 찾기
- First fit
Size N 이상 분할 중 가장 맨 앞
- Best fit
Size N 이상 분할 중 가장 작은 hole 찾아서 할당
hole 정렬 안되면 완전 탐색 필요
무수히 많은 hole 생성
- Worst fit
Size N 이상 분할 중 가장 큰 hole 찾아서 할당
비효율적 (First, best > Worst)
Compaction
사용 중인 메모리 영역을 한 군데로 몰고 hole을 다른 한 곳으로 몰아 큰 block 생성
- 비용이 많이 듬 (이미 사용중인 hole 이동)