[OSTEP] 주소 공간의 개념

kshired·2021년 8월 1일
0

주소 공간의 개념

여태까지는 CPU 가상화에 대해 알아보았습니다, 이번 포스트부턴 메모리 가상화에대해 알아보겠습니다.

초기 시스템

초기 컴퓨터는 많은 추상화를 제공하지 않았습니다.

초기 컴퓨터의 물리 메모리는 아래의 그림과 같이 생겼었습니다.

OS는 메모리에 상주하는 루틴들의 집합이였고, 물리 메모리에 하나의 실행 중인 프로세스가 존재하였으며 OS를 제외한 나머지 메모리를 사용했습니다.

특별히 어떠한 가상화를 사용하지 않았습니다.

멀티 프로그래밍과 시분할

시간이 흘러, 사람들은 컴퓨터를 더 효과적으로 공유하기 시작했습니다.

→ 멀티 프로그래밍의 시대가 도래한 것입니다.

여러 프로세스가 실행 준비 상태에 있고, 운영 체제는 그것을 전환하며 실행하였습니다.

여태까지 배운 CPU 가상화 방법을 사용하면서요.

  • CPU는 실제로 1개인데, 여러 개의 프로세스들은 마치 CPU가 여러개인 것과 같은 환상을 가집니다.
  • 그런 환상을 통해, 여러 프로세스가 동시에 실행되는 것 처럼 보이게 합니다.

이러한 시분할을 구현하는 방법 중 하나는 하나의 프로세스를 짧은 시간동안 실행시키는데, 해당 기간동안 프로세스에게 모든 메모리를 접근할 권한을 주는 것이였습니다.

그 후에, 이 프로세스를 중단하고 중단 시점의 모든 상태를 디스크 종류의 장치에 저장하고 다른 프로세스의 상태를 탑재하여 짧은 시간동안 실행시키는 것이였습니다.

이 방법에는 큰 문제가 있었는데, 레지스터 상태를 저장하고 복원하는 것은 빠르지만 메모리 내용 전체를 디스크에 저장하는 것이 느렸다는 것이였습니다.

→ 이것을 해결하기위해, 프로세스를 전환할 때 프로세스를 메모리에 그대로 유지하면서 OS가 시분할을 효율적으로 구현할 수 있게 하는 것이 이번 메모리 가상화의 목표입니다.

그림에 세 개의 프로세스 A,B,C가 있습니다.

각 프로세는 512KB의 물리 메모리에서 각자 작은 부분을 할당 받았고, A는 실행 중이며 B,C는 준비 큐에서 실행을 기다리고 있습니다.

그런데, 이렇게 여러 프로세스들이 한 메모리에 존재하게 되면 서로 데이터를 침범할 수 있는 가능성이 존재합니다.

그렇기에 보호 및 보안이 중요한 문제가 된 것입니다.

주소 공간

위와 같은 위험에 대비하기 위해 OS는 사용자에게 사용하기 쉬운 메모리 개념을 만들어야합니다.

이 개념이 주소 공간(address space)입니다.

주소 공간은 프로그램의 모든 메모리 상태를 갖고 있습니다.

코드, 스택, 힙과 같이 프로그램을 실행시키기 위한 모든 상태를 주소공간이 가지고 있습니다.

위 그림을 보면, 프로그램의 코드는 주소 공간의 위쪽에 위치합니다.

코드는 정적이기 때문에, 프로그램이 실행되면서 추가적으로 메모리를 필요로하지 않습니다.

따라서 메모리에 저장하기 쉬우며, 상단에 배치하게됩니다.

다음으로 프로그램 실행과 더불어 확장되거나 축소될 수 있는 힙과 스택이 존재합니다.

힙은 상단에, 스택은 하단에 존재하게 됩니다.

두 메모리 영역은 확장 할 수 있어야하기 때문에, 각각 서로다른 방향으로 위치하게 되고 각 양 끝단에서 확장하게 됩니다.

( 이런한 배치는 관례일 뿐, 원한다면 다르게 배치할 수 있습니다. )

위 그림에서는 0~16KB 사이에 데이터가 존재하게 되지만, 실제 메모리에서 0~16KB 사이의 물리주소를 사용하지 않습니다. ( 메모리 가상화 )

실제로는 임의의 물리 주소에 탑재됩니다. ( 13.2 그림을 보면 각각 64KB의 공간을 가지지만 실제 공간은 0~64가 아닌 것을 볼 수 있습니다 )

이런일을 할 때, 우리는 OS가 메모리 가상화를한다고 이야기합니다.

왜냐하면, 프로그램은 실제로 자신이 실제 물리주소에 저장된다고 생각하게되고 매우 큰 공간을 가지고 있다고 생각하기 때문입니다.

실제로 프로그램이 실행될 때 OS는 가상주소( virtual address )가 아닌, 실제 물리 주소를 읽도록 보장해야합니다.

목표

가상 메모리 시스템의 주요 목표 중 하나는 투명성 ( transparency ) 입니다.

  • 운영체제가 제공한 환상이 응용 프로그램에게 가상화된다고 생각하게하면 안된다는 것.

또 다른 목표는, 효율성 ( efficiency ) 입니다.

  • 운영체제는 가상화를 시간과 공간 측면에서 효율적이도록 진행해야합니다.
  • 너무 느리게 실행되면 안됩니다.
  • 가상화를 지원하기 위한 구조를 위해 너무 많은 메모리를 사용해서는 안됩니다.
  • 이러한 효율을 위해 TLB와 같은 하드웨어 지원을 받아야합니다.

마지막으로 보호 ( protection ) 입니다.

  • 운영체제는 프로세스를 다른 프로세스로부터 보호해야하고 운영체제 자신도 다른 프로세스로부터 보호해야합니다.
  • 다른 프로세스가 또 다른 프로세스에게 어떤 방법으로든 주소 공간에 접근할 수 있는 방법을 제공하면 낭됩니다.
  • 즉, 자신의 주소 공간 밖의 어느 것도 접근할 수 없어야합니다.
  • 이러한 보호 성질을 이용하여, 우리는 프로세스를 격리 ( isolation ) 시켜야합니다.

요약

이번 포스트에서는 가상 메모리라는 우영체제의 구성 요소에대한 소개를 마쳤습니다.

메모리 가상화를 통해 프로세스들에게 전용공간이라는 환상을 프로그램에게 제공할 책임이 있으며, 이 공간에 프로그램의 명령어와 데이터 전부가 저장됩니다.

하드웨어의 도움을 받아 운영체제는 가상 메모리 주소를 받아 물리 메모리 주소로 변환을 합니다.

이러한 작업을 통해 운영체제는 각 프로세스들과 운영체제를 보호하며 격리합니다.

우리는 다음 포스트부터 기초적인 필수 기법에 대한 설명을 시작으로 점차 고수준 정책을 배워 볼 것입니다.

profile
글 쓰는 개발자

0개의 댓글