공부하는 글른

Operating System: Memory Management (Chapter 7)

글른 2022. 3. 10. 11:44

Address Binding

  • instruction과 data를 실제 memory의 어디로 보낼지 결정하는 것
  • 세 곳에서 address binding을 할 수 있다
    • Compile time binding
      • compile할 때 절대 불변의 address를 각 process에게 할당하는 방식
      • multiprogram이 가능해 지면서 이 방법을 사용하면 두가지 문제가 생긴다
        • 문제1: 하나의 메모리 주소를 다른 process들이 공유할 수 없어서 효율이 떨어진다.  
        • 문제2: 공유를 허용하면, process0가 잠시 메모리에서 내려간 사이에, 그 주소를 process1이 사용하면, 나중에 process0는 올라오지 못한다.
    • Load time binding
      • 위의 문제를 해결하기 위해 등장한 방식
      • 그러나 memory에 올라간 process에게 한칸 정도 이동해 줄 것을 OS가 요청할 때가 생기는데, 이런 상황에서 load time binding 방식은 전체 process를 reload해야하는 문제가 여전히 남는다
    • Execution time binding
      • 매우 flexible한 방식
      • OS에게는 memory에 대한 가상 주소만 전달하고, OS는 그 주소를 갖고 process를 실행시킨다
      • 따라서 가상 주소를 실제 주소 (physical address)로 변환해 주는 역할을 할 stack이 필요하다
      • 이 stack 연산은 OS 입장에선 상당히 느리기 때문에, 빠른 속도 연산을 위해 하드웨어의 도움을 받기로 한다
      • 그것이 바로 Memory Management Unit (MMU)이다. 

Address Mapping Table

  • virtual address와 physical address 간의 mapping을 기록해둔 table

Base and Limit Registers

  • Base register와 limit register가 phsysical address space를 결정한다. 
    • base register: 시작 주소를 의미
    • limit register: 사이즈를 의미

Memory Menagement Unit (MMU)

  • 엄청나게 빠른 속도로 virtual address >> physical address 변환을 돕는 하드웨어
  • virtual address + base register 를 통해 physical address에 접근하고, virtual address <= limit을 판단하는 하드웨어

Swapping

  • Process는 memory에서 backing store로 일시적으로 swap out 될 수 있고, 적절한 시기(sometime later)에 다시 memory로 swap in 될 수 있다
  • 이 때 그럼 memory에 process를 어떻게 올릴 것인지 할당 해 주는 정책이 몇 가지 있다

Contiguous Allocation 

  • Memory에 process를 쪼개지 않고, 통으로 예쁘게 올려주는 것

Multiple Partition Allocation

  • contiguous allocation 중에서도 Multiple-Partiton Allocation이라는 방식이 있다
    • User process가 올라갈 수 있는 영역이 한 덩어리가 아니고, 일정 크기의 partition으로 나눈다
    • 올라가고자 하는 process의 크기 > n개의 연속된 partition 크기 일 경우 n개의 연속된 partition을 합쳐서, 거기에 process를 올리는 방식
    • Hole: 비어 있는 영역을 의미.

Dynamic Storage-Allocation Problem

  • Hole이 여러 개 있을 때, 그 중 어디에 process를 올릴지 결정하는 문제
  • 세 가지 정도 방식이 있는데
    • First-fit: allocate the first hole that is big enough
      • 가장 적은 시간이 소요되서 time complexity 측면에서 가장 좋음
    • Best-fit: 전체 hole list를 다 확인하고, smallest hole that is big enough를 찾아서 할당
      • 자투리 공간을 활용할 수는 없음
    • Worst-fit: 전체 hole list를 다 확인하고, largest hole that is big enough를 찾아서 할당
      • 남는 자투리 공간이 크기 때문에, 자투리 공간을 활용할 수 있음
      • storage utilization 측면에서는 세가지 중 가장 안 좋은 방식

Fragment

  • 이런 자투리 공간을 fragment라고 함
  • external fragment: process의 memory 영역으로 할당되지 않은 자투리
  • internal fragment: process에게 할당된 영억 중, 실제 process가 사용하지는 않는 자투리. 이건 partitioning 단위가 있는 방식에서 발생. (예: 1.5K process에게 1K partition 2개 할당하면, 실제로는 0.5K가 그 안에서 놀고 있음)
  • Compaction: external fragment들을 모아서 활용하는 것. 그러나 이것을 위해서는 execution time에 dynamic reloading이 가능해야한다

Paging

  • 그래서 나온 개념이 paging
  • virtual memory와 physical memory를 모두 잘게 쪼개서 process를 memory에 흩어서 올리자는 방식
  • Contiguous 하게 process가 올라가지 않음
  • frame: physical memory address 영역을 쪼개는 단위. 2의 지수 값으로 쪼갠다
  • page: virtual memory address 영역을 쪼개는 단위로 frame과 같은 크기다
  • Step1: free frame을 계속 tracking하고 있어야한다
  • Step2: n pages로 구성된 process를 올리기 위해서는 n frames가 필요하다 
  • Step3: memory mapping table인 page table을 만든다
  • paging을 통해서 external fragment는 없어지지만, internal fragment는 여전히 존재한다

Translation Look-aside Buffer (TLB)

  • paging의 장점: External fragment가 없어졌다
  • paging의 단점: MMU가 바로 memory에 가는 것이 아니라, page table도 들려야 해서 memory 접근 overhead가 2배가 된다
  • 매번 page와 frame 사이의 address mapping을 찾는 것의 overhead를 줄여보고자, 자주 접근하는 page에 대한 address mapping을 저장하는 cache를 만들었다
  • 이것은 일종의 캐시이기 때문에 context switch가 발행하면 flushing된다
  • Effective Access Time 
    • associative loopup : a 시간, memory access: b 시간, TLB hit ratio : e 일경우
    • EAT = (a + b) * e + (a + 2b) (1-e) = a + (2-e) b이다

Segmentation

  • Paging이 sematic단위를 전혀 고려하지 않고, size만을 기준으로 memory address를 쪼갰다면, 이제 의미를 고려 해 보면서 자르는 방식
  • 이 방식을 사용하면, 잘라진 조각을 process간에 공유 하는 등 다양한 활용이 가능
    • Protection (read/write를 semantic 단위로 허용 가능) 이 쉬워진다
    • process 간에 associated segments Sharing이 가능해진다
  • 단점: memory allocation이 좀 복잡하다
  • Paging과 다르게 internal fragment는 없고 external fragment는 존재
  • MULTIX의 경우 segmentation 우선 적용해서 process memory를 segment 단위로 쪼개고, 그 segment를 page로 쪼개는 방식을 사용 (segmentation + paging 혼합)