본문 바로가기
CS study/Operating System

4. 운영체제 Virtual Memory

by 규나 2021. 9. 15.
SMALL

리뷰

Memory Address Space는 각 Process 마다 존재한다.

Virtual Memory Space

  • Stack : 스택에 있는 메모리는 컴파일러가 자동으로 할당하고 해제
  • Heap : 코드, 즉 프로그래머에 의해서 할당되고(malloc) 해제(free)

 

Memory Leak

할당된 메모리를 해제하지 않으면 메모리 사용이 증가하고, 가용 메모리 공간이 부족해진다.

Garbage Collection : 프로세스가 종료되면, 프로세스가 할당되었던 memory page를 OS가 회수해간다.

 

Common Memory Errors

  1. Segmentation Fault : 할당되지 않은 메모리 주소에 접근하는 경우
  2. Buffer Overflow : 충분한 메모리 할당이 되지 않은 경우 and 메모리 영역 바깥에 할당하는 경우
  3. Uninitialized Memory : 할당받은 메모리를 초기화하지 않은 경우
  4. Dagling Pointer / Double Free : 메모리 사용이 끝나기 전에 해제 / 메모리 이중 해제

이제부터가 진짜 virtual memory내용

Virtual Memory 

OS는 여러개의 프로세스들이 메모리에 공존하도록 설계, Context Switching할 때, 단순히 그 주소만 바꾸면 됨

Virtual Memory 규칙?

  • Isolation : 프로세스끼리 서로 방해하지 않음
  • Transparent : 프로세스는 가상화된 지 모른채 실행됨
  • Efficiently Utilize : 하드웨어의 지원(TLB)을 받아 효율적으로 사용됨
    → 물리적 크기보다 더 커보이게 만듦

 

Address Translation

  • 프로세스는 가상의 주소(virtual memory address)만 알고 있고, 데이터는 물리 메모리에 존재하므로 이것을 translation할 수 있어야 함
  • 두 가지 가정을 하자.
    1) 가상주소 공간은 물리 메모리에 알맞도록 크기가 작다.
    2) 각각의 메모리 세그멘트의 크기는 동일하다.

 

Dynamic Memory Allocation

virtual address는 base와 bound로 이루어짐

 

Memory management unit (MMU)

base와 bound는 OS가 커널모드에서 관리한다.

 

Internal Fragmentation 내부 단편화

  • stack과 heap 사이의 빈 공간이 낭비되는 형상
  • 이 현상이 dynamic memory allocation의 한계임

→ virtual memory 공간 전체를 매핑하는 것이 아니라 세그멘트 단위로 매핑을 하자!

 

Segmentation

세그멘트 별로 base와 bound를 가짐

* 초기 intel x86에서 세그멘테이션을 사용했는데 더 이상은 사용되지 않고 있음

 

External Fragmentation 외부 단편화

  • 물리 메모리 공간이 여러개의 메모리 블록들에 의해 단편화 되어 낭비되는 현상
  • 아래 그림에서 Free 공간이 8KB, 4KB로 단편화되어 10KB 크기의 메모리 할당이 불가함


1) Free List : Spliting

  • Free List는 Free 상태인 메모리 chunk에 대한 정보를 가진다.
  • 여기서 2KB 크기의 메모리가 할당되면, 첫 번째 free메모리 chunk가 2KB+@KB로 나눠짐

 

2) Free List : Coalescing

  • 메모리 해제(deallocationg)는 여러개의 단편화된 free memory chunk를 만들어버림
  • 만약 여기서 8KB 크기의 메모리가 할당되면, free memory chunk는 8KB보다 큰 게 없어서 실패함
  • coalescing은 메모리가 해제될 때 인접한 chunk들을 합침

 

Handling Free List

Best fit 최적 적합

  • Free list 전체를 탐색해서 요청된 크기와 가장 비슷한 크기의 memory chunk를 사용
  • 낭비되는 공간은 줄여주지만, 매우 많은 free chunk 조각들을 생성하게 됨

Worst fit 최악 적합

  • Free list 전체를 탐색해서 가장 큰 크기의 memory chunk를 사용

First fit 최초 적합

  • 가장 먼저 발견된 fitting block을 사용

Next fit 다음 적합

  • 이전에 사용된 block의 주소를 별도의 포인터에 저장해놓고 그 주소부터 fitting block을 탐색해서 사용

Segregated Free List

프로그램이 한 두개의 자주 사용하는 메모리 크기가 있다면, 그 크기의 block들만 관리하는 별도의 리스트를 둠

Binary Buddy Allocation

  • Free memory 공간을 요청된 크기가 될 때까지 반으로 쪼개어 나가면서 사용
  • 인접한 block을 "Buddy"라고 부르며, block이 free()될 때 그것의 buddy도 free상태면 둘을 병합함
    (Coalescing을 단순화한 것)
  • But, 내부 단편화를 발생시킴

'CS study > Operating System' 카테고리의 다른 글

6. 운영체제 Threads  (0) 2021.09.18
5. 운영체제 paging  (0) 2021.09.17
3. 운영체제 Scheduling  (0) 2021.09.10
2. 운영체제 Process  (0) 2021.09.09
1. 운영체제 Introduction  (0) 2021.09.09

댓글