on
운영체제 - 22
KOCW 운영체제 22강
양희재 교수님 강의를 듣고 쓴 글입니다.
Segmentation 안쓰는 이유
논리적 단위 로 나눠 메모리에 올린다는 것은 좋았다. 근데 이렇게 하면 의문이 하나 생긴다.
External fragment(외부 단편화) 피하려고 page단위로 잘게 자른거 아니었나…?
Segmentation은 논리적 단위로 프로세스를 나누다 보니 또 다시 외부 단편화가 발생할 수 있다는 문제가 있다.
물론 protection & sharing 에 있어서는 paging보다 더 좋을 수 있지만 우리가 해결하려고 했던 문제가 다시 생긴 것이다.
Paging + Segmentation
- Segmentation: protection & sharing 면에서 효과적
- Paging: 외부 단편화 문제 해결
→ Segment를 paging 하자!! ➡ paged segmentaion
How..?
- main memory에 loading할 때 Segmentation진행.
- Segmentation이 된 영역에 대해서- paging진행.
이를 paged segmentation 이라 한다.
Overhead
위 방법은 굉장히 좋아보이지만 주소변환의 과정에 있어서 overhead가 크다는 단점이 있다.

위 그림처럼 segment table → paging table → memory 순서로 2개의 table을 거쳐서 메모리에 도착하게 되기에 overhead가 크다.
지금까지 메모리 낭비를 줄이기 위한 대표적인 방법으로 Segmentation, paging 을 배웠다.
Virtual Memory
memory management의 마지막 가상메모리에 대해 배울 것이다.
만약 memory보다 큰 프로세스를 실행시켜야 한다면…?
메모리의 크기가 100MB라고 가정해보자. 우리는 우리의 보조기억장치에서 200MB 크기의 프로그램을 실행시키고 싶다. 하지만 메모리에 loading하기에는 메모리의 크기가 부족하다… → 이 프로그램은 영원히 실행될 수 없는 것일까?
당장 프로그램의 모든 것을 load할 필요는 없다.
정답은 당연히 할 수 있다! 이다.
나는 메모리에 프로세스의 code, data, stack 을 다 올려야 한다고 생각했다. 하지만 프로세스를 실행시킬 때 당장 안쓰이는 루틴들이 많다. 따라서 ‘지금 당장 필요한 것(demand page)들만 올린다’.
Demand Paging
- 프로세스의 이미지는 backing store에 저장.
- 프로세스는 page의 집합.
- 지금 필요한 page만 메모리에 올린다 ➡ demand page만 loading
process가 context-switching할 때마다 page table도 달라진다.
Demand Paging을 위한 Hardware
- valid bit가 추가된 page table
- backing store(== swap device)

- valid bit:- page #에 해당하는- frame #이 메모리에 없다면, valid bit로 없다는 표시를 해준다.
Page Fault
- 접근하려는 page가 메모리에 없다  → invalid
- CPU는 OS의 page fault처리 루틴으로 간다.
- OS가 보조기억장치 탐색 후 찾으면 main memory 로 가져온다.
용어 정리
- 
    Pure demand paging: backing store에서 진짜 필요한 page만 load.처음에 아무것도 loading안하고 시작. - 장점 : 필요할 때마다 필요한 page만 loading하기 때문에 메모리가 절약된다.
- 단점 : 매번 필요한 page를 loading해야되기 때문에 page fault가 많이 발생한다.
 
- 
    prepaging: 미리 page를 load.- 장점 : page fault가 적게 일어난다. 따라서 속도가 빠를 수 있다.
- 단점 : 필요없는 page까지 loading해놔야 하기 때문에 메모리 낭비가 있을 수 있다.
 
- 장점 : 
Swapping vs Demand Paging
- Swapping: 프로세스 전체를 backing store와 메모리 사이에서 옮기는 것.
- Demand Paging: page단위로 backing store와 메모리 사이에서 옮기는 것.
Paging
- external fragmentation
    - 프로세스를 page으로 나눔
- 메모리를 frame으로 나눔.
 
Protection and Sharing
- protection : 해킹 등등 방지
    - 모든 주소는 page table을 경유하기에 page table entry 마다 r, w, xbit를 둬서 해당 page에 대한 접근 제어가 가능하다.
 
- 모든 주소는 page table을 경유하기에 page table entry 마다 
- Sharing : 메모리 낭비 방지
    - 같은 프로그램이 쓰는 복수개의 thread가 있다면, code영역은 공유 가능하다.
- 같은 프로세스에 대해 page table의 코드 영역이 같은 곳을 가리키게 한다 → 코드 영역을 공유함으로써 메모리 낭비 방지
 
Segmentation
- 프로세스를 논리적으로 잘라서 메모리에 배치.
    - 프로세스는 segment의 집합이다.
- segment의 크기는 같지 않을 수 있다.
 
- 프로세스는 
- segment를 memory에 할당- MMU 내의 relocate register의 값을 바꿔서 CPU는 프로세스가 연속된 메모리 공간에 위치한다고 착각하게 된다.
- MMU는 segment table이 된다.
 
Segment table
이전 포스팅에서 했던 page table과 흐름이 비슷하다. 대신에 크기가 일정하지 않기에 limit가 필요하다.

MMU의 base, limit를 참고하여 메모리에 접근함을 알 수 있다. 접근하는 것은 paging 포스팅이랑 비슷하다. 하지만 limit를 넘어서게 되면, Segment violation으로 예외처리가 된다.
Protection and Sharing
- protection
    - paging과 마찬가지로 segment table마다r, w, xbit 둬서 접근을 제어한다.
 
- paging과 마찬가지로 
- Sharing
    - paging과 비슷하다
 
Paging vs Segmentation
- Paging : 일정 크기로 잘라서 loading
- Segmentation : 논리적 크기로 잘라서 loading
근데 프로세스는 code, data, stack 영역으로 이뤄져 있다. 그 뜻은 paging같은 경우 code와 data영역이 동시에 존재하는 page가 생길 수 있다는 뜻이다. 따라서 논리적으로 분리하는 segmentation이 더 우월하다고 한다.
BUT!! 대부분의 OS는 paging을 쓴다고 한다. 자세한 이유는 다음 포스팅 때…