본문 바로가기
2023-1/운영체제

Memory Management and Virtual Memory

by 철없는민물장어 2023. 5. 6.
728x90
반응형

운영체제의 메모리 관리와 가상 메모리는 컴퓨터 시스템의 메모리 자원을 효율적으로 사용하기 위한 핵심 기능이다.

Memory Management: 프로세스가 실행되기 위한 메모리를 할당하고 회수하는 것을 담당한다.

Virtual Memory: 물리적인 메모리 용량을 초과하는 프로세스의 실행을 가능하게 하는 기술

 

베이스 레지스터와 리미트 레지스터 쌍으로, 프로세스의 논리적 주소 공간이 정의된다.

 

Binding of Instructions and Data to Memory

바인딩: 프로세스가 메모리에서 실행되기 위해, 명령어와 데이터가 메모리 주소와 연결되는 과정

 

이러한 바인딩은 크게 세 가지 단계에서 발생할 수 있다.

  1. 컴파일 타임 바인딩(Compile time Binding)
  2. 로드 타임 바인딩(Load time Binding)
  3. 실행 타임 바인딩(Execution time Binding)

1. 컴파일 타임 바인딩

: 소스 코드가 컴파일될 때 메모리 주소가 할당되는 방식이다.

이 경우, 컴파일러는 명령어와 데이터에 고정된 메모리 주소를 할당하며, 프로그램이 실행될 때 해당 주소에서 실행된다.

컴파일 타임 바인딩의 경우, 메모리 주소가 컴파일 시점에 결정되기 때문에 실행 시간에 추가적인 메모리 관리 작업이 필요하지 않다.

 

그러나 이 방식은 메모리 주소의 변경이 어렵고 유연성이 떨어진다.

메모리 주소가 컴파일 할 때 결정된 이후, 변경되지 않기 때문에 정적인 바인딩이라고도 한다.(절대코드가 생성됨)

간단하지만, 동시에 같은 절대주소를 가지는 2개의 프로그램을 실행할 수 없다.

 

very machine dependent - 프로그램이 하드웨어에 영향을 많이 받는다. 컴파일된 프로그램을 다른 하드웨어나 시스템에서 실행하면, 메모리 주소가 일치하지 않아 오류가 발생할 수 있다. (메모리 20억번지에 저장하기로 했는데, 메모리가 1GB면 20억번지가 없을 수..)

 

2. 로드 타임 바인딩

: 프로그램이 메모리에 로드되는 시점에 명령어와 데이터의 메모리 주소가 결정되는 바인딩 방식.

실행 전에 메모리 주소를 할당하지만, 실행 도중에는 변경하지 않는다.

 

메모리 주소 결정: 프로그램이 메모리에 로드되는 시점에 로더(loader)가 명령어와 데이터에 메모리 주소를 할당한다.

상대 주소 사용: 컴파일러가 생성한 명령어와 데이터는 상대 주소를 사용한다.

재배치 가능: 실행할 때마다 프로그램이 메모리의 다른 위치에 로드될 수 있다.

기계 독립적: 상대 주소를 사용하기 때문에, 프로그램이 특정 하드웨어에 종속되지 않음.

 

로드된 후 프로그램이 종료될 때까지 메모리 주소는 더이상 변경되지 않는다.

메모리 부족으로 swap되더라도 다시 실행될때 원래 있던 메모리번지로 이동해야 함.

 

3. 실행 타임 바인딩

프로그램이 실제로 실행되는 동안에 명령어와 데이터의 메모리 주소가 결정되는 방식.

(처음에도 동적으로 바인딩하고, 메모리 swap out- in 할때도, OS에 의해 실행 중 위치를 바꾸는 것도 가능)

이 방식은 주로 가상 메모리 시스템에서 사용되며, 높은 유연성과 메모리 활용 효율을 제공하지만, 메모리 관리에 추가적인 오버헤드가 발생할 수 있다.

 

메모리 주소 결정: 프로그램이 실행되는 동안, 프로세스는 필요한 메모리 주소를 요청하고 할당받는다. 주소 할당은 memory manager에 의해 수행되며, 주소 변환을 위해 페이지 테이블과 같은 자료구조가 사용된다.

메모리 활용 효율이 높다. 재배치가 가능하다. (프로세스 실행 중에도 메모리 주소를 변경할 수 있다.)

 

MMU(memory management unit)가 사용될 수 있다. 이는 컴퓨터 시스템의 하드웨어로, 가상 메모리와 물리 메모리 사이의 주소 변환을 관리하는 역할을 한다.

 


Logical vs. Physical Address Sapce

논리 주소 공간과 물리 주소 공간은 컴퓨터 메모리에 대한 서로 다른 두 가지 주소 체계이다.

이 두 주소 체계는 주로 가상 메모리 시스템에서 사용된다.

 

논리 주소 공간(Logical address space)

: 프로세스가 사용하는 가상 주소의 집합이다.

프로세스는 이 주소 공간 내에서 메모리에 접근하며, 프로세스마다 각각 고유한 논리 주소 공간이 있다.

이를 통해 프로세스는 서로 격리된 메모리 환경에서 실행되어 시스템 안정성이 유지된다.

논리 주소는 실행 타임 바인딩에서 사용되며, 주소 변환을 통해 물리 주소로 매핑된다.

 

물리 주소 공간(Physical address space)

: 물리 주소 공간은 실제 메모리에 대한 주소의 집합이다.

물리 주소는 실제 메모리 하드웨어에 대한 참조를 나타내며, 시스템의 모든 프로세스가 공유하는 공통 주소 체계이다.

물리 주소 공간은 MMU(Memory Management Unit)에 의해 관리되며, 논리 주소를 물리 주소로 변환하는 과정에서 사용된다.

 

사용자는 논리주소만 알 수 있으며, 물리주소는 알 수 없다. 

MMU를 통해, 논리 주소는 자동으로 물리 주소로 변환된다.


Linking

바인딩은 프로그램의 명령어와 데이터를 메모리 주소에 할당하는 과정이고,

링킹은 여러 개의 컴파일된 코드 조각들을 결합하여 하나의 실행 파일을 생성하는 과정이다.

즉, 링킹은 바인딩 전에 참조들을 처리하고 프로그램 구성 요소를 통합하는 역할을 한다.

 

링킹은 정적 링킹과 동적 링킹 두 가지로 나뉜다.

Dynamic Linking 동적 링킹

동적 링킹은 실행 중인 프로그램이 외부 라이브러리나 모듈을 연결하고 사용하는 방식이다.

프로그램이 실행되는 동안 필요한 라이브러리가 로드되며, 실행 파일에 포함되지 않는다

실행 파일에 라이브러리가 직접 포함되지 않기 때문에, 실행 파일의 크기가 상대적으로 작아진다. 이로 인해 디스크 공간이 절약된다. 그러나, 라이브러리를 찾고 로드하는 과정이 추가되므로 특정 함수를 call하는 것이 느려질 수 있다. 또한, 시스템에 없거나 호환되지 않는 버전의 라이브러리가 있는 경우 프로그램 실행에 문제가 발생할 수 있다.

 

 

Static Linking 정적 링킹

프로그램의 컴파일 및 링크 과정에서 필요한 외부 라이브러리나 모듈을 실행 파일에 직접 포함시키는 방법이다. 이 방식은 프로그램의 실행 파일에 모든 필요한 코드와 데이터를 묶어 하나의 독립적인 파일을 생성한다.

 

정적 링킹은 실행 파일의 크기가 커지는 단점이 있지만, 실행 시간에 추가적인 라이브러리 로드 과정이 없어 함수호출이 빠르다는 장점을 갖는다.

 


Loading

로딩은 실행 파일을 메모리에 올리는 과정을 의미한다. 로딩은 동적 로딩과 정적 로딩을 나뉜다.

 

동적 로딩: 

실행 파일에서 필요한 모듈과 라이브러리를 동적으로 로드하는 방법이다.

실행파일의 크기를 줄일 수 있다. 이 방법은 실행 중에 모듈이나 라이브러리를 로드하기 때문에 초기 실행 시간이 느릴 수 있다. 그러나, 프로그램의 실행 흐름에 따라 필요한 모듈만 로드되기 때문에 메모리 사용량이 감소하고, 불필요한 코드 로드를 방지하여 실행 성능을 향상시킬 수 있다.

 

정적 로딩:

프로그램 실행 시 필요한 모든 모듈과 라이브러리를 실행 파일에 미리 포함시켜 빌드하는 방법이다. 

프로그램 실행 시에는 추가적인 로드 작업이 필요하지 않아, 실행 시간이 빠르지만 실행 파일의 크기가 커질 수 있다.

 

앞서 설명한 링킹과 로딩이 함께 이루어지는데,

유연한 메모리 사용을 위해 Dynamic linking과 Dynamic loading이 함께 사용된다.

 


Swapping

여러 프로그램이 동시에 실행될 때, 메모리의 용량이 부족해지는 상황이 발생할 수 있다. 이 때, Swapping은 현재 메모리에 올라와 있는 프로세스 중 일부를 디스크로 보내어 공간을 확보하고, 필요한 프로세스를 메모리로 불러올 수 있도록 한다.

 

Roll out

: 현재 메모리에 올라와 있는 프로세스 중, 일부 또는 전체를 디스크로 보내는 것.

현재 메모리에 올라와 있는 프로세스의 페이지나 세그먼트를 디스크의 스왑 공간에 저장한다.

 

Roll in

: 디스크에 저장된 페이지나 세그먼트를 메모리로 가져온다.

 


Contiguous Allocation

메모리 공간을 연속적으로 할당하는 메모리 할당 방식이다.

오늘날의 운영체제는 불연속 할당 방식을 사용한다. 이는 연속 할당 방식에서 메모리 단편화 문제를 해결하기 위함인데...

연속할당 방식을 먼저 알아보고, 어떠한 문제가 발생하였는지 볼 필요가 있다.

 

메모리에서 윗쪽은 OS가, 아랫쪽은 유저가 사용하게 된다.

Memory Allocation을 Multiple-Partition Allocation 방식으로 하게 되면...

유저 영역의 메모리 영역을 여러개의 파티션으로 나누어 사용하게 된다.

한 파티션에는 하나의 프로세스만 실행될 수 있다.

여기서 파티션의 사이즈를 설정하는 방식을 기준으로 하면 두 방식으로 나눌 수 있다.

  • fixed sized partition
  • variable sized partition

fixed sized partition

메모리 공간을 고정된 크기의 파티션으로 나누는 방식이다. 각 파티션은 동일한 크기를 가지게 된다.

fixed sized partition은 간단하고 구현이 쉽지만, 메모리의 낭비가 발생할 수 있다.

예를 들어, 작은 프로세스가 큰 파티션에 할당되는 경우, 메모리의 일부가 낭비되게 된다.

 

variable sized partition

메모리 공간을 다양한 크기의 파티션으로 나누는 방식이다. 각 프로세스는 필요로 하는 만큼의 메모리 공간을 할당받게 된다. 동적 메모리 할당이 필요하다.(여러개의 hole이 흩어져 있을 때, 어느 hole에 들어가야 할까?)

 

Dynamic Storage-Allocation Problem

  • First-fit
  • Best-fit
  • Worst-fit

등의 방식이 있다.

First fit: 프로세스가 들어갈 수 있는 첫 번째 hole에 들어간다.

Best fit: 프로세스가 들어갈 수 있는 가장 작은 hole을 찾아 들어간다.

 

First fit은 빠르지만, 메모리 낭비가 발생할 수 있다는 단점이 있고,

Best fit은 느리지만, 메모리 낭비가 적다는 장점이 있다.

Worst fit은..

큰 메모리 블록을 선택하므로 사용 가능한 메모리 공간을 효율적으로 활용할 수 있고,

메모리 단편화를 최소화할 수 있다고 함.

 

First fit은 메모리의 위부터 hole을 찾아 들어가므로, 실행할수록 윗쪽 공간은 모두 사용되어 성능이 하락할 수 있다.

 

Fragmentation

단편화. 메모리에서 사용 가능한 공간 중 일부가 작은 조각으로 나누어져서 낭비되는 현상.

내부 단편화와 외부 단편화로 나눌 수 있다.

 

내부 단편화

프로세스가 필요로 하는 메모리 공간이 할당된 블록보다 작은 경우 발생한다.

예를 들어, 10바이트의 메모리 공간을 요구하는데 16바이트의 블록이 할당되면 6바이트의 공간이 낭비된다.

내부 단편화는 Fixed sized allocation에서 발생한다.

 

외부 단편화

사용 가능한 메모리 공간 중 일부가 작은 조각으로 나누어져서 낭비되는 경우 발생한다.

variable sized allocation에서 발생한다.

 

모든 연속할당 방식은 단편화 문제가 발생한다. 

 

외부 단편화를 줄이기 위한 방법

  • Coalescing
  • Compaction

Coalescing 병합

: 사용되지 않는 인접한 메모리 블록들을 하나의 큰 블록으로 합치는 작업

 

Compaction 압축

: 사용 중인 메모리 블록들을 모아서, 빈 메모리 영역을 하나로 모은 뒤, 사용 중인 블록들을 해당 영역으로 이동시키는 작업.실행 시간 바인딩이 필요할 수 있다. 

728x90
반응형

'2023-1 > 운영체제' 카테고리의 다른 글

Virtual Memory - Page Replacement  (0) 2023.06.03
Paging  (0) 2023.05.15
Thread  (0) 2023.04.18
CPU scheduler  (0) 2023.04.05
Process and Scheduling 2  (0) 2023.03.31

댓글