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, x
bit를 둬서 해당 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, x
bit 둬서 접근을 제어한다.
- paging과 마찬가지로
- Sharing
- paging과 비슷하다
Paging vs Segmentation
- Paging : 일정 크기로 잘라서 loading
- Segmentation : 논리적 크기로 잘라서 loading
근데 프로세스는 code, data, stack 영역으로 이뤄져 있다. 그 뜻은 paging같은 경우 code와 data영역이 동시에 존재하는 page가 생길 수 있다는 뜻이다. 따라서 논리적으로 분리하는 segmentation이 더 우월하다고 한다.
BUT!! 대부분의 OS는 paging을 쓴다고 한다. 자세한 이유는 다음 포스팅 때…