포시코딩

[운영체제] 7. Memory Management (1) 본문

CS (Computer Science)

[운영체제] 7. Memory Management (1)

포시 2023. 5. 10. 14:03
728x90

키워드

memory, binding, mmu, dynamic loading, dynamic linking, overlay, swapping

 

Memory란?

  • 주소를 통해 접근하는 매체
  • 주소는 두가지로 나눌 수 있다.
    • Logical Address: 논리적 주소
    • Physical Address: 물리적 주소

 

Logical vs. Physical Address

Logical Address

(=Virtual Address)

  • 프로세스마다 독립적으로 가지는 주소 공간
  • 각 프로세스마다 0번지부터 시작
  • CPU는 하드웨어라 physical address를 바라볼 것 같지만
    CPU가 바라보는 주소는 logical address임
    -> 컴파일 되면 안에 들어가 있는 주소를 바꿀 수 없기 때문에
    즉, 메모리 상의 주소는 바뀌지만 코드 상의 주소는 logical address로 남아있을 수 밖에 없다. 

Physical Address

  • 메모리에 실제 올라가는 위치

 

주소 바인딩

(=Address Binding)

  • 어떤 프로그램이 물리적인 메모리 어디로 올라갈지 메모리 주소를 결정하는 것
  • Symbolic Address -> Logical Address -> Physical Address
  • Symbolic Address: 프로그래머 입장에서는 숫자로된 주소를 사용하지 않고 심볼로 된 주소를 사용
    여기서 이 심볼로 된 주소를 Symbolic Address라고 함
    ex) 변수 이름, 함수 이름 등
  • 위 순서에서 Logical Address -> Physical Address 될 때 이 주소 바인딩 되는 시점이 
    정확히 언제인지? -> 아래 세 가지 시점으로 나뉨

Compile time binding

  • compiile 시점에 이미 물리적인 메모리 주소가 결정
  • 프로그램을 물리적인 메모리에 올릴 때 이미 결정되있는 주소로 올려야 되기 때문에
    물리적인 메모리에 다른 주소가 많이 비어있음에도 0번지 위치부터 올려야 하기 때문에
    굉장히 비효율적
  • 예전에 컴퓨터 안에서 프로그램이 하나만 실행되는 환경에서는 
    다른 프로그램이 같이 올라갈 일이 없기 때문에 사용되었지만
    현재는 사용하지 않음
  • 논리적 주소이자 물리적 주소로 fix 되는 것이기에
    Compile time binding에 의해서 만들어진 코드를 절대 코드(absolute code)라고 부른다.
  • 만약 메모리에 올라갈 위치를 바꾸고 싶다면 컴파일을 다시 해야함

Load time binding

  • 실행이 시작될 때 주소 변환이 이루어짐
  • 즉, 메모리에 올라갈 때 물리적인 메모리 주소가 결정
  • 항상 특정 위치에 올라가야 되는게 아니라 비어있는 위치면 실행 시 어느 위치든 올라갈 수 있는
    재배치 가능 코드(relocatable code)라고 부른다.

Execution time binding

  • (=Run time binding)
  • 프로그램이 시작된 이후에도 물리적인 주소가 바뀔 수 있는 방법
  • 실행 시 주소가 결정되는 것까진 Load time binding과 동일하지만
    실행 도중 주소가 바뀔 수 있음
  • 현재의 컴퓨터 시스템은 Run time binding(=Execution time binding)을 지원
  • 프로그램 시작 시 이미 주소가 결정되어 있는 위 방법들과 달리 
    실행중에도 주소가 계속 바뀌기 때문에 
    CPU가 어떤 메모리 주소를 요청할 때 마다 binding을 체크해봐야 함
    -> 때문에 하드웨어적인 지원이 필요 (MMU)

 

Memory-Management Unit(MMU)

  • logical address를 physical address로 매핑해주는 hardware device

Dynamic Relocation

  • MMU에서 주소 변환을 할 때 register 두 개를 통해 진행
  • 운영체제 및 사용자 프로세스 간의 메모리 보호를 위해 사용하는 레지스터 
    • Relocation register(=Base register): 접근할 수 있는 물리적 메모리 주소의 최소값
    • Limit register: 논리적 주소의 범위
  • limit register를 벗어나는 logical address를 요청하면 trap에 걸려 
    프로세스는 하던 일을 멈추고 CPU 제어권이 운영체제에 넘어감

MMU scheme

  • 위 register 두 개를 이용한 Dynamic Relocation 참고
  • 사용자 프로세스가 CPU에서 수행되며 생성해내는 모든 주소값에 대해
    base register(=relocation register)의 값을 더한다.

User program

  • logical address만을 다룬다.
  • 실제 physical address를 볼 수 없으며 알 필요가 없다.

 

몇가지 용어

  • Dynamic Loading
  • Overlays
  • Swapping
  • Dynamic Linking

* Loading: 메모리로 올리는 것

Dynamic Loading

  • 프로그램을 메모리에 동적으로 올린다. 
  • 즉, 프로세스 전체를 메모리에 미리 다 올리는 것이 아닌
    해당 루틴이 불려질 때 메모리에 load
  • memory utilization의 향상
  • 가끔씩 사용되는 많은 양의 코드의 경우 유용 ex) 오류 처리 루틴
  • * 현재의 페이징 기법과 Dynamic loading은 다름!
  • 보통의 Dynamic loading은 운영체제가 지원해주는게 아니라 프로그래머가 직접 하는 것임
  • 그렇다고 프로그래머가 수동으로 직접 다 하는게 아닌 OS가 라이브러리 형태로 지원

Overlays

  • 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림
  • 작은 공간의 메모리를 사용하던 초창기 시스템에서 수작업으로 프로그래머가 구현
    • Manual Overlay
    • 프로그래밍이 매우 어렵고 복잡
  • 운영체제의 지원없이 사용자에 의해 구현
  • Dynamic loading과 개념적으론 동일하지만 목적이 다름

Swapping

  • 프로세스를 일시적으로 메모리에서 backing store(하드디스크)로 쫓아내는 것
  • Backing store(=swap area)

  • 쫓겨나서 backing store로 내려가는 걸 swap out이라 부르고
    메모리로 다시 올라오는 걸 swap in이라 부른다.

  • 일반적으로 중기 스케줄러(swapper)에 의해 swap out 시킬 프로세스 선정
  • priority-based CPU scheduling algorithm
    • priority가 낮은 프로세스를 swapped out
    • priority가 높은 프로세스를 메모리에 올림

  • Swapping이 효율적으로 사용되기 위해선 Execution time binding(=Run time binding)이 지원되는게 좋다.

  • 메모리에서 프로그램을 통째로 쫓아내고 다시 올려놓는 일은 파일 입출력과 다르게 
    많은 양을 한꺼번에 올리고 내리는 일이라 
    Swap time은 대부분 transfer time(swap 되는 양에 비례하는 시간)이다.

Dynamic Linking

  • Linking: 여러군데 존재하던 컴파일된 파일들을 묶어 하나의 실행파일로 만드는 과정
  • Linking을 실행 시간(execution time)까지 미루는 기법

Static Linking vs. Dynamic Linking

  • Static Linking
    • 내가 소스파일을 여러 개 따로 코딩해서 Linking
    • 라이브러리가 프로그램의 실행 파일 코드에 포함됨
    • 실행 파일의 크기가 커짐
    • 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리 낭비
      ex) printf 함수의 라이브러리 코드
  • Dynamic Linking
    • 컴파일해서 실행 파일이 만들어질 때 포함되지 않은 상태로 남아있다가 
      실행 후 라이브러리가 실행 시 연결(link)됨
    • 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub이라는 작은 코드를 둠
    • 라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 가고 
      없으면 디스크에서 읽어옴
    • 운영체제의 도움이 필요
    • Dynamic Linking을 해주는 라이브러리를 shared library라고 부른다. 
      or Shared Object
      or DLL(Dynamic Linking Library)
728x90