Memory Allocation
물리적 메모리의 할당
메모리는 일반적으로 두 영역으로 나뉘어 사용된다.
OS 상주 영역에는 아주 낮은 주소 영역에 interrupt vector 와 함께 존재한다.
사용자 프로세스 영역에는 높은 주소 영역을 사용한다.
이 사용자 프로세스 영역에 메모리를 할당하는 방법에는 다시 또 두 가지가 있다.
continuous allocation은 각각의 프로세스가 메모리의 연속적인 공간에 적재가 된다.
fixed partition allocation
variable partition allocation
noncontinuous allocation 은 하나의 프로세스가 메모리의 여러 영역에 나뉘어 올라간다.
paging
segmentation
paged segmentation
1) continuous allocation
fixed partition allocation 고정분할방식
fixed partition allocation 을 따르면 메모리의 공간이 몇개의 영구적 partition으로 분할된다.
파티션의 크기가 모두 동일한 방식과 서로 다른 방식이 존재하며
파티션당 하나의 프로그램이 적재될 수 있다.
융통성이 없어서 동시에 메모리에 로드되는 프로그램의 수가 제한적이게 되며, 최대 수행 가능한 프로그램의 크기도 제한된다.
프로그램이 파티션과 맞지 않다면, 외부조각 external fragment 이나 내부 조각 internal fragment이 생기게 된다.
variable partition allocation 가변분할방식
프로그램이 실행될 때마다 차곡차곡 메모리에 올려두는 방식으로
프로그램의 크기를 고려해서 할당된다. 분할의 크기와 개수가 동적으로 변한다.
이 방법을 위해서는 기술적으로 관리 기법이 갖추어져야한다.
가변분할방식도 프로그램 실행에 따라서 외부조각이 발생할 수 있는데 예를 들면 아래와 같은 상황이다.
프로그램 B의 수행이 끝나도 프로그램D가 B가 있던 공간에 들어가지 못하기 때문에, C뒤에 위치하게 된다. 이때 외부조각이 발생할 수 있다.
hole
가용메모리 공간
다양한 크기의 hole 들이 여러 메모리 공간에 흩어져 있다.
프로세스가 도착하면 수용 가능한 hole 을 할당한다.
따라서 운영체제는 다음의 정보를 항상 숙지하고 있다. → 1) 할당 공간 2) 가용공간 hole
dynamic storage allocation problem
가변분할 방식에서 size 가 n인 요청을 만족하는 가장 적절한 hole을 찾는 문제
해결방법에는 3가지가 있다.
first fit : size n을 만족하는 hole 중 가장 최초로 찾아지는 것에 할당하는 방법
best fit : size n을 만족하는 hole 중 가장 작은 것에 할당하는 방법
hole들의 리스트가 크기순으로 정렬되지 않는 경우, 모든 hole 들을 탐색해야한다.
많은 수의 아주 작은 hole 들이 생성될 수 있다.
worst fit : size n을 만족하는 가장 큰 hole에 할당하는 방법
모든 리스트를 탐색해야하며
큰 hole 들이 생성된다.
당연하게도 first fit 은 시간적으로, best fit 은 공간 이용률 측면에서 각각 가장 유리하며, worst fit은 가장 비효율적인 것이 실험 결과 나타났다.
compaction
external fragmentation 외부조각 문제를 해결하기 위해서 사용중인 메모리 영역을 한 군데로 몰고 hole 들을 다른 한 곳으로 모아 아주 큰 hole 을 만드는 방법이다.
비용이 매우 많이 들며, 최소한의 이동으로 메모리를 compaction 하는 방법은 매우 복잡하다.
당연하지만, compaction 기법은 프로세스의 주소가 실행되는 시간에 동적으로 재배치가 가능한 경우에만 사용 가능하다.
2) noncontinuous allocation
paging
프로그램을 구성하는 주소 공간을 페이지 단위로 자른다. 물리적 메모리의 공간도 같은 단위로 자른다.
주소 변환이 더 복잡해지기 때문에 address binding 이 더 복잡해진다.
segmentation
의미있는 단위로 자르는 것
paged segmentation
paging
프로세스의 virtual memory 를 동일한 사이즈의 page 단위로 나눈다.
virtual memory 의 내용이 page 단위로 noncontinous 하게 저장된다.
일부는 backing storage 에, 일부는 physical memory 에 저장된다.
basic method
physical memory 를 동일한 크기의 frame 으로 나눈다.
local memory 를 동일한 크기의 page 로 나눈다. → frame 과 같은 크기!
모든 가용 frame 들을 관리한다.
page table 을 사용하여 logical address를 physical address 로 변환한다.
page 단위로 나누어지기 때문에 더이상 두 개의 register 로는 불가하다.
external fragment 는 발생하지 않지만, 여전히 internal fragmentation 이 발생할수는 있다.
페이지 단위로 나누게 되면, 페이지 범위를 다 채우지 못해 남는 공간이 발생할 수 있다는 뜻.
page table 은 physical memory 에 상주한다.
page table base register 가 page table 을 가리키고 있고,
page table length register 는 테이블의 크기를 보관한다.
따라서 모든 메모리 접근 연산에는 2번의 memory access 가 필요한데, 한번은 page table 에 접근하기 위해서, 1번은 실제 데이터와 인스트럭션에 접근하기 위해서 필요하다.
속도 향상을 위해서
associative register
ORtranslation look-aside
buffer 라고 불리는 고속의 lookup hardware cache 를 사용한다.associative resiters (TLD) : parallel search 가 가능하다. page table 테이블 중 일부만 존재한다. 없으면 page table 로 이동함
address translation 과정
page table 중 일부가 associative regieter 에 보관되어있다.
만약 해당 page 번호가 존재하는 경우, 곧바로 frame 번호를 얻게 된다.
하지만 존재하지 않은 경우, main memory 에 있는 page table로부터 frame 번호를 얻는다.
TLB 는 context switch 때 flush (remove old entiries) 된다. → 프로세스별로 별도로 존재하기 때문에
실제 메모리에 접근하는 시간은?
상당히 빠르다!
2단계 페이징 테이블 - two level paging table
사용하는 이유
컴퓨터에서 어떤 시스템이 존재할 때, 그 존재의 이유는 보통 두 가지이다.
시간을 빠르게 하거나
공간을 효율적으로 하거나
two level paging table 의 경우, 속도는 중간 과정이 추가 되기 때문에 오히려 더 늘어날 것이라는 것을 알 수 있다. 그래서 아마
공간을 효율적
으로 하지 않을까, 추측할 수 있다.
현대의 컴퓨터는 32bit, 64bit 단위이다. 그렇다면, 프로그램마다 가지고 있는 Maximum 주소체계는 몇 개나 되겠는가? → 컴퓨터의 32bit, 64bit 에 따라서 나누어진다.
32bit 컴퓨터의 경우, 0번부터 2^32번까지의 메모리 주소를 가질 수 있다.
그런데 2^10 = K 이고, 2^20 = M이고, 2^30 = G이므로,
2^32 = 2^2 * G = 4GB
를 의미하게 된다.이때, 페이지 사이즈가 4K라면, 1M개의 page table entry 가 필요하게 된다.
각 page entry가 4B일 때에는, 프로세스 당 4M의 page table 이 필요하다.
그러나 대부분의 프로그램은 4G의 주소공간 중에서 지극히 일부분만 사용하므로, page table 공간이 심하게 낭비된다.
page table 자체를 page 로 구성한다.
사용되지 않는 주소 공간에 대한 outer page table의 엔트리 값은 null 이다.
multi-level paging and performance
address space 가 더 커지면 2단계 페이징 테이블만으로는 부족하다. 다단계 페이지 테이블이 필요하다.
각 단꼐의 페이지 테이블이 메모리에 존재하므로 logical address 의 physical address 변환에 더 많은 메모리 접근이 필요하다.
TLB 를 통해 메모리 접근 시간을 줄일 수 있다.
4단계 페이지 테이블을 사용하는 경우,
메모리 접근 시간이 100ns, TLB 접근 시간이 20ns 이고 TLB hit ratio 가 98%인 경우,
총 5번의 메모리 접근이 필요하다 → 4번은 페이지 주소변환, 1번은 데이터 접근
effective memory access time = 0.98 * 120 + 0.02 * 520 = 128 nano seconds
98%는 TLB 를 통해서 이루어 질테니, 20ns정도만 주소변환에 소요된다. 이 경우, 메모리 접근시간+주소변환시간 = 120ns 가 된다.
반면 TLB 를 통해 이루어지지 못한 2%의 경우는, 주소변환에만 400ns 가 소요된다. 그리고 TLB 에 없다는 것을 확인하는 작업에 20ns, 실제 메모리에 접근하는 시간으로 다시 100ns 가 소요된다. 즉, 총 520ns 가 소요되는 것이다.
결과적으로 주소 변환을 위해 28ns 만 소요된다.
실제 메모리 접근을 위한 100ns + 주소변환을 위한 28ns
memory protection - page table 에서 valid, invalid bit 표현
page table 의 각 entry 마다 아래의 bit 를 둔다.
protection bit : page 에 대한 접근 권한 (read, write, read-only)
valid
해당 주소의 frame 에 그 프로세스를 구성하는 유효한 내용이 있음을 뜻함. → 접근 허용
테이블에 매핑된 실제 물리적 메모리 주소로 가면 데이터를 찾을 수 있다.
invalid
해당 주소의 frame 에 유효한 내용이 없음을 뜻한다. → 접근 불허
프로세스가 그 주소 부분을 사용하지 않거나
해당 페이지가 메모리에 올라와있지 않고 swap area에 있는 경우를 의미한다.
inverted page table
page table 이 매우 큰 이유
모든 프로세스별로 그 logical address 에 대응하는 모든 page 에 대해 page table entry 가 존재하기 때문이다.
대응하는 page 가 메모리에 있든 아니든 간에 page table 에는 entry 로 존재한다.
그래서 이 낭비되는 공간을 줄이기 위해 등장한 것이 inverted page table!
inverted page table 에서는 physical memory 에 접근하면 page table 에서 매핑된 logical memory 주소를 거꾸로 되찾아간다.
즉, 물리적 메모리 주소에 맞게 논리적 주소를 바꾸는 형식!
page frame 하나 당, page table 에 하나의 entry 를 둔 것이다.
각 page table entry 는 각각의 물리적 메모리의 page frame 이 담고 있는 내용을 표시한다.
process id, process logical address
단점 : 테이블 전체를 탐색해야한다.
해결 : associative register 를 사용한다. (하지만 너무 비싸다;;)
shared page
shared code
re-entrant code = pure code
read-only
로 하여 프로세스 간에 하나의 code 만 메모리에 올린다.shared code 는 모든 프로세스의 Logical address space 에서 동일한 위치에 있어야 한다.
private code and data
각 프로세스들은 독자적으로 메모리에 올린다.
private data 는 logical address space 의 아무 곳에 와도 무방하다.
segmentation
의미단위로 범위를 나눈 것. 예를 들면 메모리 내의 코드, 스택 등의 공간
의미단위로 범위를 나누기 때문에 segment의 크기가 균일하지 않다.
logical address 는 다음의 두 가지로 구성된다.
segment-number
offset → d
segment table
모든 테이블은 base 와 limit 값을 가지고 있다.
base : starting physical address of segment. 즉, 물리적 메모리에서 세그먼트의 시작점을 나타낸다.
limit : lenght of the segment. 세그먼트의 길이를 나타낸다.
segment table base register - STBR
물리적 메모리에서의 segment table의 위치
segment table limit register - STLR
프로그램이 사용하는 segment의 수
segment number s < STLR 이어야 한다.
페이징 기법과 다른 점
페이징 기법의 경우, 모든 페이지의 단위가 같기 때문에 물리적 메모리 내부에 fragment 위치를 table 에 매핑하고 있으면 되었지만,
세그먼트 기법의 경우, 모든 세그먼트의 단위가 다르기 때문에 테이블에는 정확한 물리적 메모리의 byte 주소를 가지고 있어야 한다.
장점
protection
각 세그먼트별로 protection bit 가 존재한다.
각각의 entry 가 아래를 만족함
valid bit = 0 이면, illegal segment 라고 판단한다.
read, write, execution 권한 bit → 의미단위로 의미를 나누기 때문에 세그먼트별로 권한 분할이 가능하다.
sharing
shared segment
same segment number
segment 는 의미 단위이기 때문에 공유와 보안에 있어서 paging 보다 훨씬 유리하다.
paging 기법과 비교해보았을 때, 훨씬 페이징 테이블 개수가 적어서 메모리 낭비가 적다.
paging : 100만개
segment : 5개
단점
allocation : first fit, best fit
의미 단위로 길이가 유동적인 세그먼트들이 쌓이기 때문에 가장 첫번째로 쌓인 것이 잘 쌓이게 된다.
external fragmentation 이 발생한다.
segment 길이가 동일하지 않으므로, 가변 분할 방식에서와 동일한 문제점들이 발생하게 된다. → hole
allocation 문제가 발생할 수 있다.
paged segmentation
paging + segmentation
paging 기법과 segmentation 기법의 장점을 가져와 융합해놓은 방법으로
segment table 에는 segment 자체의 base address 가 아니라, segment 를 구성하는 page table 의 base address 를 가지고 있다.
실제 컴퓨터에는 segment 로만 이루어진 경우는 거의 없고 사실상 paging 기법을 같이 사용하고 있다.
지금까지…
지금까지 우리는 다양한 물리적 메모리의 관리 기법에 대해서 알아보았다.
물리적 메모리 관리에서 가장 핵심이 되는 것은 결국 논리적 주소를 물리적 메모리 주소로 변환하는 과정이었다. →
주소변환
하지만 이 모든 과정에서 운영체제가 하는 일은 거의 없었다. 모두 하드웨어가 수행하는 일들이었다.
왜 하드웨어에 의지할 수 밖에 없을까?
하나의 프로세스가 CPU를 가지고 논리적 메모리 주소에서 물리적 메모리 주소로 변환을 하는 과정에는 사실상 운영체제가 끼어들 필요가 없다.
운영체제의 개입이 필요하다는 말은 프로세스가 사용자 → 운영체제로 넘어간다는 것을 의미하는데, 메모리를 참조할 때마다 운영체제와 사용자 사이를 이동해야한다는 것은 말이 안된다.
따라서 이 모든 과정은 하드웨어적으로 이루어질 수 밖에 없다.
운영체제가 끼어들어야 하는 케이스는 바로 I/O 접근 때였다.
그렇다면 운영체제는 무엇을 하는가…?
물리적 메모리 주소 변환에서는 사실상 운영체제가 하는 일은 없다.
하지만 virtual memory 관리에서는 운영체제의 역할이 늘어난다.
Last updated