ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 7. 메모리 관리(1) - 메모리의 기본 구조와 동작
    전공공부/운영체제 2019. 12. 25. 20:23
    728x90
    반응형

    메모리의 기본개념

    메모리는 CPU와 같은 반도체 하드웨어로서 일종의 데이터를 저장하는 저장장치 역할을 수행한다. 데이터를 읽고쓰는 속도가 매우 빠르며 cpu가 직접 접근이 가능하다. 또한 전원이 꺼지면 저장 돼 있던 데이터가 모두 사라지는 특성을 가지고 있기때문에 단순히 주소로서만 접근하는 저장공간이라고 할 수 있다. 소프트웨어 즉 프로그램이 실행되기 위해서는 반드시 그 내용이 메모리에 저장돼야 하고 컴퓨터의 메모리관리를 통해 하드웨어는 CPU가 주소만을 가지고 메모리에 있는 데이터를 읽거나 쓸 수 있도록 도와줘야만 한다.

     

    운영체제의 메모리 관리라는 것은 프로세스가 필요한 메모리를 어떻게 얼마만큼 할당해 줄 것인가, 프로세스가 알고있는 주소를 통해서 실제 메모리에 어떻게 접근하도록 하는 것인가 라는 할당과 접근 이 두가지가 메모리관리 기법의 핵심이다.

     

    주소 바인딩 (Address Binding)

    프로세스가 CPU에 의해서 실행되기 위해서는 각각의 프로세스에게 메모리가 할당돼야 한다.  메모리가 할당 된다는 것은 프로세스의 구성요소인 프로그램의 코드와 데이터가 실제로 메모리의 어떤 위치에 저장될지 그 주소가 결정된다는 것을 의미한다. 즉 프로그램 코드 한줄한줄 데이터영역을 이루는 변수하나하나에 메모리 주소가 결정된다는 뜻이다.

    이 과정이 주소 바인딩이며 프로세스는 이 주소 바인딩이 되어야지만이 실제로 실행이 가능해 진다. 따라서 주소 바인딩은 프로세스나 프로그램이 알고있는 주소공간과 실제 메모리 주소로의 변환 또는 매핑의 개념이라고 할 수 있다.

     

    프로그램의 실행 단계 별 주소 표현 방식

     소스 프로그램에서 예를들면 코드들이 변수의 이름이나 함수같은 심벌(symbol)형태로 되어 있다. 컴파일을 하게 되면 변수 이름이나 함수 이름들이 사라지고 그것들이 위치를 나타내는 어떤 값을 가지게 된다.(재배치 가능 주소) 하지만 이 주소는 실제 메모리에 바인딩 될 주소는 아니다. 컴파일러를 통해 그 공간이 숫자로 표현된 주소로 변환되며 연결편집기(linker)를 통해 프로세스 주소 공간의 절대 주소로 변환이 된다. 이 주소가 메모리 주소로 변환하는 과정을 주소 바인딩이라고 할 수 있다. 그리고 컴파일 단계의 마지막인 Linking작업을 거치게되면 최종적으로 전체 프로그램이 만들어지기 때문에 프로그램 하나의 전체 주소를 갖게 된다. 즉 0번지부터 4G번지까지 주소공간을 가지게 된다고 할 수 있다. 하지만 이 주소또한 실제 메모리의 위치를 나타내는 주소는 아니다. 단지 프로그램이 알고 있는 주소라고 할 수 있다.

     

    요약하자면 프로세스가 CPU상에서 실제로 동작하고 실행되기 위해서는 메모리에 할당이 돼야 하고 그 말은 프로그램의 여러 요소들이 실제 메모리 주소를 할당받아야 한다. 또한 그 전에도 이 프로그램 구성요소들은 이미 컴파일러, 링커를 통해 자기만의 주소공간에서 주소값을 가지고 있게된다. 그래서 주소바인딩이라는 것은 프로그램 프로세스의 주소라는 개념과 실제 메모리사이에서의 변환을 의미한다.

    주소 바인딩 시점

    컴파일 시간 (Compile time)

    소스를 컴파일 하는 중에 적재될 메모리 주소를 결정할 수도 있다. 하지만 이렇게 컴파일 된 프로그램은 항상 같은 위치의 메모리에 적재되어야 실행될 수 있다. 메모리가 부족한다던가 남을때 가변적으로 메모리할당이 될 수 있는데 이렇게 컴파일단계에서 메모리 주소가 결정이 돼버리면 항상 그 위치에 메모리가 할당이 돼야 한다. 또한 다른 프로그램이 해당 주소를 포함하여 먼저 할당이 된다면 해당 프로그램의 메모리 할당이 될 수 없다.

     

    적재 시간 (Load time)

    Load time에 주소 바인딩이 되는 것인데, 이것은 컴파일을 하게 되면 재배치 가능 코드가 만들어지고 실제메모리주소가 아닌 상대 주소를 갖게된다. 그래서 운영체제에 의해서 메모리에 배치될때 그 메모리 주소는 항상 바뀔 수 있는데 그 위치에 따라서 상대 주소의 시작주소가 결정됨으로써 전체 변수들이나 기계어 코드들의 실제 메모리 위치가 결정될 수 있다. 이것이 적재시간에 메모리가 바인딩 된다는 것이다. 일반적으로 주소 바인딩이 이렇게 이루어지는것이 아니냐라고 생각할 수 있다.

     

    실행 시간 (Excution time)

    하지만 프로세스가 실행하는 도중에 메모리 위치가 바뀔수도 있게 된다. 이는 가상메모리의 개념을 가지고 오면 이해할 수 있다. 실제 메모리 공간은 한정돼 있기때문에 프로세스들이 메모리를 나눠 써야 한다. 이 작은 메모리 공간에 많은 프로그램을 실행하기 위해서 이 프로그램이 활발하게 실행하고 있을때에는 메모리에 할당하며 스케줄링 상에서 wait상태가 길어지게 될때는 메모리상에 존재하지 않고 하드디스크상에 존재하게 하여 메모리를 관리하게 된다. 이를 가상메모리 기법이라며 최근 컴퓨터시스템에서 가장 일반화가 돼있는 방법이다. 이러한 가상메모리 기법을 지원하기 위해서는 하드디스크에 내려갔던 프로세스가 다음번 스케줄링에 의해서 다시 메모리에 올라와야 되는데 그 위치가 고정돼 있다면 이런 교체과정이 빈번하게 반복될때 메모리의 구조 상태가 바뀌게 된다. 그 바뀐 메모리 구조 상태를 활용하지 못하고 고정된 주소에만 할당하게 된다면 효율적인 메모리 관리가 될 수 없다. 그래서 가상메모리가 운용될 때 프로그램이 하드디스크나 메모리로 교체작업이 일어날 때 임의의 위치에도 배치될 수 있도록 하기위해서는 프로세스가 실행되는 중에도 어떤 프로세스의 코드나 데이터의 위치는 바뀔 수 있도록 해야한다. 이것이 바로 실행시간에 메모리주소가 바인딩 된다는 개념이라고 할 수 있다.

     

    반응형

    논리 (logical) vs 물리  (physical) 주소 공간

    이와 같이 프로세스가 실행되기 위해서는 프로세스가 알고있는 공간의 위치정보가 실제 메모리의 주소값으로 바인딩 돼야 한다. 이때 프로세스의 위치정보와 실제 메모리 주소를 같은 값으로 바인딩하게 된다면 컴파일 타임 및 적재(load)타임의 바인딩은 비교적 쉽게 이룰 수 있다. 하지만 이러한 방법은 실행 시간에 바인딩을 지원할때 문제가 발생할 수 있다. 프로세스가 사용하는 변수가 있고 변수가 로딩할때 실제 어떤 주소로 바인딩 돼 있는데 이것이 실행시간에 하드디스크에 내려갔다가 다시 올라오면서 바뀌는 경우에 프로그램이 인식하는 변수의 메모리 주소조차도 바뀌어야 하는 문제가 발생하게 된다. 그래서 실행 중 주소의 바인딩이 새로 이루어질때마다 이 프로그램은 자기가 사용하는 변수의 메모리 주소가 어떤 값인지 다시 알아내야하는 작업이 필요하게 된다. 그래서 매우 프로그램 실행이 더디거나 불편하게 되는 문제가 발생하게 된다. 그래서 운영체제는 프로그램이 사용하는 공간의 위치정보를 논리주소 공간이라는 것으로 고정시켜 놓고 이것이 바인딩 되어 있는 실제 메모리의 주소 값으로 그 주소 값을 변경시켜주는 서비스를 제공하고있다.

    이렇게 함으로써 런타임에 바인딩이 계속 되면서 실제 그 프로세스가 저장된 실제 메모리 위치는 계속 바뀐다 할지라도

    각각의 프로세스는 그 함수 이름이나 또는 변수 이름에 해당하는 주소가 변경되지 않고 계속 같은 논리 주소 값으로 접근할 수 있는 장점을 가지게 된다. 그래서 이런 논리주소라는 개념은 앞으로 메모리에 시스템을 이해하고 메모리 관리를 위해 가장 기본이 되는 개념이 된다.

     

    메모리 관리 장치 (MMU)

    따라서 운영체제가 제공하는 메모리의 관리 서비스 중에서 이 프로세스의 논리주소라는 것을 실제 메모리에 그것이 할당되어 있는 물리주소로 변환하는 작업이 가장 중요한 서비스라고 할 수 있다. 그래서 이것을 실행하기 위한 아주 빠른 특수한 하드웨어가 필요하게 되었다. 컴퓨터 시스템에서 프로세스의 논리 주소를 실제 메모리의 물리 주소로 변환하는 그런 하드웨어가 있고 이것을 메모리 관리 장치 (Memory Management Unit, MMU)라고 부른다.

    가장 기초적인 메모리 관리 장치

    CPU나 프로세스가 이해하는 주소는 모두 논리주소이며 이 논리주소는 매번 실행할 때마다 물리 주소로 바꿔야 되기 때문에 기본적으로 이 프로세스의 어떤 데이터 텍스트가 어디에 맵핑되었는지에 대한 기본 정보를 바탕으로 매우 빠른 속도로 CPU가 요구하는 주소를 실제 메모리의 주소값으로 변환시키는 작업을 수행해야 한다. 이것이 바로 메모리 관리 장치라고 하는 MMU의 기본 원리라고 할 수 있다. MMU는 동적으로 논리 주소에 재배치 레지스터 값을 더함으로써 주소를 변환하는 역할을 한다. 재배치 레지스터를 사용함으로써 물리 주소는 실행 중에 얼마든지 변경될 수 있다. 

    728x90
    반응형

    댓글

Designed by Tistory.