본문 바로가기

STUDY/운영체제

memory management strategies

memory management strategies

: 운영체제에서 제한된 메모리의 효율적인 사용과 참조방식을 구사하기 위한 전략

 

운영체제의 주요 기능 중 하나인 memory management는 3가지 목적이 있다.

memory management goals

1. convenient abstraction for programming

: 프로그래밍 시 쉽게 메모리를 사용

2. maximize perfomance with minimal overhead

: 제한적인 memory 용량을 효율적으로 관리할 수 있도록 resource를 분배하고 오버헤드를 줄여서 성능을 최대화

3. provide isolation between process

: process들 간의 독립적인 메모리 사용 보장

 

운영체제는 이러한 memory management를 어떻게 수행하는지 알아보자


Binding instructions and data to memory

프로세스를 수행하기 위해서는 명령어와 데이터가 메모리 위에 올라가서 수행되어야 한다.

이때 이 데이터 주소가 바인딩 되는 시점이 3가지이다. 즉 메모리에 할당되는 시점이 3가지라는 뜻이다.

 

1. compile time

: 컴파일 시에 메모리 주소가 결정된다.

memory location이 미리 알려져있는 경우 absolute code가 생성된다. 따라서 시작하는 location이 달라진다면 당연하게도 컴파일을 다시 해야 한다.

 

2. load time

: load시에 메모리 주소가 결정된다.

load time은 storage에서 RAM 즉, 메인 메모리로 데이터가 올려지는 시간을 말한다. 한마디로 메모리에 프로그램을 올리는 작업을 말한다. 실행파일을 실행하면 다 로드하게 되는데 이때의 로드가 이 의미이다.

이때는 relocatable code가 생성된다. compile time에 주소를 모르기 때문이다.

 

3. execution time

: 프로그램을 실행할 때 메모리 주소가 결정된다.

 

 

이러한 메모리 주소 할당을 그림으로 알아보자

Binding of Memory Address

1. compile time (지정된 곳에)

: 컴파일 시에 저장되는 주소를 실행할 때에도 똑같이 사용한다,

compile도 쉽고 load, 실행 모두 다 오버헤드가 작다.

하지만 메모리 주소를 항상 그 프로그램이 사용할 수 있도록 지정해야한다. 따라서 멀티 프로그래밍에서는 효율이 떨어진다.

왜냐하면 한 프로그램이 차지하는 메모리 주소가 동일해야하기 때문에 지정된 곳에만 올릴 수 있기 때문이다.

따라서 사용하지 않는다.

 

2. load time (동적으로 바꿈)

: 유연하게 동적으로 데이터의 메모리 주소를 바꾸면서 저장한다.

즉 compile time에 저장된 주소가 실제 메모리 공간에서의 주소와는 다르게 저장된다.

시작 주소에서 offset만큼 계산해서 저장하는 방식이다.

compile이 쉽지만 load시에 시작주소를 다 확인해야 하기 때문에, offset을 더하는 과정을 거치고 load하기 때문에 오버헤드가 크다.

프로그램이 크면 클수록 오버헤드도 큰 구조이므로 시간이 오래 걸린다.

따라서 사용하지 않는다!

 

3. execution time (실행할 때 더함)

: 메모리에 로드할 때에도 compile시 저장했던 주소와 동일하게 저장하고, 실행할 때 시작주소에서 더해서 저장한다.

메모리에 로드할 때에도 똑같이 저장한다. 즉 compile에서 메모리에 Load할 시 주소를 변경하지 않는다.

실행시간에 cpu의 MMU라는 하드웨어의 도움을 받아 더해준다.

따라서 compile과 Load시에도 주소값이 변경되지 않기 때문에 오버헤드가 작고, 실행시간에도 cpu의 도움을 받아 더해주기 때문에 덧셈 연산도 오버헤드가 작다. 따라서 모든 과정에서 오버헤드가 작기 때문에 이 방법을 사용한다.

 

이러한 memory management에도 몇가지 issue들이 존재한다. 예를 들면 multiple process 지원이나 context switching 같은 문제들이 있다. 이러한 문제를 해결하기 위해서 나온 기법이 virtual memory management이다.

가상 메모리는 다음 장에서 자세하게...

 

어쨌든 다시 돌아와서

memory management에서 핵심은 메모리를 어떻게 효율적으로 사용하느냐 이다. 따라서 메모리에 데이터를 올릴 때 어떻게 최대한 남는 공간 없이 활용할 수 있을까? 가 핵심 이슈이다.

메모리를 배치하는 방법에 따라 4가지 방식이 존재한다.


memory management methods

1. contiguous allocation

2. paging

3. segmentation

4. hybrid - paging+segmentation

 

 

1. contiguous allocation

: memory를 아래에서부터 연속적으로 배치한다.

relocation register(mmu) 에 가장 낮은 physical address가 저장되어있어서 거기서부터 배치하면 된다.

즉 process간의 메모리 영역을 침범하지 않도록 보호하기 위한 기법인 것이다.

 

limit register

: logical address의 범위이다. (logical < limit)이 성립해야 배치할 수 있다. 이 또한 memory protection의 기법이다.

 

 

그러나 이렇게 연속적으로 배치하는 것은 효율이 좋지 못하다. 예를 들어 다음과 같은 상황에 process 6을 배치한다고 하자.

이 경우 process4가 종료되어 free partition(=hole)이 두 군데나 생겼지만 모두 process 6보다 크기가 작아 배치가 불가능한 상황이 생긴다. 이를 외부 단편화라고 하는데 하여튼 이러한 경우가 생기기 쉽다.

 

따라서 연속적으로 배치하지 않는 방법을 사용한다.

 

Multiple-partition allocation

: 여러 partition으로 구분하여 배치한다.

이 경우 세가지 배치 방법이 있다.

1. First-Fit

: 가장 첫번째 free partition에 배치한다.

 

2. Best-Fit

: 배치 후 남는 공간이 제일 작은 free partition에 배치한다.

 

3. Worst-Fit

: 가장 크기가 큰 free partition에 배치한다.

 

당연히 first와 best가 storage utilization, speed 관점에서 가장 적합하다.

하지만 이런식의 배치는 두가지 측면에서 문제점이 있다. 이러한 문제점을 Fragmentation, 즉 단편화라고 한다.

 

 

Fragmentation

1. External Fragmentation, 외부 단편화

: total memory는 충분함에도 불구하고 연속되지 않아 Process를 allocate 할 수 없는 상황

 

2. Internal Fragmentation, 내부 단편화

: 필요한 메모리, 즉 process size 보다 allocated memory가 더 커서 그 차이만큼 공간이 낭비되는 상황

이러한 단편화 문제를 해결하기 위한 해결책들이 여럿 제시되었다.

 


2. Paging

: physical address space에 프로세스를 page 단위불연속적으로 저장하여 external fragmentation 문제 해결

 

이때 여기서 말하는 page 단위라는 것은, logical memory를 same size block으로 자른 것을 말한다.

이와 동시에 physical memory를 same size block으로 자른 것은 frame이라고 하며 page와 frame의 size는 같다.

 이렇게 process를 메모리에 불연속적으로 저장하기 때문에, 실행 또한 page 단위로 실행하게 된다.

즉 n개의 page를 갖는 프로그램은 n개의 free frame을 갖는 memory가 필요하다.

 

그렇다면 메모리가 불연속적이기 때문에 어떤 page가 어느 위치에 있는지 어떻게 알 수 있을까? 즉, logical address 에서 physical address 로의 변환은 어떻게 이루어질까?

바로 page table이 변환해준다.

 

page table은 특정 page가 어느 frame으로 mapping 되었는지 확인해주며, process 마다 하나씩 존재한다. (memory 당 하나 아님)

이 page table은 os가 관리해준다.

 

Address Translation Architecture

이러한 paging은 memory protection을 제공해준다.

프로그램은 page table에 의해 관리되므로 자신에게 주어진 logical address space를 벗어나지 않기 때문이다.

 

따라서 이를 적용해보면 다음과 같은 방법으로 변환되는 것이다.

메모리에 할당되기 전과 후를 그림으로 비교해가며 살펴보자.

왼쪽과 같이 process가 가진 page를 free frame의 정보를 모아둔 리스트와 연결하여 이전 그림과 같이 변환을 하여 page table을 구성한다.

그 후 page table에 맞게 page들을 frame에 할당시킨다.

그렇기 때문에 page와 frame의 사이즈는 같을 수 밖에 없는 것이다.

 

그렇다면 paging 기법에서 가장 중요한 것은 Page table 이라는 것인데,

page table의 구현은 어떻게 이루어질까?

 

다음 포스트에서 계속..

'STUDY > 운영체제' 카테고리의 다른 글

Virtual Memory Management  (0) 2022.03.03
memory management strategies2: page table의 구현  (0) 2022.02.16
deadlocks  (0) 2022.01.02
synchronization 2  (0) 2021.12.17
synchronization  (0) 2021.12.02