[운영체제] Memory management
논리메모리 vs 물리메모리
Logical address(=virtual address)
- 프로세스마다 독립적으로 가지는 주소 공간
- 각 프로세스 마다 0 번지 부터 시작
- CPU가 보는 주소는 logical address임.
Physical address
- 메모리에 실제 올라가는 위치.
주소 바인딩
주소바인딩 : 주소를 결정하는 것.
Symbolic Address(숫자말고 심볼로된 주소) ->(컴파일후 숫자로된 논리주소) Logical Address -> Physical address
논리주소에서 물리주소로 결정하는 시점은 언제인가>
- Compile Time Binding:
- 컴파일 시점에 물리적인 주소가 결정되는 방법.
- 시작위치 변경시 재 컴파일
- 컴파일러는 절대코드 생성
- Load Time Binding:
- 메모리에 처음 올라갈때 물리적 주소가 결정(메모리에 적재하는 시점에 결정된다는말)
- Loader의 책임 하에 물리적 메모리 주소 부여
- 컴파일러가 재배치가능코드를 생성한 경우 가능
- Execution Time Binding:
- 오늘날 대부분 지원하는 방식.
- 실행시에 물리적 주소가 결정된다.
- 수행이 시작된 이후에도 프로세스의 메모리 상 위치를 옮길 수 있음
- 하드웨어(Memory-Management Unit, MMU)적인 지원이 필요
MMU
가상 주소를 물리 주소로 바꾸어 주도록 하는 하드웨어 장치로, Base register는 Relocation register라고 불린다.
User program은 logical address만 다루고 physical address는 다루지 않게 된다.
Dynamic Loading
로딩은 메모리로 올리는것을 말함.
- 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질때 메모리에 load하는 것.
- 가끔씩 사용되는 많은 양의 코드의 경우 유용하다.
- 페이징 기법과 다이나믹 로딩은 다른것.
Overlays
메모리에 필요한 부분만 그때그때 올려놓는 것.
- 프로세스의 크기가 메모리보다 클 때 유용.
- 운영체제의 지원없이 사용자에 의해 구현 되어야 한다.
Swapping
- 프로세스를 메모리에서 일시적으로 메모리에서 backing store로 쫓아내는 것.
Backing Store(=swap area)
- 저장공간, 쫓겨나는 프로세스를 여기 저장한다.
Swap in / swap out
- 중기 스케줄러(swapper)에 의 해 swap out 시킬 프로세스를 선정한다.
- 우선순위가 낮은 프로세스를 swap out 시키고 우선순위가 높은 프로세스를 메모리에 올려놓는다.
- 컴파일 타임 이나 로드타임 바인딩에서는 원래 메모리 위치로 swap in 해야한다.
- swap time은 대부분 transfer time(swap되는 양에 비례하는 시간)이다.
- 프로그램 전체가 swap in/out 되는 것은 디스크 I/O이기 때문에 오버헤드가 굉장히 크다.
Dynamic Linking
링크 : 컴파일
- 링킹을 실행 시간 까지 미루는 기법
- Static Linking
- 라이브러리가 프로그램의 실행 파일 코드에 포함됨.
- Dynamic Linking
- 라이브러리가 실행시 연결 됨.
- 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 둠.
- 라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 가고 없으면 디스크에서 읽어옴.
물리적인 메모리를 관리하는 방법
일반적으로 두영역으로 나누어 관리한다.
- OS 영역
- 사용자 프로세스 영역
연속 메모리 할당
옛날 방식이다.
각각의 프로세스가 메모리의 연속적인 공간에 로드 되도록 하는 방법이다.
고정 분할 방식과 가변 분할 방식으로 나뉜다.
- 고정 : 파티션당 하나의 프로그램이 적재, 메모리에 적재되는 프로그램의 수 고정
- 가변 : 프로그램의 크기를 고려에서 할당한다. 외부 조각 발생한다.
Internal Framentation : 프로그램 크기보다 파티션의 크기가 큰 경우에 발생
Extenral fragmentation : 프로그램 크기보다 파티션의 크기가 작은 경우에 발생한다. 빈파티션이지만 프로그램이 올라갈수 없는 파티션.
프로그램 크기가 균일하지 않기때문에 외부 조각이 생길수 있다.
Hole
프로세스 사이사이에 사용가능한 메모리 공간 .
- 다양한 크기의 hole이 메모리 여러 곳에 흩어져 있다.
- 프로세스가 도착하면 수용 가능한 hole을 할당한다.
Dynamic Storage-allocation Problem
가변 분할 방식에서 size n인 요청을 만족하는 가장 적절한 hole을 찾는 문제
- First fit
- size가 n 이상인 것 중 최초로 찾아지는 hole에 할당.
- 그냥 찾는거니까 빠르다
- Best fit
- size가 n 이상인 가장 작은 hole 을 찾아서 할당.
- hole들의 리스트가 크기순으로 정렬되지 않은 경우 모든 hole의 리스트를 탐색해야함.
- 많은 수의 아주 작은 hole들이 생성된다.(단점)
- Worst-fit
- 가장 큰 hole에 할당한다.
- 역시 모든 리스트를 탐색해야 한다.
- 상대적으로 아주 큰 hole들이 생성된다.
- First-fit과 Best-fit이 Worst-fit보다 속도와 공간 이용률 측면에서 효과적인 것으로 알려져 있다. (실험적인 결과)
Compaction
Extenral fragmentation 문제를 해결하는 방법 중 하나이다.
- 사용중인 메모리 영역을 한군데로 몰고 hole들을 다른 한 곳으로 몰아 큰 block을 만드는 것.
- 매우 비용이 많이 드는 방법이다.
최소한의 메모리 이동으로 compaction 하는 방법은 매우 복잡한 문제…
- 전체를 다 미는 것 보다는 작은이동으로 큰 홀을 만드는게 효율적일 수 있다.
Paging
- Process의 virtual memory를 동일한 사이즈의 page 단위로 나눔.
- Virtual Memory의 내용이 page단위로 불연속적으 로 저장된다.
- 일부는 backing store에, 일부는 physical memory에 저장한다.
- physical memory도 페이지 단위로 자르는데 이를 frame이라고 한다. frame은 단위라고 생각하면 된다.
- logical memory또한 동일한 크기의 페이지로 나눈다.
- 페이지 테이블을 이용하여 논리주소를 물리주소로 변환한다. (주소변환 방법)
- 주소가 페이지 단위로 해야되기 때문에
- 페이지 테이블은 페이지 개수만큼 존재한다.
- 테이블의 valuer값으로 physical addressdml frame number을 가진다.
- 외부 단편화는 발생하지 않는다.
- 내부단편화는 발생할 수 있다.
- 할당은 항상 프레임의 정수배로 할당 되기 때문이다.
Segmentaion
프로그램의 주소 공간(virtual memory)을 의미있는 단위로 자르는 기법이다.
- 크게 code, data, stack segment로 자른다. 세그먼트는 의미 단위이기 때문에 이보다 더 잘게 자를 수도 있다.
- 크기가 균일하지 않기 때문에 연속 할당방식에서 발생했던 문제점(Dynamic Storage-Allocation Problem)이 동일하게 발생할 수 있다.