운동하는 공대생

[OS(운영체제)] Virtual memory Address translation 본문

OS

[OS(운영체제)] Virtual memory Address translation

운동하는 공대생 2024. 8. 23. 16:05
728x90
반응형

1. Relocation

프로세스가 물리적 메모리에 저장이 되기 위해서는 0에서 바로 시작하는 것이 아니라 메모리의 어딘가에 저장을 해야 한다. 이런 가상의 주소에서 물리적 메모리의 주소로 변환하는 과정을 relocation이라고 한다.

 

  • Static Relocation

소프트웨어를 기반으로 메모리에 할당을 하는 방식이다. 여기서는 메모리에 로딩할때 OS가 각각의 프로그램에 할당한다. 즉 모든 프로세스에 대한 주소를 다시 작성을 하는 것이라고 할 수 있다. 그래서 이런 방식은 하드웨어에 대한 도움이 필요하지 않지만 메모리에 직접적으로 접근하기 때문에 보안에 취약하다. 또한 메모리를 한번 할당하면 주소를 이동하는 게 힘들다.

 

  • Dynamic Relocation

이 방식은 하드웨어를 기반으로 작동하는 방식이다. CPU안에 MMU(Memory Management Unit)을 두고 모든 주소 변환을 수행한다. 여기서는 직접 메모리에 접근하는게 아니라 보안성이 뛰어나다. 그리고 OS도 MMU에게 가능한 주소를 전달한다.

 

이런 MMU의 implementation 이 Base, Base and bound, Segmentation, Paging 이 있다.

 

 

2. MMU implementation

implementation 을 하기 위해서 고려해야 하는 것들이 있다.

 

조건

  • memory protection
  • easy of implementation
  • Fixed partitions
  • fragmentation(internal fragmentation, external fragmentation)
  • sharing unit

Implementation

  • Base
  • Base and bound
  • Segmentation
  • Paging

 

 

2.1 전재 조건

Fixed partitions

물리적 메모리에서 먼저 메모리는 주소 체계에 맞춰서 각각의 파트로 나누어져 있는 모습을 볼 수 있다. 그래서 아래의 그림과 같이 가상의 주소를 할당한다고 하면 MMU 가 Base 레지스터를 통해서 0x2362라는 주소를 매핑하며 partition 1으로 메모리를 할당하는 것을 알 수 있다.

하지만 이런 방시의 장점은 고려 대상에서 처럼 구현이 쉽고 빠른 context switch를 가능하게 하지만 internal fragmentation 문제나 partition 사이즈에 대한 문제가 있다. (Base)

 

Fragmentation

새로운 작업을 메모리 할당이 불가능하지만 비어있는 메모리 공간을 이야기 한다.

  • Internal

아래의 사진처럼 내부적으로 일정 부분의 partition이 사용은 되었지만 

  • External

외부적으로는 partition을 지정할 때 남은 공간이 너무 적어서 새로운 partition을 할당하지 못하는 상황을 이야기한다.

2.2 Base and Bounds

이전과는 다르게 물리적 메모리가 여러 사이즈의 partition으로 나눠진다. 아래의 사진의 방식을 보자면 먼저 Bounds 레지스터를 통해서 작업이 적절한 크기의 즉 지정된 크기에 맞는 작업인지를 확인을 하고 그 이후에 Base 레지스터를 활용하여서 물리적 메모리에 시작 위치를 지정을 해준다.

이런 방식의 장점은 간단하고 저렴한 구현에 있고 또한 inernal fragmentation이 fixed partition 보다 적다. 하지만 여기서의 단점은 물리적 메모리에 순차적으로 메모리 할당을 하게 되면서 partition 간의 external tragmentation 문제가 발생한다.

 

여기서 MMU에서 처리하는 방식을 이야기했지만 이에 맞게 OS에서도 처리를 해야 한다.

 

  • 프로세스 시작 시 : 물리적 메모리에서 공간의 주소를 찾아야 한다. 

여기서 Free List를 필요로 하는 데 사용 가능한 물리적 메모리의 주소 위치를 나타내고 있다.

  • 프로세스 종료 시 : 메모리 공간을 회수해야 한다.

 

프로세스가 종료되면 그 메모리 공간을 회수하고  Free list 에도 이것을 할당해 준다.

 

  • context switch : base-and-bounds 쌍을 저장을 해야 한다.

아래의 사진과 같이 프로세스가 실행이 됨에 있어서 프로세스의 메모리 할당을 위해서 그 프로세스의 base, bounds정보가 필요로 한다.

- How to Improve this?

External fragmentation problem

이 방식의 문제는 프로세스가 메모리에 할당을 받을 때 각각의 프로세스들의 사이에 작게 나눠진 부분 때문에 새로운 프로세스를 항당하기 어려운 External fragmentation 문제가 있다고 했다 여기서 이런 문제를 해결하기 위해 Compaction을 사용한다.

Internal fragmentation problem

partition을 최대로 사용하기 위해서 프로세스 안에 여유 공간을 최대한 크게 활용한다.

2.3 Segmentation

이제까지는 프로세스를 메모리에 그 프로세스 크기만큼을 할당하는 방법을 이야기했다 이제는 각각의 프로세스에서 각 부분이 하는 역할에 따라 segment로 나눠서 저장하는 방식이다.

위에 사진을 본다면 데이터를 먼저 앞에 2 비트를 segment bit로 두고 2 비트의 값에 따라서 할당할 위치를 판단하고 각각의 데이터는 base-and-bounds 가 저장이 되어있는 테이블 프로세스마다의 테이블이 존재하고 이것을 각자 다른 위치가 물리적 메모리에 저장을 하도록 해준다.

 

Segmentation: 장점 (Pros)

  • 희소한 주소 공간 할당 가능: 스택과 힙이 독립적으로 성장할 수 있습니다.
  • 세그먼트 보호가 용이: 유효 비트와 세그먼트별 보호 비트를 사용하여 각 세그먼트를 쉽게 보호할 수 있습니다. 예를 들어, 코드 세그먼트는 읽기 전용으로, 시스템 세그먼트는 커널 모드에서만 접근 가능하게 설정할 수 있습니다.
  • 베이스/바운즈보다 나은 공유: 동일한 번역을 베이스/리밋 쌍으로 적용하여 코드나 데이터를 세그먼트 수준에서 쉽게 공유할 수 있습니다. 예를 들어, 공유 라이브러리에서 코드/데이터 공유가 가능합니다.
  • 각 세그먼트의 동적 재배치 지원: 세그먼트를 개별적으로 동적으로 재배치할 수 있습니다.

Segmentation: 단점 (Cons)

  • 세그먼트는 연속적으로 할당되어야 함: 이는 외부 단편화 문제를 일으킬 수 있으며, 큰 세그먼트를 위한 충분한 물리적 메모리가 없을 수 있습니다.
  • 큰 세그먼트 테이블: 메인 메모리에 세그먼트 테이블을 유지해야 하며, 이로 인해 공간 오버헤드가 발생합니다. 속도를 위해 하드웨어 캐시를 사용할 수 있습니다.
  • 내부 단편화: 힙 세그먼트의 중간에 있는 객체들이 해제될 때 내부 단편화가 발생할 수 있습니다.
728x90
반응형
Comments