Operating System

[OS] Memory Management (1)

Sara.H 2021. 12. 24. 07:41
이화여자대학교 반효경 교수님 운영체제 수업 8-1 Memory Management

 

Logical vs Physical address

  • logical address (= virtual address)
    • 프로세스마다 독립적으로 가지는 주소 공간
    • 각 프로세스마다 0번지 부터 시작
    • CPU 가 보는 주소는 logical address 임 
      • CPU 는 하드웨어이므로 물리주소를 바라볼 것 같으나, 논리 주소를 바라본다.
      • fetch, execute 시 매번 논리주소를 물리주소로 변환해서 알아내야 함
  • physical address 메모리에 실제 올라가는 위치
  • 주소 바인딩 : 주소를 결정하는 것
    • symbolic binding -> logical address -> physical address

 

주소 바인딩 

  • 컴파일 타임 바인딩 
    • 물리적 메모리 주소가 컴파일 시 알려짐 
    • 시작 위치 변경시 재컴파일 
    • 컴파일러는 절대코드 (absolute code) 생성 
      • 물리적 주소 또한 결정이 나므로 
      • 메모리에 올라가는 주소를 변경하려면 다시 컴파일해야함 
  • 로드 타임 바인딩 
    • 로더의 책임 하에 물리적 메모리주소 부여 
    • 컴파일러가 재배치가능코드 (relocatable code) 생성한 경우 가능
      • 항상 특정 위치에 올라가야 하는게 아니라 실행시 비어있는 어느 위치로든 올라갈 수 있음  
  • Execution time binding ( = Run-time binding) 
    • 수행이 시작된 이후에도 프로세스의 메모리 상 위치를 옮길 수 있음 
    • CPU 가 주소를 참조할때마다 binding 을 점검 ( address mapping table) 
    • 하드웨어적인 지원이 필요 (e.g. base and limit registers, MMU

 

MMU (Memory - Management Unit) : 주소 변환을 위한 하드웨어 

  • MMU 
    • logical address 를 physical address 로 매핑해주는 hardware device 
  • MMU Scheme 
    • 사용자 프로세스가 CPU 에서 수행되며 생성해내는 모든 주소값에 대해 base register ( = relocation register ) 의 값을 더한다. 
  • User Program 
    • logical address 만을 다룬다. 
    • 실제 물리주소를 볼 수 없으며 알 필요가 없다. 

 

  • P1 의 논리주소 0 ~ 346 번째를 CPU 가 요청한 상황 
  • 물리주소에서는 14000번 부터 올라가있음. 
  • 시작 위치 14000 과 논리 주소를 더해주면 됨 14000 ~ 14346 까지 읽으면 됨 
  • limit register 사용
    • 프로그램의 최대 크기가 있을 것인데, 리미트 레지스터는 프로그램의 크기를 담고 있음. 
    • 악의적인 프로그램이라서, 본인의 크기 이상의 주소 번지의 위치를 요청할 수 있는 경우 이를 방지할 수 있다. (다른 프로그램의 메모리 위치 달라고 하는 경우, 주면 안됨!) 

 

Trap 

CPU 제어권이 운영체제로 넘어가면, 운영체제는 트랩이 왜 걸렸는지 분석한다. 악의적으로 다른 프로그램의 메모리 주소를 참조하려 했다는 것이 밝혀지면 해당 프로그램을 강제로 종료할 것이다. 

 

Some Terminologies 

  • Dynamic Loading 
    • 프로세스 전체를 메모리에 미리 다 올리는 것이 아니라 해당 루틴이 불려질 때 메모리에 load 하는 것 
    • memory utilization 향상 
    • 가끔씩 사용되는 많은 양의 코드의 경우 유용 ( 예: 오류 처리 루틴 ) 
    • 운영체제의 특별한 지원 없이 프로그램 자체에서 구현 가능 ( OS는 라이브러리를 통해 지원 가능 ) 
    • Loading : 메모리로 올리는 것
      • Dynamic loading 을 프로그래머가 쉽게 하도록 운영체제가 라이브러리를 지원. 메모리에 필요한 것 올리고 쫓아내는 것은 운영체제의 Paging 기법. 서로 구분을 해야 함. 지금은 섞어서 사용하기는 하지만 ... ? 
  • Overlay 
    • 메모리에 프로세스의 부분 중 실제 필요한 정보만을 올림
    • 프로세스의 크기가 메모리보다 클 때 유용
    • 운영체제의 지원 없이 사용자에 의해 구현
    • 작은 공간의 메모리를 사용하던 초창기 시스템에서 수작업으로 프로그래머가 구현
      • Manual Overlay
      • 프로그래밍이 매우 복잡
  • Swapping
    • 프로세스를 일시적으로 메모리에서 backing store / swap area 로 쫓아내는 것
    • Swap in/out 
      • 일반적으로 중기 스케줄러 (스와퍼) 에 의해 swap out 시킬 프로세스 선정 
      • 우선순위 기반의 스케줄링 알고리즘 
      • 컴파일 타임 혹은 로드타임 바인딩에서는 원래 메모리 위치로 swap in 해야함
      • execution time binding 에서는 추후 빈 메모리 영역 아무 곳에나 올릴 수 있음 
      • swap time 은 대부분 transfer time(swap 되는 양에 비례하는 시간) 임 
  • Dynamic Linking 
    • Linking 을 실행시간 (Execution time) 까지 미루는 기법 
    • Static Linking 
      • 라이브러리가 프로그램의실행파일 코드에 포함됨 
      • 실행 파일의크기가 커짐 
      • 동일한 라이브러리를 각각의 프로세스가 메모리에 올리므로 메모리낭비 (eg. printf 함수의라이브러리 코드 )
    • Dynamic Linking 
      • 라이브러리가 실행시 연결됨 (link) 
      • 라이브러리 호출 부분에 라이브러리 루틴의 위치를 찾기 위한 stub 이라는 작은 코드를 둠 
      • 라이브러리가 이미 메모리에 있으면 그 루틴의 주소로 가고 없으면 디스크에서 읽어옴 
      • 운영체제의 도움 필요 
      • Shared Library, Shared Object, DLL (Dynamic Linking 이 되는 library) 

 

Allocation of Physical Memory 

  • 연속 할당 
    • 고정분할 방식 (Fixed Partition) 
      • 물리적 메모리를 몇개의 영구적인 분할로 나눔 
      • 융통성 없음 
    • 가변분할 방식 (Variable Partition) 
      • 프로그램 크기 고려해서 할당 
      • 분할의 크기 개수가 동적으로 변함
    • Hole 
      • 가용 메모리 공간 
      • 다양한 크기의 hole 들이 메모리 여러 곳에 흩어져 있음 
      • 프로세스가 도착하면 수용가능한 hole 을 할당 
      • 운영체제는 다음의 정보 유지 
        • 할당 공간 
        • 가용 공간 (hole) 
  • 불연속 할당 
    • 현대 시스템에서는 불연속 할당 기법을 사용한다. 

 

Internal, External Fragmentation (주의: 상대적인 개념임) 

 

 

연속 할당시 Hole 을 결정하는 방법

 

디스크 조각 모음 ?

작은 구멍들을 모아서 외부 파편화 문제를 해소

바인딩을 다 점검해야 하는 등 프로그램 전체에 관련된 문제이기때문에 매우 Costly 하다. 

적어도 런타임 바인딩이 지원이 되어야지만 (리로케이션) 컴팩션을 수행할 수 있다 (?) 

최소한의 프로그램을 이동시켜서 Hole 을 큰 것을 만들 수 있으면 효율적일 것. => 간단한 알고리즘이 아니다.