> For the complete documentation index, see [llms.txt](https://cs-study.gitbook.io/os-study/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cs-study.gitbook.io/os-study/9..md).

# 9. 페이징, 세그멘테이션, 가상메모리

발표자: 오령기

> **내부단편화**

메모리를 할당할 때 프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비 되는 현상을 말한다.

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2FpaHrORPK3z2j6HmVBVZw%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202022-09-28%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%209.49.19.png?alt=media&amp;token=6e2eccdc-6c49-4440-be71-f0302f803fe1" alt=""><figcaption></figcaption></figure>

* 작은 크기의 메모리 공간이 남아서 해당 메모리 사용 못함

> **외부단편화**

여유 공간이 여러 조각으로 나뉘는 현상을 말한다. 즉 작업보다 많은 공간이 남아 있더라도 실제로 그 작업을 받아 들이지 못하는 현상을 말한다.

&#x20;

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2FGwq9DQ3qiL0uJ3rPGpCO%2Fimage.png?alt=media&amp;token=c9b9285b-69b9-4069-a32a-e06988ced490" alt=""><figcaption></figcaption></figure>

* 요청한 메모리 공간보다 더 남아있지만 메모리 공간이 연속적이지 않아 할당 못함

> **페이징(Paging)**

**페이징 기법**(paging)은 컴퓨터가 메인 메모리에서 사용하기 위해 2차 기억 장치로 부터 데이터를 저장하고 검색하는 메모리 관리 기법이다. 즉 가상기억장치를 모두 같은 크기의 블록으로 편성하여 운용하는 기법이다. 이때의 일정한 크기를 가진 블록을 **페이지**(page)라고 한다. 주소공간을 페이지 단위로 나누고 실제기억공간은 페이지 크기와 같은 프레임으로 나누어 사용한다.

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2FhVEjIaJjel0CE8Iz8cxu%2Fimage.png?alt=media&amp;token=9be5e5fb-0f8a-458a-9a5f-ce9b6c767e97" alt=""><figcaption><p>페이징</p></figcaption></figure>

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2FIUu5v9V6699LGKvkF9Gv%2Fimage.png?alt=media&amp;token=ce2831e9-762e-4b85-85ec-580bac4e04b3" alt=""><figcaption><p>Page table 의 Mapping 과정</p></figcaption></figure>

* 외부 단편화 해결
* 내부 단편화 발생

&#x20;

**페이징 내부 단편화 발생 이유**

일정 크기로 자르다가 그 크기보다 작은 크기로 잘리면 남는 공간이 생기므로 내부 단편화 발생!

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2F5im2eVE2Bv5e5wzh3mXg%2Fimage.png?alt=media&amp;token=39d8e2c7-415f-4a90-a6e9-19e763d0c297" alt=""><figcaption><p>예시</p></figcaption></figure>

> **세그멘테이션**

프로세스를 논리적 내용(세그멘트)으로 잘라서 메모리에 배치하는 기법이다. 프로세스는 세그멘트의 집합이다. 세그멘트의 크기는 일반적으로 같지 않다.

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2FfHcB0Unhijn6J7PR5GEO%2Fimage.png?alt=media&amp;token=030ffa5e-2674-496d-9a98-49b7b81fa106" alt=""><figcaption><p>세그멘테이션</p></figcaption></figure>

세그먼트 기법 작동 과정

&#x20;

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2FrujKTubL6bv3U6ncl0OY%2Fimage.png?alt=media&amp;token=a26ddbf7-d3f6-48bd-a9d5-e3631578ffa9" alt=""><figcaption></figcaption></figure>

세그멘테이션 기법은 외부단편화 발생하므로 메모리 낭비 크다. 따라서 현재 대부분 페이징 기법을 사용한다.

> **세그멘테이션 + 페이징**

세그멘테이션의 메모리 낭비 극복하기 위해 세그먼트 안에 별도의 페이지 테이블 생성

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2FwDPUZ0f8SnD684NA4F7W%2Fimage.png?alt=media&amp;token=efb5c8cd-9195-476a-b9fe-1dd21c9dfe1c" alt=""><figcaption></figcaption></figure>

테이블 두 단계를 거치다보니 주소변환하는데 시간이 더 걸림 (오버헤드 발생)

> **가상메모리**&#x20;

물리적인 메모리 크기를 극복하기 위해 등장.&#x20;

&#x20;

> **요구 페이징(Demand paging)**

지금 필요한 페이지만 메모리에 올리는 기법

<figure><img src="https://1131902653-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fexfu4hpVR2H9xLvepQp6%2Fuploads%2FswLH2Dyt334o3viX0sXx%2Fimage.png?alt=media&amp;token=23d00e01-5da5-448a-af09-6f5ec193b9ff" alt=""><figcaption></figcaption></figure>

**pure demand paging vs prepaging**

필요할때만 가져옴 vs 미리 필요할 것을 가져옴

메모리 절약, 속도 느림 vs 메모리 낭비, 속도 빠름

> **페이지 결함(Page fault)**

페이지 결함이란 프로그램이 자신의 주소 공간에는 존재하지만 시스템의 RAM에는 현재 없는 데이터나 코드에 접근 시도하였을 경우 발생하는 현상을 말합니다. 페이지 결함이 발생하면 운영 체제는 그 데이터를 메모리로 가져와서 마치 페이지 결함이 전혀 발생하지 않은 것처럼 프로그램이 계속적으로 작동하게 해줍니다.

&#x20;

**페이지 결함 과정**

1. page table에 실행되어야 하는 번호의 주소 값이 없음(즉 메인 메모리에 없음)
2. Interrupt 발생
3. os에서 page fault 처리 루틴 실행
4. 보조기억장치에서 해당 번호의 page 찾음
5. 메인 메모리의 빈 공간에 해당 page 올림
6. page table에 올림
7. 다시 실행&#x20;

&#x20;

**Swapping vs Demend paging**

Swapping: 메모리랑 backing store가 전체 프로세스 단위로 왔다갔다 함

Demend paging: 페이지 단위로 왔다갔다 함

&#x20;

사진 출처

<https://code-lab1.tistory.com/54?category=1213006>

<https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-15.-%EA%B0%80%EC%83%81%EB%A9%94%EB%AA%A8%EB%A6%AC><br>
