운영체제 - 22

KOCW 운영체제 22강

양희재 교수님 강의를 듣고 쓴 글입니다.


Segmentation 안쓰는 이유

논리적 단위 로 나눠 메모리에 올린다는 것은 좋았다. 근데 이렇게 하면 의문이 하나 생긴다.

External fragment(외부 단편화) 피하려고 page단위로 잘게 자른거 아니었나…?

Segmentation은 논리적 단위로 프로세스를 나누다 보니 또 다시 외부 단편화가 발생할 수 있다는 문제가 있다.

물론 protection & sharing 에 있어서는 paging보다 더 좋을 수 있지만 우리가 해결하려고 했던 문제가 다시 생긴 것이다.


Paging + Segmentation

→ Segment를 paging 하자!! ➡ paged segmentaion


How..?

  1. main memory에 loading할 때 Segmentation 진행.
  2. Segmentation 이 된 영역에 대해서 paging 진행.

이를 paged segmentation 이라 한다.


Overhead

위 방법은 굉장히 좋아보이지만 주소변환의 과정에 있어서 overhead가 크다는 단점이 있다.

os22_1

위 그림처럼 segment tablepaging tablememory 순서로 2개의 table을 거쳐서 메모리에 도착하게 되기에 overhead가 크다.


지금까지 메모리 낭비를 줄이기 위한 대표적인 방법으로 Segmentation, paging 을 배웠다.


Virtual Memory

memory management의 마지막 가상메모리에 대해 배울 것이다.


만약 memory보다 큰 프로세스를 실행시켜야 한다면…?

메모리의 크기가 100MB라고 가정해보자. 우리는 우리의 보조기억장치에서 200MB 크기의 프로그램을 실행시키고 싶다. 하지만 메모리에 loading하기에는 메모리의 크기가 부족하다… → 이 프로그램은 영원히 실행될 수 없는 것일까?

당장 프로그램의 모든 것을 load할 필요는 없다.

정답은 당연히 할 수 있다! 이다.

나는 메모리에 프로세스의 code, data, stack 을 다 올려야 한다고 생각했다. 하지만 프로세스를 실행시킬 때 당장 안쓰이는 루틴들이 많다. 따라서 ‘지금 당장 필요한 것(demand page)들만 올린다’.


Demand Paging

process가 context-switching할 때마다 page table도 달라진다.


Demand Paging을 위한 Hardware

os22_2


Page Fault

  1. 접근하려는 page가 메모리에 없다 → invalid
  2. CPU는 OS의 page fault 처리 루틴으로 간다.
  3. OS가 보조기억장치 탐색 후 찾으면 main memory 로 가져온다.


용어 정리


Swapping vs Demand Paging

Paging


Protection and Sharing


Segmentation


Segment table

이전 포스팅에서 했던 page table과 흐름이 비슷하다. 대신에 크기가 일정하지 않기에 limit가 필요하다.

os22_1

MMU의 base, limit를 참고하여 메모리에 접근함을 알 수 있다. 접근하는 것은 paging 포스팅이랑 비슷하다. 하지만 limit를 넘어서게 되면, Segment violation으로 예외처리가 된다.


Protection and Sharing


Paging vs Segmentation

근데 프로세스는 code, data, stack 영역으로 이뤄져 있다. 그 뜻은 paging같은 경우 code와 data영역이 동시에 존재하는 page가 생길 수 있다는 뜻이다. 따라서 논리적으로 분리하는 segmentation이 더 우월하다고 한다.

BUT!! 대부분의 OS는 paging을 쓴다고 한다. 자세한 이유는 다음 포스팅 때…