본문 바로가기
Computer Architecture/Virtual Address & Cache

Virtual Memory(가상 메모리)의 컨텍스트와 메모리 관리

by FastBench 2024. 10. 27.
반응형

- 가상 메모리 시리즈 모아 보기-

https://microelectronics.tistory.com/99

 

가상메모리의 컨텍스트와 메모리 관리

1. 컨텍스트(Context)의 개념

컨텍스트는 프로그램의 실행 상태와 관련된 정보로, 프로그램이 사용하는 가상 메모리 공간을 물리 메모리에 어떻게 매핑할지 결정하는 전체적인 환경을 의미한다. 여기에는 페이지 테이블(페이지 맵) 정보와 같은 메모리 매핑 정보뿐만 아니라, 프로그램의 실행과 관련된 여러 상태 정보(레지스터 값, 스레드 상태 등)도 포함될 수 있다.

즉, 컨텍스트는 해당 페이지 테이블을 포함하는 더 넓은 개념으로, 프로그램이 실행될 때 필요한 모든 환경 설정을 포함한다.

 

여러 프로그램이 동시에 메인 메모리에 로드될 수 있으며, 각 프로그램은 자체 컨텍스트를 가진다. 이는 프로그램들이 서로 간섭하지 않도록 하며, 예를 들어 하나의 프로그램에서 가상 주소 0의 물리적 위치가 다른 프로그램의 가상 주소 0의 위치와 다르게 할당되는 것을 의미한다. 이러한 방식으로 각 프로그램은 독립적인 가상 주소 공간에서 실행된다.

운영체제는 가상 메모리를 사용하여 프로그램들이 서로의 메모리를 침범하지 못하도록 보호한다. 각각의 프로그램은 자신의 페이지 테이블을 갖고 있으며, 이 페이지 테이블을 통해 프로그램의 가상 주소가 고유한 물리적 주소에 매핑된다.

이를 통해 서로 다른 프로그램이 동일한 가상 주소를 참조하더라도 실제 물리 메모리에서는 서로 다른 주소를 가리키게 된다. 예를 들어, 프로그램 1과 프로그램 2가 각자의 페이지 테이블을 갖고 있고, 동일한 가상 주소를 사용하더라도 물리적 주소는 다르므로 서로의 데이터를 접근할 수 없다. 이를 통해 프로그램 간 메모리 보호가 이루어진다.

2. 컨텍스트 스위칭과 타임셰어링

타임셰어링 시스템에서는 CPU가 주기적으로 한 프로그램에서 다른 프로그램으로 전환된다. 이때 컨텍스트 스위칭이 필요하며, 페이지 맵을 다시 로드하는 방식으로 이루어진다. 이를 통해 마치 각 프로그램이 자신만의 가상 머신에서 실행되는 것처럼 보이게 만든다.

3. 32비트 주소 공간의 메모리 구조

32비트 리눅스 프로그램의 메모리 공간 구조에 대한 예시이다.

  • 상위 1GB: 커널 공간으로, 프로그램이 접근할 수 없다. 프로그램이 여기에 접근하려 시도하면 크래시가 발생한다.
  • 스택 (Stack): 메모리의 높은 주소에서 낮은 주소로 자라며, 함수 호출 시 레지스터와 임시 데이터를 저장하는 데 사용된다.
  • 라이브러리 (Libraries): 중간에 위치하며, 다른 프로그램과 공유할 수 있는 라이브러리(예: 저장 대화 상자)를 포함한다.
  • 힙 (Heap): 메모리의 낮은 주소에서 높은 주소로 자라며, 프로그램이 동적으로 할당한 데이터를 저장하는 공간이다.
  • 데이터와 텍스트 (Data and Text): 프로그램의 상수와 데이터는 데이터 영역에, 실제 코드(바이너리)는 텍스트 영역에 저장된다.
  • 예약 영역: 주소 0 근처의 약 128MB는 I/O와 커널을 위해 예약되어 있다.

스택과 힙 영역이 커지면 페이지 폴트 핸들러가 새로운 페이지를 할당한다. 그러나 두 영역이 중간에서 만나는 경우, 추가적인 공간이 필요하면 프로그램은 더이상 가상메모리를 사용할 수 없게 된다. 리눅스 커널의 경우 Segmentation fault 에러가 발생할 것이다.

 

이 구조는 메모리 보호와 효율적 관리를 위해 사용된다. 아래에서 자세히 살펴보자.

4. 보안을 위한 무작위 오프셋

반응형

리눅스에서는 메모리 보안을 강화하기 위해 각 영역 사이에 무작위 오프셋을 추가한다. 이러한 오프셋은 스택, 라이브러리, 힙 사이에 삽입되어 특정 데이터나 코드의 위치를 예측하기 어렵게 만든다. 이로 인해 악의적인 코드가 특정 메모리 위치에 접근하는 것이 어려워져 프로그램의 보안이 향상된다.

5. 프로그램 간 메모리 격리와 공유

리눅스 커널은 페이지 테이블을 통해 프로그램 간의 메모리 접근을 격리한다.

각 프로그램은 가상 메모리 주소 공간을 독립적으로 사용하지만, 물리적 메모리에서는 특정 페이지를 공유할 수 있다.

예를 들어, 공유 라이브러리 페이지는 두 프로그램의 페이지 테이블에서 동일한 물리적 주소로 매핑될 수 있어, 메모리 낭비 없이 동일한 라이브러리를 사용할 수 있다.

6. 데이터 공유와 충돌 가능성

가상 메모리와 페이지 테이블 설정에 따라, 특정 물리 페이지를 두 프로그램이 동시에 참조하게 설정할 수도 있다. 이는 두 프로그램이 데이터를 공유해야 할 때 유용하지만, 동시에 각 프로그램이 이 데이터에 쓰기 작업을 할 경우 데이터 충돌과 손상이 발생할 가능성도 있다. 예를 들어, 복사 및 붙여넣기와 같은 작업을 위해 메모리 공간을 공유해야 할 때 이러한 설정이 필요하다.

결론

가상 메모리와 페이지 테이블을 통해 운영체제는 프로그램 간 메모리 충돌을 방지하고, 필요한 경우 데이터를 공유할 수 있는 기능을 제공한다. 이를 통해 시스템의 안전성과 효율성을 동시에 확보할 수 있다.

 

Reference

반응형

댓글