[OS] 메모리 관리
Updated:
메모리 관리
- 집마다 고유의 주소가 있듯이 메모리 역시 주소를 통해 접근하는 저장 장치이다. 이때의 주소(address)란 서로 다른 위치를 구분하기 위해 사용하는 일련의 숫자로 구성된다.
- 컴퓨터에서는 byte 단위로 메모리 주소를 부여하기 때문에 32비트 주소 체계를 사용하면 2^32 바이트만큼의 메모리 공간에 서로 다른 주소를 할당할 수 있다.
- 보통 4KB(2^12 byte)단위로 묶어서 페이지(page)라는 하나의 행적구역을 만든다. 페이지 하나의 크기가 2^12바이트이므로 페이지 내에서 바이트별 위치 구분을 위해서는 12비트가 필요하다. 따라서 총 32비트의 주소 중 하위 12비트는 페이지 내에서의 주소를 나타내게 된다.
1. 주소 바인딩
-
논리적 주소(logical address) : 프로그램이 실행을 위해 메모리에 적재되면 그 프로세스를 위해 생성되는 독자적인 주소(공간)이다. CPU는 프로세스마다 독립적으로 갖는 논리적 주소에 근거해 명령을 실행한다. 논리적 주소는 각 프로세스마다 독립적으로 할당되며 0번지부터 시작된다.
-
물리적 주소(physical address) : 물리적 메모리에 실제로 올라가는 위치를 말한다. 보통 물리적 메모리의 낮은 주소 영역에는 운영체제가 올라가고, 높은 주소 영역에는 사용자 프로세스들이 올라간다.
-
주소 바인딩(address biding) : 프로세스의 논리적 주소를 물리적 메모리 주소로 연결시켜주는 작업이다.
-
주소 바인딩 방식은 프로그램이 적재되는 물리적 메모리의 주소가 결정되는 시기에 따라 세 가지로 분류할 수 있다.
-
컴파일 타임 바인딩(compile time binding) : 물리적 메모리 주소가 프로그램을 컴파일할 때 결정되는 주소 바인딩 방식이다. 이 바인딩 방식은 프로그램이 올라가 있는 메모리의 위치를 변경하려면 컴파일을 다시 하는 수고가 필요하다. 따라서 비현실적이고 현대에서는 잘 사용하지 않는 기법이다. 프로그램이 절대 주소로 적재된다는 뜻에서 이와 같은 주소 바인딩 방식을 절대코드(absolute code)를 생성하는 바인딩 방식이라 고도 한다.
-
로드 타임 바인딩(load time binding) : 프로그램의 실행이 시작될 때에 물리적 메모리 주소가 결죙되는 바인딩 방식이다. 사용자 프로그램을 메모리에 적재시키는’로더(loader)’ 라는 프로그램의 책임하에 물리적 메모리 주소가 부여되며 종료될 때까지 물리적 메모리 상의 위치가 고정된다. 이 방식은 컴파일러가 재배치 가능 코드(relocatable code)를 생성한 경우에 가능한 주소 바인딩 방식이다.
-
실행 시간 바인딩(execution time binding 또는 run time binding) : 프로그램이 실행을 시작한 후에도 그 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 바인딩 방식이다.
- CPU가 주소를 참조할 때 마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지, 주소 매핑 테이블(address mpapping table)을 이용해 바인딩을 점검해야 한다.
- 기준 레지스터(base register)와 한계 레지스터(limit register)를 포함해 MMU(Memory Management Unit: 메모리 관리 유닛)라는 하드웨어적인 지원이 뒷받침되어야한다. MMU는 논리적 주소를 물리적 주소를 매핑해주는 하드웨어 장치이다.
-
-
CPU가 특정 프로세스의 논리적 주소를 참조하려고 할 때 MMU 기법은 그 주소값에 기준 레지스터의 값을 더해 물리적 주소값을 얻어낸다.
- 기준 레지스터는 프로세스의 물리적 메모리 시작 주소를 가지고 있다.
- MMU 기법에서는 프로그램의 공간이 물리적 메모리의 한 장소에 연속적으로 적재되는 것으로 가정한다.
- 프로그램이 적재되는 물리적 메모리상의 시작 주소만 알면 주소 변환을 쉽게 할 수 있다.
- 프로세스가 다른 메모리 역역에 침범하는 것을 방지하기 위해 CPU가 참조 요청을 한 주소가 한계 레지스터 값보다 큰지를 먼저 체크해 보안을 유지한다. 한계레지스터는 프로세스의 크기를 담고 있다.
2. 메모리 관리와 관련된 용어
- 동적 로딩(dynamic loading)
-
여러 프로그램이 동시에 메모리에 올라가서 수행되는 다중 프로그래밍(multi-programming) 환경에서 메모리 사용의 효율성을 높이기 위해 사용하는 기법 중 하나이다.
-
프로세스가 시작될 때 그 프로세스의 주소 공간 전체를 메모리에 다 올려놓는 것이 아니라 메모리를 좀 더 효율적으로 사용하기 위해 해당 부분이 불릴 때 그 부분만을 메모리의 적재하는 방식을 사용한다.
-
사용되지도 않을 많은 양의 코드가 메모리에 올라가는 것을 막아 메모리를 좀 더 효율적으로 사용할 수 있게 한다.
-
- 동적 연결(dynamic linking)
-
연결(linking)이란 프로그래머가 작성한 소스 코드를 컴파일하여 새성된 목적 파일(object file)과 이미 컴파일된 라이브러리(library) 파일들을 묶어 하나의 실행파일을 생성하는 과정을 말한다.
-
동적 연결은 목적 파일과 라이브러리 파일 사이의 연결을 프로그램의 실행 시점까지 지연시키는 기법이다. 즉 실행 시점에 연결이되기 때문에 실행 파일에 라이브러리 코드가 포함되지 않으며, 프로그램이 실행되면서 라이브러리 함수를 호출할 때가 되어서야 라이브러리에 대한 연결이 이루어진다.
-
실행파일의 라이브러리 호출 부분에 해당 라이브러리의 위치를 찾기 위한 스텁(stub)이라는 작은 코드를 둔다.
-
다수의 프로그램이 공통으로 사용하는 라이브러리를 메모리에 한 번만 적재하므로 메모리 사용의 효율성을 높일 수 있다. 이러한 동적연결 기법은 운영체제의 지원을 필요로 한다.
-
- 중첩(overlays)
-
프로세스의 주소 공간을 분할해 실제 필요한 부분만을 메모리에 적재하는 기법을 말한다.
-
프로그램의 크기가 물리적 메모리의 크기에 비해 작다면 주소 공간 전체를 한꺼번에 올릴 수 있지만 그렇지 않다면 분할하여 메모리에 올린다.
-
동적로딩은 메모리에 더 많은 프로세스를 동시에 올려놓고 실행하기 위한 용도인 반면 중첩은 단일 프로세스만을 메모리에 올려놓는 환경에서 메모리 용량보다 큰 프로세스를 실행하기 위한 어쩔 수 없는 선택이다.
-
- 스와핑(swapping)
-
메모리에 올라온 프로세스의 주소 공간 전체를 디스크의 스왑 영역(swap area)에 일시적으로 내려놓는 것을 말한다.
-
스왑 영역은 백킹스토어(backin store)라고도 부르며, 디스크 내에 파일 시스템과는 별도로 존재하는 일정 영역을 말한다.
-
디스크에 일시적으로 저장하는 공간이므로 저장 기간이 상대적으로 짧은 저장공간이다.
-
스와핑이란 개념은 특정한 이유로 수행 중인 프로세스의 주소 공간을 일시적으로 메모리에서 디스크로 내려놓는 놓는 것이다.
-
디스크에서 메모리로 올리는 작업을 스왑 인(swap in), 메모리에서 디스크로 내리는 작업을 스왑 아웃(swap out)이라고 한다.
-
일반적으로 스와핑은 스와퍼(swapper)라고 불리는 중기 스케줄러(medium-term scheduler)에 의해 스왑 아웃 시킬 프로세스를 선정한다.
-
스와핑의 가장 중요한 역할은 메모리에 존재하는 프로세스의 수를 조절하는 것이다.
-
너무 많은 프로그램이 메모리에 동시에 올라오게 되면 프로세스당 할당되는 메모리의 양이 지나치게 적어져 시스템 전체의 성능이 크게 떨어진다. 스와핑은 이러한 문제를 해결하기 위해 몇몇 프로그램을 통째로 디스크의 스왑 영역으로 보내고 메모리에 남아 있는 프로그램들에게 실행에 필요한 적절한 메모리 공간을 보장한다. 그후 충분히 실행된 프로그램을 디스크 스왑영역으로 보내고 스왑아웃되었던 프로그램들을 스왑 인 시킨다.
-
3. 물리적 메모리의 할당 방식
사용자 프로세스 영역의 관리 방법은 프로세스를 메모리에 올리는 방식에 따라 연속할당(contiguous allocation) 방식과 불연속할당(noncontiguous allocation)방식으로 나누어진다.
-
연속할당 방식
각각의 프로세스를 물리적 메모리의 연속적인 공간에 올리는 방식이다. 물리적 메모리를 다수의 분할로 나누어 하나의 분할에 하나의 프로세스가 적재되도록 한다. 분할을 관리하는 방식에 따라 두가지로 나뉜다.- 고정분할 방식(fixed partition allocation)
- 물리적 메모리를 주어진 개수만큼의 영구적인 분할(partition)로 나누어두고 각 분할에 하나의 프로세스를 적재해 실행시킬 수 있게 한다. 분할의 크기는 동일할수도 사로 다를 수도 있다. 고정분할 방식은 동시에 메모리에 올릴수 있는 프로그램의 수가 고정되어 있으며 수행 가능한 프로그램의 최대 또한 제한된다는 점에서 융툥성이 떨어진다. 또한 외부조각과 내부조각이 생길수 있다.
- 가변분할 방식(variable partition allocation)
-
메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식을 말한다. 따라서 가변분할 방식은 프로그램의 크기를 고려해서 메모리를 할당하고 이를 기술적으로 관리할 수 있는 기법을 필요로 한다.
-
이미 메모리에 존재했던 프로그램이 종료될 경우 중간에 빈 공간이 발생하게 되며, 이 공간이 새롭게 시작되는 프로그램의 크기보다 작을 경우 외부조각이 발생할 가능성이 있다.
-
가변 분할 방식에서 주요하게 다루는 쟁점중 하나는 주소공간의 크기가 n인 프로세스를 메모리에 올릴 때 물리적 메모리 내 가용 공간 중 어떤 위치에 올릴 것인지 결정하는 문제이다. 이를 동적 메모리 할당 문제(dynamic storage-allocation problem)라고도 부른다. 동적 메모리 할당 문제를 해결하는 대표적인 방법으로 세 가지가 있다.
- 최초적합(firt-fit) : 크기가 n 이상인 가용 공간 중 가장 먼저 찾아지는 곳에 프로세스를 할당하는 방법이다. 가용공간을 모두 탐색하는 방법이 아니므로 시간적인 측면에서 효율적이다.
- 최적적합(best-fit) : 크기가 n 이상인 ‘가장 작은 가용 공간’을 찾아 그곳에 새로운 프로그램을 할당하는 방법이다. 모든 가용 공간을 탐색할 수도 있어 시간적 오버헤드가 발생하고 다수의 매우 작은 가용 공간들이 생성될 수 있다는 단점이 있지만 공간적인 측면에서는 효율적이다.
- 최악적합(worst-fit) : 모든 가용 공간 중에서 ‘가장 크기가 큰’ 곳에 새로운 프로그램을 할당하는 방법이다. 모든 가용 공간을 탐색해야 하는 오버헤드가 발생하며 상대적으로 더 큰 프로그램을 담을 수 있는 가용 공간을 빨리 소진한다는 단점이 있다.
최초적합 방식과 최적적합 방식이 속도와 공간적인 측면에서 효과적이다.
-
가변 분할 방식에서 발생하는 외부 조각을 해결하기 위한 방법으로 컴팩션(compaction)이 있다. 물리적 메모리 중에서 프로세스에 의해 사용 중인 메모리 영역을 한쪽으로 몰고 가용 공간들을 다른 한쪽으로 모아서 하나의 큰 가용 공간을 만드는 방법이다. 현재 수행중인 프로세스의 메모리상의 위치를 상당 부분 이동시켜야 하므로 비용이 많이 든다. 이 방법은 프로세스의 주소가 동적으로 바뀔 수 있는 실행시간 바인딩 방식이 지원되는 환경에서만 수행될 수 있다.
-
- 고정분할 방식(fixed partition allocation)
-
불연속할당 방식
하나의 프로세스가 물리적 메모리의 여러 위치에 분산되어 올라갈 수 있는 메모리 할당 기법을 말한다. 불연속 할당 방식에는 페이징 기법과 세그먼테이션 기법, 페이지드 세그먼테이션 기법 등이 있다.
4. 페이징(paging) 기법
-
프로세스의 주소 공간을 동일한 크기의 페이지 단위로 나누어 물리적 메모리의 서로 다른 위치에 페이지들을 저장하는 방식을 말한다.
-
물리적 메모리 역시 페이지와 동일한 크기의 ‘프레임(frame)’으로 미리 나누어 둔다. 이는 메모리에 올리는 단위가 동일한 크기의 페이지 단위이므로, 메모리를 같은 크기로 분할해두더라도 빈 프레임이 있으면 어떤 위치이든 사용될 수 있기 때문이다. 따라서 페이징 기법은 앞서 연속할당에서 발생했던 동적 메모리 할당 문제가 발생하지 않는다는 장점을 가진다.
-
페이징 기법에서는 모든 프로세스가 각각의 주소 변환을 위한 페이지 테이블(page table)을 가지며, 이 테이블은 프로세스가 가질 수 있는 페이지의 개수만큼 주소 변환 엔트리를 가지고 있게 된다.
-
프로그램의 크기가 항상 페이지 크기의 배수가 된다는 보장이 없기 때문에 프로세스의 주소 공간 중 제일 마지막에 위치한 페이지에서는 내부조각이 발생할 가능성이 있다.
- 주소 변환 기법
-
CPU가 사용하는 논리적 주소를 페이지 번호와 페이지 오프셋으로 나누어 주소 변환(address translation)에 사용한다.
-
페이지 번호는 페이지 테이블 접근시 인덱스(index)로 사용되고, 해당 인덱스의 항목(entry)에는 그 페이지의 물리적 메모리상의 기준 주소(base address), 즉 시작 위치가 저장된다.
-
따라서 특정 프로세스의 p번째 페이지가 위치한 물리적 메모리의 시작 위치를 알고 싶다면 해당 프로세스의 페이지 테이블에서 p번째 항목을 찾아보면 된다.
-
페이지 오프셋은 하나의 페이지 내에서 변위(displacement)를 알려준다. 기준 주소값에 변위(=오프셋)을 더함으로써 요청된 논리적 주소에 대응하는 물리적 주소를 비로소 얻을 수 있다.
-
- 페이지 테이블의 구현
-
페이지 테이블은 페이징 기법에서 주소 변환을 하기 위한 자료구조로, 물리적 메모리에 위치하게 된다.
-
CPU는 현재 실행중인 프로세스의 페이지 테이블에 접근하기 위해 메모리 상에서 페이지 테이블의 시작 위치를 가리키는 페이지 테이블 기준 레지스터(page-table base register)와 페이지 테이블의 크기를 가리키는 페이지 테이블 길이 레지스터(page-table length register)를 사용한다.
-
페이징 기법에서의 메모리 접근 연산은 주소 변환을 위한 페이지 테이블 접근과, 변환된 주소에서 실제 데이터에 접근하는 것, 이렇게 두번의 메모리 접근해야 하므로 오버헤드가 뒤따른다.
-
TLB(Translation Look-aside Buffer)
페이지 테이블 접근 오버헤드를 줄이고 메모리의 접근 속도 향상을 위해 사용되는 고속의 주소 변환용 하드웨어 캐시이다.-
빈번이 참조되는 페이지에 대한 주소 변환 정보만을 담는다.
-
요청된 페이지 번호가 TLB에 존재하면 곧바로 대응하는 물리적 메모리의 프레임 번호를 얻을 수 있지만, 그렇지 않으면 메인 메모리에 있는 페이지 테이블로 부터 프레임 번호를 알아내야 한다.
-
문맥교환 시 이전 프로세스의 주소 변환 정보를 담고 있는 TLB 내용은 모두 지워버려야 한다.
-
주소 변환을 위해서는 해당 페이지에 대한 주소 변환 정보가 TLB에 있는지 확인하기 위해 TLB의 모든 항목(entry)을 다 찾아봐야 하는 오버헤드가 발생한다.
-
오버헤드를 줄이기 위해 일반적으로 병렬 탐색(parallel search)이 가능한 연관 레지스터(associative register)를 사용한다. 그러면 모든 항목을 동시에 탐색하여 주소 변환 정보가 TLB에 있는지 곧바로 확인할 수 있게 된다.
-
-
- 계층적 페이징
-
대부분의 프로그램은 4GB의 주소 공간 중 지극히 일부분만을 사용하므로 페이지 테이블을 위한 메모리의 사용은 심각한 공간 낭비라고 할 수 있다. 따라서 2단계 페이징(two-level paging) 기법을 사용한다.
-
2단계 페이징 기법에서는 주소 변환을 위해 외부 페이지 테이블(outer page table)과 내부 페이지 테이블(inner page table)의 두 단계에 걸친 페이지 테이블을 사용한다.
-
사용되지 않는 주소 공간에 대해서는 외부 페이지 테이블의 항목을 NULL로 설정하며, 여기에 대응하는 내부 페이지 테이블을 생성하지 않는다.
-
공간적인 이득을 얻을 수 있지만 주소 변환을 위해 접근해야 하는 페이지 테이블의 수가 증가하므로 시간적인 손해가 뒤따른다.
-
프로세스의 논리적 주소를 두 종류의 페이지 번호(P1, P2)와 페이지 오프셋으로 구분한다.
-
외부 페이지 테이블로 부터 P1만큼 떨어진 위치에서 내부페이지 테이블의 주소를 얻게 된다. 다음으로 내부 페이지 테이블로 부터 P2만큼 떨어진 위치에서 요청된 페이지가 존재하는 프레임의 위치를 얻게 된다. 마지막으로 해당 프레임으로부터 오프셋 만큼 떨어진 곳에서 원하는 정보에 접근할 수 있게된다.
-
2단계를 넘는 다단계 페이지 테이블을 사용하면 메모리 공간의 소모는 줄일 수 있지만 메모리 접근시간이 크게 늘어난다. 이를 줄이기 위해 TLB를 사용하는 것이 효과적이다.
-
-
역페이지 테이블(inverted page table)
-
페이지 테이블로 인한 메모리 공간의 낭비가 심한 이유는 모든 프로세스의 모든 페이지에 대해 페이지 테이블 항목을 다 구성해야 하기 때문이다. 이를 위한 해결 대안으로 역페이지 테이블 기법이 사용될 수 있다.
-
역페이지 테이블 기법은 물리적 메모리의 페이지 프레임 하나당 페이지 테이블에 하나씩의 항목을 두는 방식이다. 즉 논리적 주소에 대해 페이지 테이블을 만드는 것이 아니라, 물리적 주소에 대해 페이지 테이블을 만드는 것이다.
-
각 프로세스마다 페이지 테이블을 두지 않고, 시스템 전체(system-wide)에 페이지 테이블을 하나만 두는 방법이다.
-
역페이지 테이블의 각 항목은 어느 프로세스의 어느 페이지가 이 프레임에 저장되었는지의 정보를 보관하고 있다.
-
역페이지 테이블의 각 항목은 프로세스 번호(pid)와 프로세스 내의 논리적 페이지 번호(p), 페이지 오프셋으로 구성되어 있다.
-
역페이지 테이블에 주소 변환 요청이 들어오면, 그 주소를 담은 페이지가 물리적 메모리에 존재하는지 여부를 판단하기 위해 페이지 테이블 전체를 탐색해야하는 어려움이 있다. 이때문에 메모리를 유지하는 대신 연관 레지스터에 보관해 테이블 전체 항목에 대한 병렬탐색을 가능하게 함으로써 시간적 효율성을 꾀한다.
-
- 공유 페이지
-
공유 코드(shared code) : 메모리 공간의 효율적인 사용을 위해 여러 프로세스에 의해 공통으로 사용될 수 있도록 작성된 코드를 말한다. 공유 코드는 재진입 가능 코드(re-entrant code) 또는 순수 코드 (pure code) 라고도 불리며 읽기전용(read-only)의 특성을 가지고 있다.
-
공유 페이지란 공유 코드를 담고 있는 페이지이다. 여러 프로세스에 의해 하나만 적재되어 메모리를 좀 더 효율적으로 사용할 수 있게 한다.
-
공유 페이지는 그 페이지를 공유하는 모든 프로세스의 주소 공간에서 동일한 페이지 번호(위치)를 가져야한다.
-
사유 페이지(private page)는 프로세스들이 공유하지 않고 프로세스 별로 독자적으로 사용하는 페이지를 말한다. 논리적 주소 공간 중 어떠한 위치에 있어도 상관없다.
-
-
메모리 보호 페이지 테이블의 각 항목에는 주소 변환 정보뿐 아니라 메모리 보호를 위한 ‘보호비트’ 와 유효-무효 비트를 두고 있다.
- 보호비트(protection bit) 각페이지에 대한 접근 권한의 내용을 담고 있다. 각 페이지에 대해 읽기-쓰기/읽기 전용 등의 접근 권한을 설정하는 데에 사용된다.
- 유효-무효 비트(valid-invalid bit)
해당 페이지의 내용이 유효한지에 대한 내용을 담고 있다.
- 유효 : 해당 메모리 프레임에 그 페이지가 존재함을 뜻하며, 따라서 접근이 허용된다.
- 무효 : 프로세스가 그 주소 부분을 사용하지 않거나, 해당 페이지가 물리적 메모리에 올라와 있지 않고 백킹스토어에 존재해 해당 메모리 프레임에 요효한 접근 권한이 없다는 의미를 가진다.
5. 세그먼테이션(segmentation)
-
하나의 프로세스를 구성하는 주소 공간은 일반적으로 코드, 데이터, 스택 등의 의미 있는 단위들로 구성된다. 세그먼트는 이와 같이 주소 공간을 기능 단위 또는 의미 단위로 나눈 것을 뜻한다.
-
프로세스의 주소 공간 전체를 크게는 하나의 세그먼트로 볼 수도 있으며, 일반적으로는 코드, 데이터, 스택 등의 기능 단위로 세그먼트를 정의한다.
-
특정 크기 단위로 나눈 것이 아니라 의미를 가질 수 있는 논리적인 단위(logical unit)로 나눈 것이기 때문에 크기가 균일하지 않다.
-
페이징 기법과는 다르게 프로그램을 의미 단위의 세그먼트로 나누어 관리하므로, 크기가 균일하지 않은 세그먼트들을 메모리에 적재하는 부가적인 오버헤드가 뒤따르게 된다.
-
논리적 주소가 세그먼트 번호와 오프셋으로 나뉘어 사용된다. 세그먼트 번호는 해당 논리적 주소가 프로세스 주소 공간 내에서 몇 번째 세그먼트에 속하는지를 나타내고, 오프셋은 그 세그먼트 내에서 얼마만큼 떨어져 있는지에 대한 정보를 나타낸다.
-
주소 변환을 위해 세그먼트 테이블을 사용한다. 세그먼트 테이블의 각 항목을 기준점(base)와 한계점(limit)을 가지고 있다. 이는 세그먼트의 길이가 균일하지 않으므로 위치 정보뿐 아니라 길이 정보도 함께 보관하고 있는 것이다.
-
세그먼트 테이블 기준 레지스터(Segment-Table Base Register: STBR,)와 세그먼트 테이블 길이 레지스터(Segment-Table Base Register: STLR, 세그먼트의 개수)을 가지고 메모리상에서 세그먼트 테이블의 위치를 알 수 있다.
-
요청된 세그먼트 번호가 STRL에 저장된 값보다 작은 값인지와 논리적 주소의 오프셋 값이 그 세그먼트의 길이보다 작은지에 대한 사항을 먼저 확인한다. 그렇지 않다면 해당 메모리 위치에 대한 접근을 봉쇄한다.
-
페이징 기법과 마찬가지로 보호비트와 유효비트를 둔다.
-
여러 프로세스가 특정 세그먼트를 공유해 사용하는 공유 세그먼트(shared segment) 개념을 지원한다. 공유 세그먼트는 이 세그먼트를 공유하는 모든 프로세스의 주소 공간에서 동일한 논리적 주소에 위치해야 한다.
-
페이징 기법에서는 동일한 크기로 주소 공간을 나누다 보면 공유하려는 코드와 사유 데이터 영역이 동일 페이지에 공존하는 경우가 발생할 수 있다. 세그먼테이션 기법에서는 이러한 현상이 발생하지 않으므로 공유나 보안처럼 의미 있는 단위에 대해 수행하는 업무에서는 페이징 기법보다 세그먼테이션 기법이 장점을 가진다.
-
물리적 메모리 관리에서 외부조각 발생에 대한 방안 : 세그먼트를 가용공간에 할당하는 방식에는 해당 세그먼트 크기보다 크거나 같은 첫번째 가용공간에 할당하는 최초적합 방식(first fit)과 최적적합(best fit)방식이 있다.
6.페이지드 세그먼테이션(paged segmentation)
-
페이징 기법과 세그먼트이션 기법의 장점만을 취하는 주소 변환 기법이다.
-
세그먼테이션 기법과 마찬가지로 프로그램을 의미 단위의 세그먼트로 나눈다. 단 세그먼트는 임의의 길이를 가지지 않고 동일한 크기 페이지들의 집합으로 구성된다.
-
물리적 메모리에 적재하는 단위도 페이지 단위로 한다.
-
즉, 하나의 세그먼트 크기를 페이지 크기의 배수가 되도록 함으로써 세그먼테이션 기법에서의 외부조각 문제점을 해결한다.
-
주소 변환을 위해 외부 세그먼트 테이블과 내부 페이지 테이블을 이용한다. (2단계 페이지 테이블과 유사한 구조이다.)
-
하나의 세그먼트가 여러 개의 페이지로 구성되므로 각 세그먼트마다 페이지 테이블을 가지게 된다.
-
과정은 다음과 같다.
- 세그먼트 번호와 오프셋으로 구성된 논리적 주소에서 세그먼트 번호로 세그먼트 테이블의 해당 항목에 접근한다. 항목에는 세그먼트의 길이와 페이지 테이블의 시작 주소가 있다.
- 세그먼트의 길이와 논리적 주소의 하위 비트인 오프셋 값을 비교한다. 유효하지 않다면 트랩을 발생시킨다.
- 유효할 경우 이 오프셋 값을 상위 비트와 하위비트로 나누어 상위 비트는 페이지 번호로, 하위비트는 페이지 내에서의 오프셋값(변위)로 사용한다.
- 페이지 테이블의 시작 주소(위치)에서 오프셋값 만큼 떨어진(인덱스 역할) 페이지 항목에서 물리적 주소의 페이지 프레임 주소를 얻는다.
- 이 페이지 프레임내에서 오프셋의 하위 비트인 오프셋값(변위)만큼 떨어진 곳이 원하는 물리적 메모리 주소가 된다.
Leave a comment