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 OR translation 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