어떻게 하면 잘 정리했다고 소문이 날까...

[OS 7편] Memory Management 본문

CS 지식/OS(운영체제)

[OS 7편] Memory Management

정리왕이되자 2023. 7. 7. 13:21

총 6개의 하위 내용으로 구성됩니다.

 

1. 주소 바인딩

2. MMU (Memory Management Unit)

3. 메모리 관련 용어

4. 물리적 메모리 할당 방식

5. 페이징 기법 (Paging)

6. 세그멘테이션 (Segmentation)

 

 

✔️ 주소 바인딩

  • 바이트 단위 주소 부여.
  • Logical 주소 VS Physical 주소
    • Logical 주소
      • 프로세스마다 독립적으로 가지는 주소 공간.
      • 각 프로세스가 0부터 시작.
      • CPU가 보는 주소는 Logical 주소.
    • Physical 주소
      • 실제 메모리에 올라가는 위치.
  • 주소 바인딩
    • 프로세스의 논리적 주소를 물리 메모리의 물리적 주소에 연결시키는 방법.
    • Symbolic Address -> Logical Address -> Physical Address
  • 주소 바인딩의 종류
    • 컴파일 타임 바인딩
      • 물리적 메모리 주소가 컴파일 시 결정.
      • 시작 위치 변경 시 재 컴파일.
      • 절대 코드 생성. (컴파일 했을 때 주소 = 실행 주소)
    • 로드 타임 바인딩
      • 프로세스가 시작할 때 물리적 메모리 주소 결정.
      • Loader가 책임 하에 물리적 메모리 결정(고정).
      • 컴파일러가 재배치 가능한 코드를 생성한 경우 사용가능한 방식.
    • 런 타임 바인딩
      • 프로그램 시작 후에도 프로세스 상 메모리의 위치 변경 가능.
      • CPU는 주소 참조할 때마다 address mapping table로 바인딩 점검.
      • 하드웨어 적인 지원이 필요함. (MMU, 기준 레지스터, 한계 레지스터)

 

✔️ Memory Management Unit

  • Logical 주소를 Physical 주소로 매핑해주는 HW 장치.
  • 사용자 프로세스가 CPU에서 실행되며 모든 주소 값에 Base Register 값을 더한다. (=주소 바인딩)
  • 연속 적재를 가정.
  • CPU나 사용자는 물리 주소를 몰라도 됨.
  • Context Switching 시 Base Register 값이 변경됨.
  • Limit Register : 프로세스가 프로세스 자신의 크기를 넘어서는 주소 공간 참조하려고 하는 지 확인. (프로세스의 크기)
  • HW support for address translation
    • Limit Register와 비교 시 그 값을 넘어서면 소프트웨어 인터럽트인 트랩을 발생시킨다.

 

✔️ 메모리 관련 용어

  • Dynamic Loading
    • 프로그램 전체를 메모리에 미리 올려두는 것이 아닌 해당 루틴이 호출될 때 메모리에 로드하는 것.
    • memory utitlization이 향상.
    • 가끔식 사용되는 많은 양의 코드의 경우 유용.
    • OS의 지원 없이 프로그램 자체 구현 가능. (OS가 라이브러리를 통해 지원 가능)
  • Overlays
    • 메모리에 프로세스의 부분 중 실제 필요한 정보만 올림.
    • 프로세스의 크기가 메모리의 크기보다 큰 경우 사용.
    • 사용자에 의해 구현됨.
    • Dynamic Loading VS Overlays
      • Dynamic Loading for multiple process (더 많은 프로세스를 올려두고 사용)
      • Overlays for single process (메모리 보다 큰 프로세스를 올려두고 사용하기 위함)
  • Dynamic Linking
    • Linking 작업을 실행 시간까지 미루는 것.
    • Static Linking
      • 라이브러리가 프로그램 실행 파일 코드에 포함됨.
      • 실행 파일의 크기가 커짐.
      • 메모리 낭비.
    • 라이브러리가 실행 시 연경됨.
    • 라이브러리 호출 부분에 라이브러리 루틴을 찾기 위한 stub이라는 작은 코드를 둠.
    • OS의 도움이 필요.
  • Swapping
    • 전체 프로세스를 일시적으로 메모리 바깥 Storage(=Swapping Area) 로 내쫓는 것.
    • Swap in / Swap out
      • 일반적으로 중기 스케줄러(Swapper)에 의해 swap-out 시킬 프로세스 선정.
      • 컴파일 타임, 로드 타임 바인딩은 원래 메모리 위치로 swap-in, 런 타임 바인딩은 빈 공간으로 swap-in.
      • swap time은 transfer time과 동일.

✔️ 물리적 메모리 할당 방식

  • OS 상주 영역: 인터럽트 벡터 위치, 낮은 주소 영역
  • 사용자 프로세스 영역: 높은 주소 영역
  • 사용자 프로세스 영역의 할당 방법
    • 분할 방식
      • 연속 분할: 각각 프로세스가 메모리의 연속된 공간에 적재
        • 고정 분할 방식
          • 물리적 메모리를 영구적 분할로 나눔.
          • 물리적 메모리에 load 되는 프로세스의 수를 고정.
          • 외부, 내부 조각 발생.
        • 가변 분할 방식
          • 분할을 미리 하지 않고, 분할의 크기 및 개수가 동적으로 변함.
          • 프로그램 크기 고려해서 할당.
          • 기술적 관리 기법 필요.
          • 외부 조각 발생 가능.
        • Hole
          • 가용 메모리 공간
          • 다양한 크기의 hole이 여기저기 존재.
          • 프로세스 도착 시 가능한 hole 할당.
          • OS는 다음 정보 유지 1) 이미 할당된 공간 2) Hole
          • 어떤 hole을 할당해야 하는가? -> Dynamic Storage Allocation Problem
            • First-Fit: 사이즈가 n이상인 것 중 최초로 찾아지는 hole에 할당.
            • Best-Fit: 사이즈가 n이상인 것 중 가장 작은 Hole 할당
              • 탐색 + 가장 작은 hole 생성
            • Worst-Fit: 가장 큰 Hole에 할당.
          • 안쓰는 Hole을 한군데로 모아보자 -> Compaction
            • 외부조각 해결 방법.
            • 사용 중인 메모리 영역을 한 군데로 모으고 Hole을 한 군데로 모아 block 만들기.
            • 비용이 많이 들고, 바인딩 점검이 필요.
            • Run-time binding이 지원되어야 함.
      • 불연속 분할: 하나의 프로세스가 메모리의 여러 영역에 분산되어 올라감.
        • 페이징 기법
          • 하나의 프로세스 공간을 같은 크기 페이지로 나누기.
          • 물리적 공간 또한 같은 페이지 크기로 자르기(=frame)
          • MMU가 복잡해짐.
        • 세그멘테이션
          • 같은 크기가 아닌 Code, Data, Stack 등의 세그먼트로 나누어 적재.
          • 의미 단위로 나누기.

 

✔️ 페이징 기법

  • 프로세스의 가상 메모리를 동일한 사이즈의 페이지로 나눔.
  • 일부는 backing storage에 일부는 RAM에 저장.
  • 보통 페이지의 크기는 4KB이다.
  • 물리 메모리도 같은 크기의 프레임으로 나눔.
  • 모든 프로세스가 각각 주소 변환을 위한 페이지 테이블을 가짐.
  • 페이지 테이블을 이용해 logical address를 physical address 접근하는 것에 사용.
  • page table은 메인 메모리에 위치.
  • 외부 조각은 없고, 내부 조각은 발생 가능.

  • Page Table
    • 페이지 테이블은 메인 메모리에 상주.
    • 페이지 테이블 base register는 page table의 위치, length register는 페이지 테이블의 크기 -> OS가 사용하는 table 접근용 레지스터.
    • 속도 향상을 위해 TLB(Table Look Aside Buffer)라 불리는 캐시 사용.
    • 고속의 주소변환용 캐시.
  • TLB(Table Look-aside Buffer)
    • page table의 일부를 가짐.
    • 논리적 주소 p와 연결된 f 프레임 번호를 가지고 있어야 함.
    • TLB는 TLB 항목 전체를 검색 해야 함.
    • Associative Register와 병형 탐색이 가능.
    • TLB는 context-switch 시에 flush 된다. 
     

TLB를 활용한 페이지 테이블 (출처: 운영체제와 정보기술의 원리)

  • 2단계 페이지 테이블
    • 현대의 컴퓨터는 주소 공간이 매우 큰 프로그램 지원.
    • 32비트의 주소 이용 시 2의 32승 바이트 주소 공간을 가지는 프로그램 지원 가능.
    • 페이지가 4KB라면 1M의 페이지 테이블 항목이 필요.
    • 각 페이지 테이블 항목이 4바이트 라면 4MB의 메모리 공간 필요.
    • page table을 페이지로 구성해보자는 아이디어에서 출발.
    • 사용하지 않는 주소 공간에 대한 outer page table의 엔트리는 NULL 값으로 세팅.
    • 2단계 테이블은 공간, 시간적인 측면에서는 손해지만, 2단계를 사용해야 NULL 처리를 할 수 있다.
     

2단계 페이지 테이블 구성 (출처: 운영체제와 정보기술의 원리)

  • Mutilevel paging and performance
    • 주소 공간이 크면, 다단계 페이지 테이블이 필요.
    • 여러 단계의 메모리 접근이 필요한데, TLB 로 접근 시간을 줄일 수 있다.
    • page table에는 frame 번호와 invalid, valid 여부가 같이 있다.
  • Memory Protection
    • Protection Bit (보호 비트)
      • 페이지 접근 권한(read, write, read-only)
    • 유효, 무효 비트(valid, invalid bit)
      • valid의 경우, 해당 주소의 frame에 페이지가 존재하며 프로세스를 구성하는 유용한 내용이 존대.
      • invliad의 경우, 해당 주소의 frame에 유효한 내용이 없어 접근 불가, 사용 불가(swap area에 내려가 있음)
  • 역 페이지 테이블
    • 프레임에 대한 페이지 테이블(한 시스템에 하나), 물리적 주소에 대한 페이지 테이블.
    • 페이지 테이블이 큰 이유
      • 모든 프로세스의 logical 주소에 해당하는 모든 페이지에 대해 page table entry가 존재.
      • page가 메모리에 있든 없든 엔트리는 존재.
    • 페이지 프레임 하나 당 page table entry를 둔 것.
    • 단점
      • 물리적 주소로부터 논리적 주소를 얻기 쉬운 구조.
      • 페이지 테이블에 해당 주소가 있는 지 여부 판단을 위해 전체 테이블 탐색이 필요.
    • 개선
      • associative register(병행 제어)
    • 공간 Overhead 감소하나 시간 Overhead 증가.
     

역 페이지 테이블 구성 (출처: 운영체제와 정보기술의 원리)

  • Shared Page
    • 공유 가능한 부분은 한 번만 load 하기.
    • read-only로 하여 프로세스 간에 하나의 코드만 메모리에 적재.
    • shared code는 모든 프로세스에 동일한 logical address space에 존재해야 함.
    • 2가지 조건 약속
      • 1. Read-only
      • 2. 동일한 logical address에 위치.

✔️ 세그멘테이션

  • 프로그램을 여러 개의 의미 단위의 Segment로 구성.
  • code, data, stack 함수 등 logical unit으로 구성.
  • logical 주소: 세그먼트 번호 | 순서

  • segment table
    • base : physical memory에서 세그먼트까지의 위치.
    • limit: segment의 길이
    • STBR(Segment Table Base Register): segment table의 시작 위치.
    • STLR(Segment Table Limit Register): 프로세스가 사용하는 segment의 개수.
  • 세그먼트 아키텍처
    • 각 세그먼트 별로 Protection Bit가 존재.
    • sharing: 세그먼트가 의미 단위이기 때문에 sharing과 protection에서 페이징 기법보다 효과적.
    • Allocation: First Fit/ Best Fit -> 외부 조각 발생 가능.
    • 의미 단위라서 개수가 적고, 테이블 길이도 페이징 보다 작음.
     
  • Paged - Segmentation
    • 세그먼트 하나가 페이지 크기의 배수가 되게끔 하여 세그멘테이션에서 발생하는 외부 조각의 문제를 해결해 페이징 기법의 약점 보호.

세그먼트 테이블 (출처: 운영체제와 정보 기술의 원리)

  •  
  •  

'CS 지식 > OS(운영체제)' 카테고리의 다른 글

[OS 9-1편] File System  (0) 2023.07.25
[OS 8편] Virtual Memory  (0) 2023.07.13
[OS 6-2편] Process Synchronization  (0) 2023.06.02
[OS 5편] CPU Scheduling  (0) 2023.03.30
[OS 4편] 프로세스 관리  (0) 2023.03.21