Virtual Memory1

Seongho·2022년 6월 5일
1

운영체제

목록 보기
8/12

간단한 문제

&n으로 출력되는 주소는 virtual address이다. 그렇게 때문에 다시 컴파일하지 않는다는 가정 하에 virtual address는 같다. 하지만, 운영체제의 발달로 보안을 위해 실행때마다 랜덤하게 할당하는 경우도 있다^^

가상 메모리

운영체제는 CPU에서 프로세스의 당장 수행하는 부분만 메모리에 올려두고, 그렇지 않은 부분은 디스크의 swap area에 올려두었다가 다시 필요해지면 메모리와 스왑 영역을 교체하는 방식을 사용한다. 프로세스는 0부터 시작하는 자신만의 가상메모리를 갖는데(process의 virtual address space는 완전히 독립적), 각각의 프로세스의 virtual address와 physical address를 매핑시키는 것이 운영체제의 역할이다.
** 어떤 프로세스의 virtual address에 매핑되는 physical address는 그때그때 다름!!

가상 메모리 사용의 장점

  • Abstracts main memory into an extremely large, uniform array of storage
    (메인 메모리를 매우 크고 균일한 스토리지 어레이로 추상화)
  • Frees programmers from the concerns of memory-storage limitations
    (프로그래머가 메모리 스토리지 제한에 대한 우려에서 벗어남)
  • Allows the execution of processes that may not be completely in memory
    (메모리에 완전히 올라가지 않은 프로세스를 실행할 수 있음)
  • More programs could be run at the same time
    (여러개의 프로그램이 동시에 실행될 수 있음)
  • Less I/O would be needed
    (프로세스 전체는 메모리에 올릴 때 소요되는 I/O 오버헤드가 적음)
  • Allows processes to easily share files and address spaces
    (프로세스가 파일 및 주소 공간을 쉽게 공유할 수 있도록 지원함)
  • Efficient for protection and process creation
    (메모리 보호와 프로세스 생성에 효율적임)

단점

fixed partition보다 성능이 안좋다.

가상 메모리 기법(virtual <-> physical)

  1. Paging
  2. Segmentation

Paging

virtual memory를 모두 같은 크기의 page로, physical memory를 고정된 크기의 frame으로 나누어 프로세스 당 page table을 두어 page와 frame을 매핑시키는 기술이다. 그러니까, n개의 page를 메모리에 적재해 실행시키기 위해서는 n개의 free frame이 필요하다. 페이지 테이블을 관리하는 것은 운영체제이니, 모든 free frame에 대한 정보도 운영체제가 갖고있다.
++page size == frame size
실제로 physical memory에 할당된 프로세스는 흩어진 상태로 존재하는데, program(User-Application)에게는 virtual-physical mapping이 보이지 않고 연속적이고 대용량의 address space로 보인다. program끼리는 각각의 virtual address space를 갖고, 운영체제가 physical address space에 매핑시키기 때문에, 서로의 메모리 영역을 침범할 수 없다.(protection)

Paging의 원리

Virtual Address Space : VPN(페이지 테이블의 인덱스) + Offset
Physical Address Space : PFN(frame number) + Offset
VPN 을 PFN으로 변환시키는 것이 page table의 역할이다.
페이지 테이블의 한 줄인 PTE당 하나의 page가 들어있으니, 하나의 PTE당 하나의 VPN이 있다고 생각하면 된다.

Paging

* Page table register는 프로세스들의 page table 주소를 갖고 있다.

  • Valid Bit이 1이면 physical memory에 데이터가 있는 것으로, 바로 메모리에 접근하고, Valid Bit이 0이면 찾는 데이터가 physical memory에 없고 디스크에 있는 것이다.

PTE 구조

  • Valid Bit(V) : PTE에 매핑되는 프레임이 physical memory에 존재하면 1로 set
    해당 PTE가 사용될 때마다 체크한다. Valid Bit을 체크한다.
  • Reference Bit(R) : 해당 페이지가 참조된 적이 있으면 1로 set
  • Modify Bit(M) : 해당 페이지가 수정되었으면 1로 set (페이지가 메모리에 올라와서 write되었는지?)
  • Protection Bit(Prot) : 메모리 protection을 위해서 페이지에 허용된 동작(read, write, execute)을 나타낸다.

Paging 장점

  • 운영체제가 free frame에 대한 리스트를 갖고있기 때문에 physical memory에 매핑시키는 것이 쉽다.
  • 페이지와 같은 고정된 크기로 프레임을 자르기 때문에 external fragment가 없다.
  • 모든 페이지 사이즈가 같아서 swaping이 쉽다.
  • 프로세스마다 페이지 테이블을 갖고 있어서 불법적인 페이지 접근을 막을 수 있다.
  • 페이지 공유가 쉽다.

Paging 단점

  • internal fragment가 존재한다.
  • memory reference overhead(performance overhead)가 존재한다. 페이지 테이블에 한번, 프레임에 한번. 총 두번 접근하기 때문이다. ->TLB를 사용함으로써 해결
  • 페이지 테이블은 메모리에 올라가는데, 페이지 테이블의 크기가 너무 크다. (space overhead)
    ->page the page table, multi-level page table, inverted page table로 해결

Demand Paging

  • Demand Paging 기법은 프로세스를 구성하는 모든 physical 메모리에 있는 프레임을 한꺼번에 적재하는게 아니라 당장 사용될 프레임만 메모리에 적재하는 기법이다. 프로세스 전체를 메모리에 적재하는데 소요되는 I/O 오버헤드를 줄일 수 있고, 메모리 사용량을 줄일 수 있다. 메모리 사용량이 줄어드니, 더 많은 프로세스가 메모리에 적재될 수 있다.
  • Demand Paging에서 운영체제는 메모리를 캐시처럼 사용한다.
  • 프로세스가 실행되는 동안 일부 프레임만 메모리에 올라와있고, 나머지는 디스크 스왑 영역에 존재한다. PTE의 Valid Bit이 1이면 페이지에 매핑되는 프레임이 메모리에 적재되어 있다는 것이고, 0이면 디스크에 있다는 것이다. 메모리에 적재되었던 프레임이 Evict 되어 스왑 영역으로 가면 해당 프레임에 매핑되는 페이지의 Valid Bit이 0으로 초기화된다.
  • CPU가 참조하려는 페이지가 현재 메모리에 적재되어 있지 않아 Valid Bit이 0으로 세팅되어 있는 경우 Page Fault라 한다.

Demand Paging이 가능한 이유

locality가 존재하기 때문이다.

  • temporal locality : 최근에 접근한 위치가 곧 다시 접근될 확률이 높다.
  • spatial locality : 최근에 접근한 위치화 가까운 위치가 접근될 확률이 높다.

Page Fault

  • CPU가 쫒겨난(evicted) 페이지의 virtual address를 참조할 때 생기는 이슈이다.
    페이지가 메모리에서 swap 영역으로 쫒겨날 때, 운영체제는 해당 페이지의 valid bit을 0으로 초기화 하고, swap영역에서의 페이지 값(frame address)을 저장한다. 운영체제가 evicted page에 접근하려면 exception 중 trap이 발생한다.

왜 'Demand' Paging인가

프로세스가 생성되면 페이지 테이블이 하나 생성되는데, 이때, 모든 PTE의 valid bit은 0으로 세팅된다. 이 프로세스가 실행되면 code pages와 data pages가 page fault가 나면서 메모리에 적재된다. 이를 cold page fault라 한다.
결국, 현재 당장 필요한(요구되는)페이지만 메모리에 적재하기 때문에 'Demend Paging'이라 한다.

paging과 segmentation 쉬운 비유

paging이 돼지고기를 1cm씩 그냥 잘랐다면, segmentaion은 항정살, 목살, 삼겹살.. 등으로 자른 것

Segmentation

  • Partitions memory into logically related data units
    (메모리를 논리적으로 관련된 데이터 유닛으로 쪼개어 관리하는 방법 ex)code, data, heap..)
  • Users view memory as a collection of variable-sized segments
    (User-Application에게는 메모리가 가변적인 사이즈의 segments의 집합으로 보인다.)
  • Different segments can grow or shrink independently
    (segments들은 늘었다가 줄었다가 할 수 있다.)
  • 프로세스 하나당 여러개의 segments를 갖는다.
    **논리적으로 관련된 데이터들이 모여 segment를 구성한다.

Segmentation 원리

physical address = base[s] + d이다. 이때, base[s] + d > base + limit이면 protection fault가 발생한다.
ex) 논리주소 (2, 100) => 4300 + 100 = 4400(physical address) < 4700(base+limit)
논리주소 (1, 500) => 6300 + 500 = 6800(physical address) > 6700(base+limit) (protection fault)

Segmentaion 장점

  • 증가하거나 감소하는 자료구조(스택, 힙)를 다루는 것이 단순하다.
  • Esay to protect segments : Protection bits (read/write/execute)가 세그멘테이션에도 있는데, 세그먼테이션은 메모리를 논리적으로 나누기 때문에 각각의 영역이 섞이지 않는다. 페이징은 code + data + stack 영역이 있을 때 이를 일정한 크기로 나누므로 여러 영역이 섞일 수가 있기 때문에(ex/ code+data) protection bit를 설정하기가 매우 까다롭다.
  • Easy to share segments : 페이징에서는 code 영역을 나눈다해도 다른 영역이 포함될 확률이 매우 높다. 하지만 세그먼테이션은 정확히 code 영역만 나누기 때문에 더 효율적으로 공유를 수행할 수 있다.

Segmentaion 단점

  • External fragmentation : 세그먼테이션은 메모리를 논리적인 단위로 나누기 때문에 세그먼트의 크기가 다양하다. 따라서 크기가 다른 각 세그먼트를 메모리에 두려면 동적 메모리 할당을 해야 한다. 이로 인해 다양한 크기의 hole이 발생하므로 external fragmentation의 문제가 발생한다.
  • segment table의 크기가 너무 크다.
  • 프로세스 간 segment 공유를 위해서는 segmentaion 주소를 갖는 포인터를 갖고 있어야 한다.

Paging과 Segmentation을 결합

Segment를 페이징한다. 논리적으로 관련된 코드를 segment로 만들고 하나의 segment를 여러개의 page로 쪼개어 사용하고 페이지 사이즈의 배수로 segment를 만든다. segment를 페이지 단위로 쪼갰기 때문에, swaping을 할 때 페이지 단위로 이동할 수 있다. 따라서 external fragmention이 없다.

profile
Record What I Learned

0개의 댓글