메모리 주소 변환

물리적 메모리 관리는 운영체제가 아니라 전부 하드웨어에 의해 이루어진다.

논리적 주소 vs 물리적 주소

물리적 메모리는 2가지 주소를 통해 접근할 수 있다.

  1. 논리적 주소(Logical Address) : 프로세스마다 독립적으로 가지는 논리적 주소를 의미한다.

    • 각 프로세스마다 0번지부터 시작

    • CPU가 보는 주소는 Physical이 아니라 Logical Address이다. → CPU가 논리적 주소에 위치한 데이터에 접근할 때마다 Logical Address를 Physical Address로 변환해야 한다.

  2. 물리적 주소(Physical Address) : 물리적 메모리의 실제 주소를 의미한다.

주소 바인딩

Symbolic Address → Logical Address → Physical Address
  1. 소스코드에서 Symbolic Address로 주소가 표현된다. (변수명, 함수명)

  2. 프로그램이 컴파일되면 Symbolic Address가 Logical Address로 변환된다. (변수명, 함수명 → 숫자 주소)

  3. 프로그램이 실행되면 Logical Address가 Physical Address로 변환된다. 이를 주소 바인딩 이라고 한다.

주소 바인딩의 3가지 종류

주소 바인딩이 이뤄지는 시점에 따라 3가지로 나뉜다.

  1. Compile Time Binding : 프로그램 컴파일 시점에 Physical Address가 결정됨

    • 컴파일러가 절대 코드(Absolute Code)를 생성할 경우의 주소 바인딩 방식이다.

    • 물리적 메모리 주소의 시작 위치가 변경되면 recompile이 필요함

    • 비효율적 → 현대 컴퓨터 시스템에서 사용하지 않음

  2. Load Time Binding : 프로그램이 메모리에 올라와 실행될 시점에 Physical Address가 결정됨

    • 컴파일러가 재배치 가능한 코드(Relocatable Code)를 생성할 경우의 주소 바인딩 방식이다.

  3. Run Time Binding(=Execution Time Binding) : 프로그램이 실행 도중에 Physical Address가 결정됨

    • 프로그램 실행 이후에 데이터의 물리적 메모리 위치가 변경될 수 있다.

    • Address Mapping Table을 통해 주소 바인딩이 이뤄진다.

    • 하드웨어적인 지원이 필요하다. → MMU

MMU(Memory-Management Unit)

Logical Address를 Physical Address로 매핑해주는 하드웨어 디바이스이다.

  • MMU는 2개의 레지스터를 통해 주소를 변환한다

    • Base(=Relocation) Register : 물리적 메모리에서 프로세스의 시작 위치 주소를 담고 있는 레지스터 (접근 가능한 물리적 메모리 주소의 최솟값을 나타냄)

    • Limit Register : 프로세스의 크기를 담고 있는 레지스터(논리적 주소의 범위를 나타냄)

MMU의 주소 바인딩 과정

  1. CPU가 346(Logical Address) 주소의 데이터를 참조하려 한다.

  2. MMU는 Base Register, Limit Register를 통해 논리적 주소 346을 물리적 주소 14346으로 변환한다.

    • 프로그램이 할당 받은 주소 공간의 크기(Limit Register값)를 벗어난 주소를 참조하려 한다면 → Trap이 발생하여 CPU 제어권이 프로세스에서 운영체제로 넘어간다.

메모리와 관련된 용어

Dynamic Loading(동적 로딩)

프로세스 전체를 메모리에 적재하는게 아니라 사용되는 부분만 메모리에 적재하는 기법이다.

  • Loading : 프로그램을 메모리에 적재하는 것

  • 프로그램에서 자주 사용되지 않는 오류 처리 루틴에 관련된 부분까지 메모리에 적재하는 것은 매우 비효율적이다.

  • 동적 로딩 기법은 OS가 제공하는 라이브러리로 프로그램 자체에서 구현할 수 있다

  • 목적 → 다중 프로세스 환경에서 메모리에 더 많은 프로세스를 동시에 적재하고 실행하기 위함.

Overlays

메모리에 프로세스의 부분 중 실제 필요한 정보만 적재하는 기법이다

  • 프로세스의 크기가 실제 물리적 메모리의 크기보다 클 경우 사용한다.

  • OS의 지원없이 개발자가 직접 구현한다.

  • 목적 → 단일 프로세스만 메모리에 올려놓는 환경에서 실제 메모리 용량보다 큰 프로세스를 올리 위해 어쩔수 없는 선택.

Swapping

메모리에 적재된 프로세스를 일시적으로 Backing Store에 쫓아내거나 Backing Store에서 메모리로 적재하는 과정이다.

  • Backing Store(=Swap Area) : 디스크와 같이 많은 사용자 프로세스 이미지를 담는 공간

  • Swapping 작업은 중기 스케쥴러에 의해 이뤄진다.

    • Swap In : backing store에서 메모리로 적재하는 작업

    • Swap Out : 메모리에서 backing store로 내리는 작업

  • 주소 바인딩 기법에 따라 Swapping 작업이 다르다.

    • Compile Time Binding, Load Time Binding → 프로세스가 Swap out되었다가 Swap in될 때 원래 존재했던 메모리 위치로 reloading되어야 한다

    • Run Time Binding → 프로세스를 빈 메모리 영역 아무 곳에 적재해도 된다. (Runtime Binding이 Swapping에 적합)

  • Swap Time : Swapping이 일어날 때 걸리는 시간

    • 디스크 탐색 시간, 회전 지연 시간보다 전송 시간이 Swap Time의 대부분을 차지한다.

Linking

Linker로 소스 코드를 컴파일하여 생성된 object file과 이미 컴파일된 라이브러리 파일들을 묶어 하나의 실행 파일을 생성하는 과정이다.

  • Static Linking : 라이브러리가 실행 파일 코드에 포함시켜 실행 파일을 생성하는 과정

    • 프로그램의 실행 파일 크기가 커짐 → 저장 공간 낭비

    • 각각의 프로세스마다 동일한 라이브러리가 메모리에 적재됨 → 메모리 낭비

  • Dynamic Linking : object file라이브러리 파일 사이의 Linking을 프로그램 실행 시간까지 지연하는 기법

    • 프로그램의 실행 파일에는 라이브러리 파일이 별도로 존재하고, stub이라는 작은 코드를 두어 라이브러리의 위치를 찾는다.

    • 라이브러리 코드를 호출하는 시점에 stub으로 디스크속 라이브러리 파일을 찾아 메모리에 loading한다. 라이브러리가 메모리에 이미 load되어있으면 그 주소로 가서 실행한다.

Last updated