1. Logical vs. Physical Address
Logical address (=virtual address)
- 프로세스마다 독립적으로 가지는 주소 공간
- 각 프로세스마다 0번지부터 시작
- CPU가 보는 주소는 logical address임
Physical address
-> 주소 바인딩 : 주소를 결정하는 것
Symbolic Address (Compile)-> Logical Address (어느시점인가?)-> Physical address
- 어느 시점인가?
- Compile time binding
Compile 시점에 이미 binding이 되는 것을 의미한다. 즉 0번지부터 물리적 주소에 할당해야 한다.
- Load time binding
프로그램의 실행이 시작될 때 물리적 메모리의 주소 가 결정되는 주소 바인딩 방식
로더(loader)의 책임하에 물리적 메모리 주소가 부여되며, 프로그램이 종료될 때까지 물리적 메모리 상의 위치가 고정ehlsek.
- Run time Binding
프로그램이 실행을 시작한 이후에도 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식
이 방식은 cpu가 주소를 참조할 때마다 해당 데이터의 물리적 메모리가 어디에 위치해야 하는지, 주소 매핑 테이블(address mapping table)을 이용해 바인딩을 점검합니다. 다른 방식들과 다르게 실행시간에 바인딩이 이루어지므로 기준 레지스터와 한계 레지스터를 포함한 MMU라는 하드웨어적인 지원이 뒷받침 되어야 한다.
CPU가 바라보는 주소는 Logical Address이다.
- CPU가 Instruction을 하려면 메모리를 참조하여 CPU로 읽어 들여서 연산을 한다. 그리고 실행이 되어서 메모리에 올라가더라도 시작 위치는 바뀌지만 그 안에 있는 코드상의 주소는 그대로 Logical Address로 남을 수 밖에 없다.
- CPU가 메모리 몇 번지에 있는 내용을 달라고 요청하면, 그때 주소 변환을 통해 물리적 주소 내용을 읽어 CPU로 전달한다.
Memory-Management Unit (MMU)?
- CPU가 메모리 346번지에 있는 내용을 달라고 요청하는 것은 Logical Address로 요청을 하는 것이다.
기본적인 MMU에서는 레지스터 두 개(Relocation Register & Limit Register)를 가지고 변환하며 Base Register에다가 이 프로그램의 시작 위치를 저장해 놓는다.
그래서 주소 변환을 할 때 논리적 주소에다가 시작 위치를 더해서 물리적 주소를 얻게 된다.
Some Terminologies
Dynamic Loading
- 프로그램을 메모리에 올릴시 동적으로 올린다 즉 해당 루틴이 불려질 때 메모리에 Load하는 것
- memory utilization의 향상
- 가끔씩 사용되는 많은 양의 코드의 경우 유용
- 프로그램 자체에서 구현 가능
- OS의 경우 paging 기법
Overlay
- 메모리의 필요한 정보만 올림
- 프로세스의 크기가 메모리보다 클 때 유용
Swapping
- 프로세스를 일시적으로 메모리에서 backing store로 쫓아내는 것
- backing store : 디스크( 많은 사용자의 프로세스 이미지를 담을 만큼 충분히 빠르고 큰 공간 저장 )
- Swap in/Swap out : 중기 스케줄러(swapper)
에 의해 swap out 시킬 프로세스 선정
- priority-based CPU scheduling algorithm
사용
- Compile time 혹은 load time binding의 경우 swap out할 경우 원래번지로 돌아와야하기 때문에 비효율 적임
- Runtime binding에서 사용되어야 빈 메모리 영역 아무곳에 올릴 수 있어서 효율적임
Dynamic Linking
- Linking이란? Compile하고 소스파일들을 합쳐 하나의 실행파일로 만드는 것
- Static Linking
라이브러리가 프로그램의 실행 파일 코드에 포함됨
실행 파일의 크기가 커짐
동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비
- Dynamic Linking
라이브러리가 실행시 연결됨
라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 둠
라이브러리가 이미 메모리에 잇으면 그 루틴의 주소로 가고 없으면 디스크에서 읽어옴
Allocation of Physical Memory
- 메모리는 일반적으로 두 영역으로 나뉘어 사용
OS 상주 영역
- interrupt vector와 함께 낮은 주소 영역 사용
사용자 프로세스 영역
- 높은 주소 영역사용
- 사용자 프로세스 영역의 할당 방법
Contiguous allocation
: 각각의 프로세스가 메모리의 연속적인 공간에 적재
Fixed partition allocation
Variable partition allocation
Noncontiguous allocastion
: 하나의 프로세스가 메모리의 여러 영역에 분산되어 올림
Paging
Segmentation
Paged Segmentation
연속 할당(Contiguous allocation)
- 고정 분할 방식
물리 적 메모리를 몇개의 영구적 분할로 나눔
분할의 크기가 모두 동일한 방식과 서로 다른 방식이 존재
분할 당하나의 프로그램 적재
융통성이 없음
Internal Fragmentation 발생
- 가변 분할 방식
프로그램의 크기를 고려해서 할당
분할의 크기, 개수가 동적으로 변함
기술적 관리 기법 필요
External Fragmentation
프로그램 크기보다 분할의 크기가 작은 경우
Internal Fragmentation
프로그램 크기보다 분할의 크기가 큰 경우
Hole
- 가용 메모리 공간
- 다양한 크기의 hole들이 메모리 여러 곳에 흩어져 있음
- 프로세스가 도착하면 수용 가능한 hole을 할당
Dynamic Storage Allocation Problem
-
가변 분할 방식에서 size n인 요청을 만족하는 가장 적절한 Hole을 찾는 문제
-
First Fit
Hole중에서 가장 처음 발견되는 Hole에 할당된다. 물론 크기가 n 이상이어야 한다.
-
Best Fit
Hole을 다 살펴본 다음 프로그램의 크기와 가장 비슷한 Hole에 올려놓는 방법이다.
-
Worst Fit
가장 큰 홀에다가 프로그램을 할당하는 방법