버티의 블로그

[운영체제 #12] Main Memory Allocation 본문

OS_NW/운영체제

[운영체제 #12] Main Memory Allocation

ㅤ버티ㅤ 2024. 5. 28. 22:57
728x90

Memory Protection

H/W Protection

 

프로세스가 segment 형태로 들어간게 아닌, 하나의 덩어리로 들어간 환경에서는 Base와 Limit이라는 레지스터로 CPU의 메모리 접근을 컨트롤하고 메모리를 보호할 수 있다.

  • Base : 프로세스가 접근할 수 있는 메모리의 시작 주소를 저장
  • Limit : 프로세스가 접근할 수 있는 메모리의 크기를 저장

오른쪽 그림에서, CPU에 메모리에 접근할 때 base보다 주소값이 크고 base+limit보다 주소값이 작아야 합법적인 주소로 간주하고 접근을 허용한다.


Address Binding

바인딩은 명령어와 데이터에 메모리 주소를 지정해주는 과정인데, 3가지 종류가 있다.

  • Compile time binding : 컴파일을 시작하면서 적재할 메모리 주소를 지정
  • Load time binding : 프로그램을 실행하기 위해 로딩할 때 메모리 상황에 따라 주소를 지정
  • Execution time binding : 바인딩을 실행시간 전까지 지연시키고 이후 진행한다. 이는 프로그램이 실행되는 중에 메모리 주소(위치)를 동적으로 할당할 수 있는 방법이다.

또한 프로그램의 주소가 표현되는 방법도 다음과 같이 나눠진다.

Address Representing

  • Symbolic Address : 소스 코드 내 인간이 이해할 수 있는 변수나 함수 이름을 뜻한다.
  • Relocatable Address : 프로그램이 메모리에 로드될 때, 실제 위치가 정해지기 전까지의 상대적인 주소, load module로부터 시작된다.
  • Absolute Address : 실제 메모리 내의 고정된 위치를 나타내는 주소이다.

마지막으로 프로그램이 실행되는 동안에서 사용되는 주소 개념은 다음과 같다.

  • Logical Address : CPU가 프로그램 실행할 때 생성하는 가상의 주소
  • Physical Address : 실제 메모리에서의 주소
Execution time binding에서는 Logical Address와 Physical Address가 서로 다르지만, Compile time bindingload time binding에서는 동일하다.
  • Logical Address Space : 프로그램에 의해 생성된 모든 logical address의 집합
  • Physical Address Space : 프로그램에 의해 생성된 모든 physical address의 집합, 아래에서 설명할 MMU에 의해 매핑된 주소도 포함

Memory-Management

메모리를 관리하는데 요구되는 사항은 3가지가 있다.

  • Relocation : 프로세스는 메모리 내 어느 위치에나 로드될 수 있어야 하고 주소가 실행 단계에서 physical address로 변환되어야 한다.
  • Protection : 메모리 접근 시마다 검사가 이루어지고 프로세스 허락 없는 다른 프로세스 메모리 접근을 제한해야 한다.
  • Sharing : 여러 프로세스가 동일한 메모리 부분을 공유할 수 있어야 하고 동일한 프로그램 복사본에 접근해야 한다.

Memory-Management Unit

 

MMU는 앞서 말했던 relocationprotection의 역할을 한다. 그래서 CPU는 반드시 메모리 접근 MMU를 통해 접근해야한다. MMU는 CPU의 Logical Address를 Physical Address로 변환하고, baselimit 레지스터로 메모리 접근 권한을 검사하는 역할을 한다.


Dynamic Loading and Linking

Static Loading : load module에 있는 프로그램 전체를 실행 전에 메모리로 적재

Dynamic Loading : 프로그램을 실행하는 도중 필요할 때만 메모리로 적재

  • 루틴호출되기 전까지 로드되지 않고, 사용하지 않을 루틴적재되지 않으므로 효율적인 메모리 관리가 가능하다.

Static Linking : 컴파일 시 모든 라이브러리와 모듈을 링크하여 실행 파일을 만드는 방식

Dynamic Linking : 프로그램을 실행하는 도중 필요한 라이브러리를 동적으로 링크하는 방식

  • stub필요한 라이브러리의 루틴의 위치를 찾는다. 그럼 stub은 자신의 주소를 루틴의 주소로 대체하고 해당 루틴을 실행한다.

Contiguous Allocation

1) Single-partition allocation

프로세스가 마치 하나의 덩어리로 들어가는 것으로,  메모리가 단 두 부분으로만 나뉘어 각각 OS와 프로세스가 상주하는 형태이다.

 

2) Multiple-partition allocation

메모리가 여러 파티션으로 나뉘어 각 파티션에 여러 사용자의 프로세스가 할당되는 형태이다. 

Multiple-partition allocation concept

  • 주어진 프로세스 상황에 맞게 동적으로 크기를 조정한다.
  • Hole : 사용 가능한 메모리 블록으로, 다양한 크기의 홀이 존재한다.
  • 이 홀에 크기 n의 프로세스를 어떻게 할당시킬 것인지에 대한 3가지 알고리즘이 존재한다.
    • First-Fit : 첫번째 홀을 할당
    • Best-Fit : 크기가 딱 맞는 홀을 할당 (즉, n보다 큰 홀중에 가장 작은 홀에 할당)
    • Worst-Fit : 크기가 자장 큰 홀을 할당
    • 보통은 First-Fit과 Best-Fit이 속도와 공간 활용 면에서 더 우수하다.

이렇게 홀을 할당하면 2가지 단편화 문제를 맞딱드릴 수 있다.

  • 내부 단편화 : 프로세스가 필요한 양보다 더 많은 메모리를 할당해서 메모리가 낭비되는 상황
  • 외부 단편화 : 총 사용 가능한 메모리로 보면 할당 가능하지만 연속적이지 않아 할당되지 못하는 상황
  • 중간중간 흩어져있는 홀들을 모으기 위해 메모리 내부를 이동해서 외부 단편화를 해결할 수 있는데, 이를 Compaction이라 한다.