패스트캠퍼스

운영체제 - 가상 메모리

돌맹이시터 2020. 12. 10. 19:23

<fastcampus - 운영체제 - 가상메모리>

가상 메모리 개념

페이징 시스템

다중단계 페이징 시스템과 페이징 시스템 장점

페이지 폴트

페이지 교체 알고리즘

세그멘테이션 기법

가상메모리 동작 총정리

 

페이징 시스템 (Paging system)

 

 

 

크기가 동일한 페이지로 가상 주소공간과 이에 매칭하는 물리 공간을 관리

하드웨어 지원 필요

ex) intel x86(32bit) 시스템에서는 4KB, 2MB, 1GB 지원

ex) 리눅스에서는 4KB로 paging

페이지 번호를 기반으로 가상주소/물리주소 매핑정보를 기록/사용

 

 

 

리눅스 -> 프로세서(4GB)의 PCB(process control block)에 Page Table 구조체를 가리키는 주소가 들어있음

page table에는 가상주소와 물리주소간 매핑정보가 있음

 

cpu가 가상주소에 접근하려하면 

가상주소를 통해 어떤 페이지 번호인지 알 수 있고,  

해당 page table에서 해당 가상주소에 매칭하는 물리주소를 알아내고,

그 물리주소에 들어가서 실제 코드나 데이터정보를 가지고 cpu에서 처리한다.

 

 

page 또는 page frame : 고정된 크기의 block (4KB)

 

 

 

 

 

 

* 가상 주소 v = (p,d)

 

•p : 가상 메모리 페이지

•d : p 안에서 참조하는 위치(변위, 즉 page에서 어느정도 gap이 있는지)

 

ex)

intel x86(32bit) 환경에서 페이지 크기 = 4KB인 상황을 가정,

가상 주소의 0비트에서 11비트가 변위(d)를 나타내고

12비트 이상이 페이지 번호가 될 수 있다.

 

->

물리 주소 + d = 실제 물리메모리의 해당 데이터 위치

 

 

 

 

** 프로세스가 4GB를 사용하는 이유

32bit 시스템에서 2의 32승이 4GB

 

 

 

 

* 페이지 테이블 (page table)

 

•물리 주소에 있는 페이지 번호와 해당 페이지의 첫 물리 주소정보를 매핑한 표

가상주소 v = (p,d) 라면

p : 페이지 번호

d : 페이지 처음부터 얼마나 떨어져있는 위치인지

 

•해당 프로세스에서 특정 가상 주소 액세스를 하려면

1. 해당 프로세스의 page table에 해당 가상 주소가 포함된 page 번호 확인

( PCB에 page table의 base 주소, 페이지 번호를 알아냄 -> page table에서 해당 페이지를 찾아냄)

2. page번호가 있다면 해당 page가 매핑된 첫 물리 주소를 알아내고 (p')

3. ( p'+d ) 가 실제 물리 주소가 된다.

 

 

 

출처 : 패스트캠퍼스 강의자료

 

위의 표는 

페이징 시스템 관련하여 지금까지 다루었던 내용의 예시이다.

주황색으로 표시된 aspect라는 데이터/코드에 접근하려 할 때

어떤 방식으로 진행되는지 조금 더 직관적으로 확인해볼 수 있다.

 

 

 

 

- 페이징 시스템과 MMU (컴퓨터 구조) 

 

 

 

 

•cpu가 가상주소에 접근 시

MMU 하드웨어 장치를 통해 물리 메모리에 접근

 

•프로세스 생성 시, page table 정보 생성

-> PCB 등에서 해당 페이지 테이블에 접근 가능, 관련 정보는 물리 메모리에 적재

-> 프로세스 구동 시, 해당 page table 의 base 주소가 별도의 레지스터에 저장된다. (CR3)

-> cpu가 가상주소에 접근할 때, MMU가 page table - base 주소에 접근해서 물리주소를 가져온다.

 

 

 

 

 

 

다중 단계 페이징 시스템

 

 

- 다중 단계 페이징 시스템 

 

 

32bit 시스템에서 4KB 페이지를 위한 페이징 시스템은

•하위 12bit는 오프셋

•상위 20bit가 페이징 번호

-> 2²⁰ 개의 페이지 정보가 필요함

 

 

페이징 정보를 단계를 나누어 생성

-> 필요없는 페이지는 생성하지 않는다. (공간 절약)

 

 

/ 페이지 번호를 나타내는 bit를 구분해 단계를 나눈다. 

(리눅스->3단계,  최근에는 4단계)

 

 

출처 : 패스트캠퍼스 강의자료

 

 

 

 

 

 

- MMU와 TLB (컴퓨터 구조)

 

 

출처 : 패스트캠퍼스 강의자료

 

 

MMU가 어떻게 동작하는지 도식화된 자료이다.

 

1. cpu가 가상메모리를 요청하면  

2. MMU가 CR3 레지스터의 값을 가지고 페이지 테이블에 들어간다.

3. 해당 물리주소를 가져온다.

4. 물리주소에 해당되는 페이지의 해당 데이터에 접근

5. 해당 데이터를 cpu에 전달

 

-> 레지스터를 처리할 때보다 메인 메모리에 접근하는 시간이 더 오래 걸릴 수 있다.

따라서 별도의 캐쉬 보조 하드웨어를 사용한다. 

=> TLB (Translation Lookaside Buffer) : 페이지 정보 캐쉬

 

 

패스트캠퍼스 강의자료

 

TLB라는 별도의 캐쉬 보조 하드웨어를 사용하였을 경우를 나타낸다.

 

 

cpu에서 가상주소를 요청하고,

MMU가 물리주소를 얻어오면 

A라는 가상주소를 입력해서 A`라는 물리주소를 얻었을 경우

이 정보를 TLB에 저장, (최근에 가상주소->물리주소로 변환된 정보를 저장)

A라는 가상주소를 재요청할 경우 MMU단계에서 TLB에 A에 대한 정보가 있는지를 먼저 탐색

가상주소 A에 상응하는 물리주소 정보가 있는 경우 다음 단계를 생략할 수 있게 되는 것이다.

 

-> 물리주소를 얻기 위해 메모리에 접근하는 횟수를 줄일 수 있게 된다.

 

 

 

 

 

 

- 페이징 시스템과 공유 메모리

 

 

 

* 프로세스 간 동일한 물리주소를 가리킬 수 있다. (공간 절약, 메모리 할당 시간 절약)

 

패스트캠퍼스 강의자료

예를 들어

fork (프로세스를 그대로 복사)하고자 할 때

동일한 물리주소를 가리키게 하기만 하면 된다.

 

 

 

 

* 물리주소에 데이터 수정 시도 시, 물리 주소를 복사할 수 있다. (copy-on-write)

 

 

 

새로 생긴 프로세스B or 원래 프로세스A가 데이터를 수정하고자 할때에는

물리 메모리에서 해당 내용을 복사하고,

데이터의 변경을 원하지 않는 프로세스에 새로운 물리주소를 부여한다.

 

 

=> 동일한 물리주소를 부여해두고 데이터 수정을 하는 경우에만 새로운 주소를 부여하면 되기 때문에

프로세스 생성 시간을 단축시킬 수 있다.

 

=> 커널, 공유메모리 등 공유 데이터는 물리메모리 공간 공유 가능 -> 공간절약

 

 

 

 

 

 

 

페이지 폴트 (page fault) - interrupt

 

 

 

- 요구 페이징 (Demand paging or Demanded paging)

 

 

프로세스의 모든 데이터를 메모리로 적재하지 않고,

실행 중 필요한 시점에만 메모리로 적재함

 

필요하지 않은 페이지 프레임은 다시 저장매체에 저장 (페이지 교체 알고리즘 필요)

<->

선행 페이징(anticipatory paging)

: 미리 프로세스의 모든 데이터를 메모리에 적재해두고 실행

 

 

 

 

- 페이지 폴트 (page fault) - interrupt

 

 

어떤 페이지가 물리메모리에 없을 때 일어나는 인터럽트

page fault가 일어나면, OS가 해당 페이지를 물리 메모리에 적재

 

패스트캠퍼스 강의자료

 

1. cpu가 가상주소 요청

2. MMU가 TLB를 먼저 체크(해당 물리주소가 이미 있는지)

해당 물리주소를 아직 모르는 상태라면 CR3를 이용해 페이지 테이블에 접근,

물리주소의 valid/invalid 상태 확인,  

invalid (물리주소에 들어있지 않은 상태)라면 

page fault interrupt 발생 -> OS에서 저장매체에서 해당 페이지를 찾아서 물리 메모리에 적재 & 페이지테이블 업데이트

3. cpu에 다시 실행 요청

 

( page fault -> IDT -> page fault번호 -> OS 내부 함수 호출 )

 

 

 

* page fault 자주 일어나면

실행되기 전에, 해당 페이지를 물리 메모리에 적재해야 함 -> 시간이 오래 걸린다.

 

* page fault 일어나지 않게 하려면

향후 실행/참조될 코드/데이터를 미리 물리메모리에 적재 (불가능)

 

 

 

 

 

 

 

페이지 교체 알고리즘

 

 

- 페이지 교체 정책 (page replacement policy)

 

특정 페이지를 물리메모리에 올리려는데, 물리메모리가 다 차있다면?

•기존 페이지 중 하나를 물리메모리에서 저장매체로 내리고 (저장)

•새로운 페이지를 해당 물리메모리 공간에 올린다.

 

 

 

* 페이지 교체 알고리즘 (FIFO, first in first out)

 

패스트캠퍼스 강의자료

 

페이지 1,3,4가 사용중이라는 상황을 가정,

페이지2의 사용을 요청했을 경우

FIFO 정책에 따른다면, 페이지1이 빠지면서 그 자리에 페이지2가 들어가게 된다. (교체)

 

 

 

 

* 페이지 교체 알고리즘 (OPT, OPTimal replacement algorism, 최적 페이지 교체)

 

•앞으로 가장 오래 사용하지 않을 페이지를 내린다.

•일반 os에서는 구현 불가

 

-> 사실상 불가능에 가깝다.

 

 

 

 

* 페이지 교체 알고리즘 (LRU, Least Recently Used)

 

가장 오래전에 사용된 페이지 교체

•OPT 교체 알고리즘 구현이 불가능하므로, 과거기록을 기반으로 시도

 

 

 

 

* 페이지 교체 알고리즘 (LFU, Least Frequently Used)

 

• 가장 적게 사용된 페이지 교체

 

 

 

* 페이지 교체 알고리즘 (NUR, Not Used Recently)

 

•LRU와 마찬가지로 최근에 사용하지 않은 페이지부터 교체

•각 페이지마다 참조비트(R), 수정비트(M)를 둔다. (R,M)

-> (0,0), (0,1), (1,0), (1,1) 순으로 페이지 교체

 

패스트캠퍼스 강의자료

 

위의 상황을 가정했을 때,

NUR에서는

앞에서 다루었던 다른 알고리즘에서와는 다르게

page2가 교체된다.

 

 

 

**

LRU(least recently used) 알고리즘이 가장 많이 쓰인다고 한다.

 

 

 

 

* 스레싱 (Thrashing)

 

fastcampus 강의자료

 

page fault가 반복적으로 발생해서,

과도하게 페이지 교체 작업이 일어나므로 실제로 아무런 동작도 할 수 없는 상황을 Thrashing 이라고 한다.

 

 

 

 

 

 

세그멘테이션 기법 (Segmentation)

 

 

 

 

- 세그멘테이션 기법 (segmentation)

 

 

* 가상 메모리를 서로 크기가 다른 논리적 단위인 segment로 분할

페이징 기법에서는 가상메모리를 같은 크기의 블록으로 분할

ex) x86 리얼모드 - CS(code segment), DS(data segment), SS(stack segment), ES(extra segment)로 나누어 메모리 접근

 

** x86 리얼모드

인텔의 cpu번호 80286에서 보호모드를 지원(protection ring -> kernal/user mode 지원)

기존 8086/80186 cpu 체제에서 만든 소프트웨어가 호환되도록 만든 모드를 뜻한다.

 

 

* segment 가상주소

v = (s,d) : s는 세그먼트 번호, d는 블록 내 세그먼트의 변위

 

fastcampus 강의자료

 

 

* segmentation은 크기가 다른 segment 단위로 물리메모리에 로딩

 

 

fastcampus 강의자료

 

페이징 기법에서는 일괄적으로 쪼개서 물리메모리에 데이터를 넣은 반면,

segmentation 기법에서는 다른 크기의 segment단위로 물리메모리에 적재한다.

 

 

 

**

 

paging 기법

-> 내부 단편화,

페이지 블록만큼 데이터가 딱 맞게 채워져있지 않을 때 공간 낭비가 발생

(ex: 각 단위는 4KB, 어떤 페이지는 1KB일 때 3KB만큼의 공간낭비가 발생)

 

segmentation 기법

-> 외부 단편화,

물리메모리가 원하는만큼의 연속된 크기의 메모리를 제공하지 못하는 경우가 발생

 

paging & segmentation

-> 모두 하드웨어 지원 필요,

다양한 컴퓨터 시스템에 이식성을 중요시하는 리눅스는 페이징 기법을 기반으로 구현

cpu의 제조사가 다양한데, 일부는 segmentation을 지원하지 않는 경우 등이 있을 수 있기 때문에

주로 paging 기법을 기반으로 구현되었다고 한다.