Address Space (주소 공간)

Donghyeon Park·2025년 1월 4일

Operating System

목록 보기
5/20
post-thumbnail

본 글의 내용은 Operating Systems: Three Easy Pieces의 The Abstraction: Address Spaces 챕터를 정리한 것입니다.

☑️ 초창기의 메모리 시스템

  • 초기의 메모리 시스템은 유저에게 충분한 추상화를 제공하지 않았다.

  • OS는 항상 메모리의 시작점에 존재했고, 그 위로는 현재 실행되는 프로그램이 올라갔다.

  • 다수의 프로그램이 실행되는 경우가 고려되지 않았다.

☑️ 멀티 프로그래밍 & time sharing

  • 하드웨어의 발전과 사용자의 요구 증가에 의해, 멀티 프로그래밍에 대한 수요가 생기게 되었다.

  • 사용자가 컴퓨터를 사용하면서 즉각적인 응답을 받는 상호 작용이라는 개념이 중요해진 것이다..

  • 이런 time-sharing 시스템을 구현하기 위해 프로세스를 중지할 때마다 디스크에 상태를 저장하고 다른 프로세스로 전환하는 방법을 시도했는데, 메모리의 전체 내용을 디스크에 저장하는 것은 최악의 성능을 보여주었다.

  • 차라리 프로세스를 메모리에 남겨두고, 프로세스를 바꿔가는 방식이 나았다.

  • 위 그림에는 세 개의 프로세스가 존재하고 있다. 싱글 CPU 환경에서는, 예시로 프로세스 A가 실행된다면 B, C는 대기 큐에 담겨져 실행되기를 기다린다. (여기서 Round-Robin과 같은 시분할 시스템이 더해진다.)

  • 위처럼 여러 개의 프로세스가 메모리를 공유하게 되면서, 메모리 보호가 굉장히 중요한 이슈로 떠올랐다. 다른 프로세스에서 자신의 주소 공간이 아닌 영역을 읽어들이지 않게 해야되기 때문이다.

☑️ 주소 공간 (Address Space)

  • 결론적으로 위 기능을 지원하기 위해, OS는 물리 메모리를 쉽게 사용할 수 있도록 추상화를 해주어야 했다.

  • 그로 인해 탄생한 것이 주소 공간(address space)이다. 메모리의 가상화를 이해하려면 이 주소 공간에 대한 이해가 필수적이다.

  • 한 프로세스의 주소 공간은 그 프로세스의 모든 메모리 상태를 저장하고 있다.

  • 예시로, 프로그램의 코드(instruction)는 실행되려면 메모리 어딘가에 위치해야 한다. 그러니 당연히 주소 공간에 존재한다.

  • 그래서 프로그램은 코드 내의 함수와 변수들에 대한 정보를 저장하기 위해 스택을 사용하고, 동적인 메모리 할당을 위해 을 사용하게 되었다.

  • 위 그림을 보면 프로그램의 코드는 주소 공간의 최상단에 위치하고 있다. 코드는 정적이기 때문에 크기가 변할 일은 없고, 그 이유로 주소 공간 최상단에 위치 시키는 것이 가능하다.

  • 나머지 영역(스택, 힙)은 프로그램이 실행되는 동안 늘어나고 줄어들 것이다. 그래서 스택은 메모리 끝에, 힙은 코드 영역 다음에 존재하면서 서로를 바라보는 방향으로 점점 늘어난다.

  • 다만 하나의 스택과 힙으로 영역을 나누는 것은 보편적인 방식일 뿐이며, 원한다면 다른 방식으로 주소 공간을 구성해도 된다. (예: 멀티 스레드 환경에서는 주소 공간에 여러 개의 스택이 필요)

☑️ 가상화를 제대로 하기 위한 목표

  • 앞서 언급된 내용으로부터 우리는 OS의 역할이 메모리를 가상화하는 것으로 이해할 수 있었다.

  • 그 역할을 확실히 하기 위해, 몇가지 목표가 필요하다.

1. 투명성 (transparency)

  • 프로그램은 메모리가 가상화 되었다는 사실을 인지하지 못하고, 자신만의 전용 물리 메모리가 존재하는 것처럼 동작해야 한다.

2. 효율성 (efficiency)

  • OS는 시간과 공간 측면에서 가상화를 최대한 효율적으로 만들어야 한다. 시간 효율적인 가상화를 위해 OS는 TLB와 같은 하드웨어의 지원에 의존한다.

3. 보호 (protection)

  • OS는 프로세스를 보호하고, 프로세스로부터 자신을 보호해야 한다. 프로세스가 로드, 저장, 명령어 가져오기 등을 수행할 때 다른 것에 어떤 방식으로든 영향을 줄 수 없어야 한다. 결국 보호라는 것은 프로세스를 격리(isolation)하는 것이다.

모든 주소는 가상 주소다

디버깅으로 프린팅할 수 있는 모든 것들은 가상 주소이며, 실제 주소를 아는 것은 오직 OS 뿐이다. 프로세스는 투명성을 통해 자신이 가상화 되어있다는 사실을 인지하지 못하며, 실제 주소는 오직 OS(및 하드웨어)만이 알고 있다. 또한 코드의 위치, 힙의 위치, 스택의 위치를 출력했을 때 코드-힙-스택 순서로 큰 주소 값을 갖는다. 이는 가상화에 의해 주소 공간이 구성됐기 때문이다.

✅ 요약

  • 하드웨어의 발전과 사용자의 수요에 의해 멀티 프로그래밍의 시대가 시작되었고, 메모리 가상화가 등장하였다.

  • 메모리 가상화는 프로그램에게 개인만의 주소 공간이 있다고 착각하게 만들어 준다. 즉, 프로그램은 가상 주소만 알뿐, 실제 메모리 주소는 알지 못한다.

  • OS는 하드웨어의 도움을 받아 가상 주소를 실제 메모리 주소로 변환한다.

  • OS는 수많은 프로세스에 이 작업을 수행하여 프로세스들과 자기 자신을 보호할 수 있다.

profile
Android 4 Life

0개의 댓글