본문 바로가기
운영체제

[운영체제] KOCW 8 - Ch8: Memory Management

by Lizardee 2023. 6. 9.
Logical vs. Physical Address

▶ Logical address

  • 각 프로세스마다 독립적으로 가지는 주소공간
  • 각 프로세스마다 0번지부터 시작
  • CPU가 보는 주소: logical address

▶ Physical address

  • 메모리에 실제 올라가는 위치

※ 주소 바인딩: 논리적 주소 --> 물리적 주소로의 주소 변환

  • Symbolic address --> Logical address --> Physical address\

 

 

주소 바인딩(Address Binding)

주소 바인딩(Address Binding)

▶ Compile time binding

  • 물리적 메모리 주소(physical address)가 컴파일 시 알려짐
  • 시작위치 변경 시 재컴파일
  • 컴파일러: 절대코드(absolute code)

Load time binding

  • Lodader의 책임 하에 물리적 메모리 주소 부여: 실행파일이 시작되는 시점에서 물리적 메모리 주소 부여 --> 물리적 메모리 주소는 바뀌지x
  • 컴파일러: 재배치가능코드(relocatable code)

Execution time binding(= Run time binding)

  • 실행파일이 시작되는 시점에서 물리적 메모리 주소 부여 --> 수행이 시작된 이후에도 프로세스의 메모리 상 위치(물리적 주소) 바뀔 수o
  • CPU가 주소를 참조할 때마다 binding 점검(address mapping table) <-- 실행중에도 물리적 주소가 변경될 수 있기 때문
  • 하드웨어적 지원: MME -- 주소 변환하는 하드웨어
MMU(Memory-Management Unit)

: logical address를 physical address로 매핑해주는 hardware device

--> user program: logical address만을 다루며, 실제 physical address는 알 필요가 없다.

 

Dynamic Relocation

Dynamic Relocation

  • Limit register: 논리적 주소의 범위 --> logical address > physical address 이면, trap
  • Relocation register: 접근할 수 있는 물리적 메모리 주소의 최소값 --> 시작 주소

 


Some Technologies
Dynamic Loading

: 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라, 해당 루틴이 불려질 때 메모리에 load하는 것

--> memory utilization 향상

  • 가끔씩 사용되는 많은 양의 코드의 경우 유용하다. 예) 오류 처리 루틴
  • 운영체제의 특별한 지원 없이 프로그램 자체에서 구현 가능하다.

 

Dynamic Linking

▶ Static linking (Static library)

: 라이브러리가 프로그램의 실행파일 코드에 포함된다.

  • 실행파일의 크기가 커진다: 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로, 메모리가 낭비된다. 예) printf 함수의 라이브러리 코드

▶ Dynamic linking (Dynamic library)

: 라이브러리가 실행파일에 포함되지 않고 별도로 존재 --> 라이브러리 함수 실행 시 연결(link)된다.

  • stub: 라이브러리 루틴의 위치정보 코드

 

Overlays

: 메모리에 프로세스의 부분 중, 실제 필요한 정보만을 올리는 것

  • 프로세스의 크기가 메모리보다 클 때 유용하다.
  • 운영체제의 지원 없이, 사용자(프로그래머)에 의해 구현된다. <--> Dynamic Loading: 운영체제의 지원 없이, 프로그램 자체에서 구현 가능하다.

Q. Dynamic Loading vs. Overlays 차이점은 무엇인가요?

Dynamic loading과 Overlay 모두, 메모리에 프로세스 전체를 올리지 않고, 실제 필요한 정보만을 올리는 것이라는 것은 이해가 되었습니다. 그런데 그렇다면, 이 두 방법의 차이가 무엇인지 궁금합니다.

Dynamic loading은 운영체제의 특별한 지원 없이 "프로그램 자체"에서 구현이 가능하고, Overlay는 "사용자"에 의해 구현이 가능하다고 나와있는데, "사용자"는 코드를 짜는 것이라는 것이라고 이해했는데, "프로그램 자체"라는 것이 무슨 뜻인지 잘 이해가 되지 않습니다...

 

A. Overlay 는 일반 사용자가 필요한 코드나 데이터를 직접 저장하고 호출하여 사용하는 것입니다. 운영체제의 도움을 전혀 받지 않습니다. Overlay에서 코드 로딩 기능은 사실상 사용하지 않는다고 보셔도 됩니다.


Swapping

Swapping

: 프로세스를 일시적으로 메모리에서 backing store로 쫓아내는 것

  • backing store(= swap are): 디스크

▷ Swap in / Swap out

  • 중기 스케줄러(swapper)에 의해 swap out시킬 프로세스 선정한다.
  • priority-based CPU scheduling algorithm: 메모리 <--> 디스크
  • Compile time binding, Load time binding에서는 원래 메모리 위치로 swap in해야 한다.
  • Execution time binding(Run time binding)에서는 추후 빈 메모리 영역 아무 곳에나 올릴 수 있다.
  • swap time은 대부분 transfer time이다.

 


Allocation of Physical Memory

※ 사용자 프로세스 영역의 할당 방법

  • Contiguous allocation(연속 할당): 각각의 프로세스가 메모리의 연속적인 공간에 적재되도록 하는 것(프로그램이 쪼개지지 않는다.)
  • Noncontiguous allocation(불연속 할당): 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라갈 수 있다.

 

Contiguous allocation(연속 할당)

Contiguous allocation(연속 할당) 방식

▶ 고정분할(fixed partition) 방식 --> 외부조각, 내부조각

가변분할(variable partition) 방식 --> 외부조각

  • 외부조각(external fragmentation): 프로그램의 크기보다 분할의 크기가 작은 경우 --> 아무 프로그램에도 배정되지 않은 빈 공간임에도 프로그램이 올라갈 수 없는 작은 공간
  • 내부조각(internal fragmentation): 프로그램의 크기보다 분할의 크기가 큰 경우 --> 특정 프로그램에 배정되었지만 사용되지 않는 공간

Q. 가변분할 방식에서는 내부조각이 생기지 않나요? (+ 내부조각 vs. 외부조각)

교재의 이 그림에서는 가변분할방식에서는 내부조각이 나타나지 않는 것처럼 나와있는데, "적절한 hole을 찾는 문제"를 보니, 가변분할방식에서도 best-fit 방식 또는 worst-fit 방식을 이용하면, 내부조각이 생기는 것 같습니다. 혹시 제가 제대로 이해한 것이 맞는지 궁금합니다...

 

A. 그림에서 보시는 것처럼 발생하는 Hole은 모두 외부 조각으로 봅니다. 
내부조각의 의미는 일단 분할을 한 후에 그 안에서 쓰지 못하는 Hole 이 생기는 것입니다.


Hole

: 가용 메모리 공간

  • 다양한 크기의 hole들이 메모리 여러 곳에 흩어져 있다: 가용 공간(hole)
  • 프로세스가 도착하면 수용가능한 hole을 할당한다: 할당 공간

 

Dynamic Storage-Allocation Problem

: 새로 들어온 프로그램을 hole들 중 어디에 올릴 것인가?

▶ First-fit

  • size가 n 이상인 것 중 최초로 찾아지는 hole에 할당
  • 장점: 시간적으로 빠르게 할당

▶ Best-fit

  • size가 n 이상인 가장 작은 hole에 할당
  • 장점: 공간적으로 맞춤형 할당
  • 단점: 탐색 오버헤드: hole들의 리스트가 크기순으로 정렬되지 않은 경우, 모든 hole의 리스트를 탐색해야 한다.
  • 단점: 많은 수의 작은 hole들이 생긴다.

▶ Worst-fit

  • 가장 큰 hole에 할당
  • 단점: 탐색 오버헤드
  • 단점: 아주 큰 hole들이 생성된다.

 

Compaction

: 작은 hole들을 모아서, 프로그램이 들어갈 수 있는 큰 hole로 만드는 것 --> 외부조각 문제 해결


Q. compaction --> 외부조각 문제만 해결하나요?

교재를 보니, compaction은 외부조각 문제를 해결하는 한 가지 방법이라고 나와있는데 이 부분이 잘 이해가 되지 않습니다... 저는 compaction은 "작은 hole들을 모아서, 프로그램이 들어갈 수 있는 큰 hole을 만드는 것"이고, 이때 hole에는 내부조각과 외부조각이 모두 포함된다고 생각했습니다.

혹시 hole에는 내부조각은 포함이 되지 않는 것인가요? 그리고 그렇게 때문에 compaction은 내부조각은 해결하지 못하고, 외부조각 문제만을 해결하게 되는 것인가요?

 

A. 내부조각 외부조각 모두 포함해서 해결하는 방법입니다만, 현실적으로 사용되지 않는 방법이라 Compaction은 무시하셔도 됩니다.