Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

운기의 블로그

메모리 관리 전략, 가상메모리, 페이지 기법, 페이지 교체, 세그먼트 기법 #5 본문

운영체제

메모리 관리 전략, 가상메모리, 페이지 기법, 페이지 교체, 세그먼트 기법 #5

운띠야 2020. 2. 9. 11:45

메모리관리배경

메모리관리하는 방법에 대해 알기전에 " 왜 메모리관리를 해야하는가? " 에 대해 알아보려고 한다. 

 

다수의 프로세스들을 사용하면서 메모리 관리의 중요성은 대두되었다. 멀티 프로세스 환경에서는 보다 좋은 성능을 위해서 다수의 프로그램을 주 메모리에 올려놓아야 한다. 이때 메모리에 어느곳에 프로그램을 넣어주고, 다시 하드디스크로 보내는 역할을 운영체제에서 담당한다. 그렇기 때문에 적절한 메모리 위치에 프로그램을 적재하지 못할 경우 문제가 발생하게된다. 이 뿐만 아니라 메모리가 변경될 때 어떻게 하면 더 효율적이고 메모리 낭비를 방지 할 수 있는가에 대한 문제를 해결하기 위해 메모리 관리를 해야한다.

 


메모리 계층

 

우선 현재 컴퓨터에사 사용되는 메모리 계층에 대해서 먼저 알아 보겠습니다.

 

 

보조기억장치( 하드디스크)에 있는 프로그램은 주기억장치인 (RAM)에 올라가야지 CPU에서 사용할 수 있게 됩니다.

주기억장치에 올라간 프로그램은 (= 프로세스) 오랫동안 있을 수 없기에 다시 하드디스크로 보관되는 일을 계속해서 수행하게 됩니다. 

 

위에서 그림에서 우린 메모리 계층 구조를 확인할 수 있습니다.

가장 큰 하드디스크, RAM, CPU에 있는 레지스터, 거기에 그림에는 없지만 주메모리와 CPU사이 존재하는 캐시메모리까지 크게 4가지로 볼 수 있습니다.

 

 

https://chohyeonkeun.github.io/2019/08/02/190802-datastructure-b-tree/ 그림 참조 및 수정

 

계층 구조는 위에 그림과 같이 되어 있고

위에서 아래로 갈 수록

 

저장공간 과 크기는 커지게 됩니다. 

하지만 위로 갈수록 기술의 집약도가 높아지기 때문에 가격은 올라가고 속도는 빨라지게 됩니다. 

 

주메모리에서 하얗게 된 부분은 주 메모리의 일부를 보조메모리처럼 사용하는 기술입니다. 가상디스크라고도 하고 현재는 잘 사용하지 않는 기술입니다. RAM을 C드라이브 처럼 사용하는 기술이기에 최근에는 복원할 때 잠시 사용하는 용도가 주로 이고, 

 

보조메모리(하드디스크)에 분홍색으로 된 부분이 우리가 주목해서 봐야 할 곳입니다. 

보조메모리의 일부를 주메모리처럼 사용하는 기술인데 이것을 가상메모리라고 합니다.  

 


메모리 사용방식 변화

메모리는 프로그램의 크기가 크지 않았기에 주메모리만 사용해도 충분했습니다.

하지만 현재는 점점 커지는 프로그램 때문에 주메모리만 사용해서는 감당하기 힘들기에 관리방법이 변화하게 됬는데 

그 과정에 대해서 설명하겠습니다.

 

주기억 장치만 사용

빨간색은 프로그램 입니다.

프로그램이 CPU에서 사용되기 위해서는 주 메모리에 적재되어야 한다.

하지만 메모리를 단일로 사용하게 되면 하나의 프로그램이 올라왔을 때, 많은 공간이 생길 뿐 더러 CPU는 놀게 되는

상황이 발생하게 된다. 

 

이렇게 단일 프로그래밍 방식을 택하게 되면 CPU가 너무 놀게 되는 상황이 발생할 뿐더러 여러 프로그램을 사용하지 못하는 상황이 발생한다. 

 

이러한 상황을 막기위해 고안해낸 방식은 다중 프로그래밍 방식이다.

다중 프로그램 방식을 사용하기 위해서  "분할" 의 개념이 등장하게 된다.

 

색은 프로그램입니다.

이런식으로 여러 프로그램을 사용하기 위해서 메모리를 분할하게 됩니다.

여기서 분할은 고정분할 / 가변분할 로 나눠지게 됩니다.

 

하지만 최근에는 프로그램의 크기는 날이 갈 수록 커지게 됩니다. 

예를 들어 게임만 보더라도 과거에는 페르시안 왕자나 갤러그에 비해 롤, 오버워치, 배틀그라운드를 비교해보면

화려한 그래픽을 사용하기에 컴퓨터 사양이 올라갸아하는 것만 봐도 프로그램의 크기가 얼마나 증가했는지 알 수 있습니다.

 

보조기억 장치가 사용되는 이유 / 가상메모리 등장배경

 

이렇게 커진 프로그램을 주 메모리를 분할해서 사용하려면 프로그램 역시 작게 만들어서 분할해야 하는 문제가 생기게 되고 이러한 문제를 어떻게 해결 해야하는가에 대한 고민으로 보조기억장치의 도움을 받기로 한것입니다.

주기억장치 (RAM)의 크기는 보통 4GB ~ 8GB, 더 크게 사용하고 싶으면 RAM 여러개 끼닌 방식을 택합니다.

하지만 보조기억장치 (하드디스크)는 500GB~ 1TB 현재는 테라 단위까지 나왔기 떄문에 더 많은 양을 감당 할 수 있기 떄문입니다.

 


 

주 메모리 관리 방식

 

단일 프로그램

 

단일 프로그램일 때 프로그램이 작을 경우 메모리 사용방식의 첫번째 그림 처럼 그냥 사용하면 됩니다.

하지만 프로그램의 크기가 커질때 어떤 방식으로 사용해야 하는가에 고민으로 나온 기술이 오버레이(OVERLAY)

기술입니다.

 

하드디스크에 있는 프로그램의 크기가 커서 한번에 메모리에 적재가 불가능하게 될때, 

프로그램의 크기를 분할하여 필요한 프로그램의 부분을 메모리에 적재하면서 사용하는 것입니다.

 

프로그램의 부분인 1번을 먼저 메모리에 적재하고, 그 다음 2번, 3번 이런식으로 큰 프로그램을 분할하여

메모리에 적재하고 CPU에서 사용하면서 프로그램을 사용 할 수 있게 하는 방식입니다.

 

다중 프로그램

 

위의 방식은 주 메모리만 사용하면서 주메모리를 분할하지 않고 사용한 방식이라면 

하나의 프로그램만 사용하는게 아닌 여러 프로그램을 사용하기 위해서 메모리를 "분할" 한 방식에 대해서 설명하겠습니다.

 

다중프로그래밍에는 크게 고정분할과 가변분할로 나눠지게 됩니다.

 

 

1. 다중 프로그램 - 고정분할

 

그림이 알아보기 힘드시겠지만...

최대한 설명을 자세히 하겠습니다.

 

고정분할에서 헷갈리시면 안되는 부분은 모든 주 메모리의 공간을 모두 일정하 크기로 분할하는것이 아닙니다.

분할된 메모리 크기는 다르지만, 그 크기가 고정되어 있기 때문에 고정 분할이라고 하는 것입니다. 

 

1. 메모리를 분할하여 경계선에 대한 정보를 담고 있는것은 CPU에서 차폐레지스터라는 애가 기억을 하고 있습니다. 

(운영체제가 있는곳의 경계선은 다른 레지스터가 기억하고 있습니다!!)

 

2. 하드디스크에 대기하고 있는 프로그램은 18K, 5K, 90K, 80K, 72K / 메모리 분할된 크기는 30K, 50K, 100K, 10K, 70K

첫번째 18K 프로그램은 30K로 분할된 메모리로

두번째 5K 프로그램은 10K

세번쨰 90K 프로그램은 100K

네번째 80K 부터 문제가 생기게 됩니다.

다섯번쨰 72K 역시 문제가 생기게 됩니다.

 

3. 문제를 해결하기전에 여기서 단편화에 대해서 먼저 알아보도록 하겠습니다.

 30K로 분할된 메모리에는 현재 18K 프로그램이 들어왔기 떄문에 12K라는 공간이 존재하게 됩니다. 

이런식으로 남게되는 단편화를 내부 단편화라고 합니다.

 

하지만 사용되지도 못한 50K, 70K 공간은 외부 단편화라고 합니다.

 

4. 여기서 보시면 10K로 분할된 메모리 공간은 5K 프로그램이 차지하고 있기 때문에 5K의 내부단편화가 발생합니다

그런데 바로 인접한 공간에 70K로 분할된 메모리 공간과 함꼐 이용하면 72K짜리 프로그램을 사용할 수 있게 됩니다. 

이럴때 위에 설명했던 차폐 레지스터의 도움으로 인접된 공간을 사용 할 수 있게 합쳐주는데,

 

이러한 기술을 "통합" 이라고 하고, 통합된 공간을 통해 72K 프로그램을 사용할 수 있게 됩니다.

 

 

2. 다중 프로그램 - 가변분할

 

 

고정분할과는 다르게 가변(동적) 분할은 메모리를 먼저 분할하는 방식이 아닌 프로그램의 크게에 맞게 끔 그때 그때 분할해서 사용하는 방식입니다. 

 

1. 하드디스크 18K , 5K, 90K, 80K, 72K가 존재하면 메모리 역시 그 크기에 맞게 분할하여 사용합니다.

 

2. 그렇게 되면 남는 분할된 메모리에서 사용이 안되는 부분이 있다면 그 부분은 외부단편화가 되는 것입니다.

 

 

다시 정리하면 

 

주 기억장치만 사용하는 방식에는 크게 

 

1. 단일 프로그래밍

2. 다중 프로그래밍

 

으로 나누어지게됩니다. 

 

단일 프로그래밍의 방식에는 OVERLAY 방식이 대표적이고

다중 프로그래밍 방식에서는 고정분할 , 가변분할로 나누어지게됩니다.

 

그리고 고정분할을 사용할 시 내부단편화, 외부단편화의 문제가 발생하고

가변분할을 사용할 시 외부단편화 문제만 발생합니다.


주 메모리 관리 방식 + 보조 메모리 

 

 

보조 메모리의 일부를 주 메모리 처럼 사용하는 방식을 위에서도 설명했다시피 가상메모리 방식이라고 했습니다. 

가상메모리 방식 역시 주 메모리 관리 방식과 같이 단일 프로그래밍 방식과 다중 프로그래밍 방식으로 나누어집니다.

 

하지만 가상메모리까지 사용하는 단일 프로그래밍을 하는것은 오버레이 기법과 다를것 없고 할 이유가 없기 때문에 무의미한 방식이라 넘어 갈 것입니다. 그리고 다중 프로그래밍 방식 역시 고정분할고 가변분할로 나누어지게 되는데

 

고정분할 - 페이지 기법

가변분할 - 세그먼트 기법

 

위와 같은 방식으로 관리 되고, 아래에서 페이지는 무엇인지, 페이지로 어떻게 메모리를 관리하는가, 그리고 페이지 교체기법에 대해서 알아보도록하겠습니다.

 

 


페이지 기법

 

그림이 보기 힘들어도 이해해주세요..

 

페이지란? 주 메모리의 크기를 고정분할한 크기 입니다. 

아래 그림에서는 현재 4KB로 나누었고, 이 크기를 페이지라고 합니다.

 

주 메모리를 보시면 4KB 4개의 공간을 프로그램 A가 사용할 공간으로 구분해 놨습니다. 

이 크기를 페이지 프레임이라고 합니다.

 

 

A 프로그램이 실행되기 위해서 필요한 프로그램을 페이지 크기로 분할해서, 주 메모리에 적재합니다.

그렇게 1, 2, 3, 4로 분할된 프로그램을 주 메모리에 적재하면 5번 부터 문제가 발생하게 됩니다. 주 메모리에 공간이 없는데, 어디에 적재해야 하는가에 대한 문제입니다. 이때 어떤 페이지를 교체해야하는가를 해결하기 위해 여러 알고리즘이 존재하고 그건 아래에서 확인 하도록하겠습니다. 

 

여기서는 예를 들기위해 FIFO 방식을 택하겠습니다. 

먼저 들어온 페이지를 빼주고 새로운 페이지를 넣는 방식입니다. 

 

그렇게 1번 페이지를 빼주고 빠진곳에 5번 페이지를 넣어줍니다.

6번 역시 2번 대신 6번을 넣어주는 방식입니다.

 

이떄 메모리에 페이지가 적재될떄 Page-in / 교체되어 나갈떄를 Page-out이라고 하는데 이걸 swapping 이라고합니다.

page-out된 페이지는 하드디스크에서 대기하게 됩니다.

 

이러한 교체가 일어날 때 하드디스크와 주메모리 사이에 페이지에 대한 정보를 처리하는데 걸리는 시간차이가 존재하는데, 이때 사용하는게 TLB로 페이지를 페이지 프레임에 적재 할 때 속도 향상을 위해 캐시 메모리처럼 사용하는 방식입니다.

 

프로그램을 가져올 떄 TLB에 저장하고, 주 메모리에 적재해서 사용합니다. 

(페이지 교체 그림 에서)

1번 프로그램이 page-out이 된 상태에서 다시 1번 프로그램을 다시 사용할 때 TLB에 저장이 되어 있다면 하드디스크에서 1번 프로그램을 가져오는 방식이 아닌 TLB에서 가져와 더 빠르게 페이지 교체를 해서 프로그램을 사용합니다.

 

여기서 궁금한 점이 있었다.

 

" 어떻게 메모리에서는 분할되어 있는 프로그램을 하나의 프로그램으로 인식 " 하는가에 대한 문제였다.  

그것은 MMU 방식으로 논리 주소를 물리 주소로 변환해 주기 때문이다. 

페이지 교체 그림 에서 오른쪽 상단에 페이지 사상 테이블이 있는데, 

 

첫번째 열에는 페이지 번호, 즉 하드디스크에 페이지 크기로 나누어져 있는 프로그램의 번호를 담고 있고 이것을 가상주소 ( = 논리 주소 ) 라고 합니다.

 

두번쨰 열에는 페이지의 실제주소( = 물리주소 ) 라 하고, 주 메모리에 100, 104, 108, 112 와 같이 메모리의 실제 주소를 가지고 있습니다. 이러한 방식으로 어떤 프로그램인지를 확인하고 실행 할 수 있도록 해줍니다.

 


페이지 교체 기법

 

페이지 교체 기법에는 여러 방식이 있는데 그중에서 FIFO / LRU / LFU / OPT 4가지 방법에 대해 알아 보겠습니다.

 

페이지 참조 순서

1 0 2 2 2 1 7 6 7 0 1 2

 

페이지 프레임 

4

 

1. FIFO

가장 오래된 페이지를 Page-out 하는 방식입니다.

 

F = FAULT 페이지 부재

H = HIT 페이지 존재

 

페이지 교체 성공률 = 6 / 12 = 50%

위에 경우에서는 꽤 많은 HIT가 발생해서 성공률이 높았지만, 실제로는 많은 페이지 부재가 발생하게 됩니다.

그리고 페이지 프레임이 증가할 수록 페이지 부재가 커지는 모순도 발생하게 되는데 이걸 벨레디(Belady) 의 모순이라고 합니다.

 

 

2. LRU

현 시점에서 가장 오랫동안 사용하지 않은 페이지를 교체하는 방식 / 빈도수가 절대 아닙니다.

 

페이지 교체 성공률 = 5 / 12 = 약 42%

 

페이지를 교체해야할 때 현재 교체 될 페이지에서 페이지 프레임 수 많큼 이전에 들어온 페이지를 확인합니다.

첫번째 6이 들어올 때, 최근에 사용된 페이지는 중복을 빼고 7, 1, 2, 0 순으로 사용되었습니다.

그렇기 때문에 0과 6을 교체해 줍니다. 

 

다음 0이 들어올떄, 7, 6, 1, 2 순으로 최근에 사용되었기 떄문에 2와 0을 교체해 주는 방식입니다.

 

 

3. LFU

이 방식이 빈도수를 체크해서 교체해주는 방식입니다. 빈도수가 낮으면 교체되야 합니다.

 

페이지 교체 성공률 = 6 / 12 = 50%

 

6번 페이지를 교체하려고할 떄 6번 전에 참조했던 페이지를 확인해 줍니다

1 - 2번

0 - 1번

2 - 3번

7 - 1번

 

여기서는 최소 참조페이지가 0,7이 같은데, 이럴 경우에는 FIFO로 교체 하던가 다른 예시가 주어집니다.

저는 FIFO로 교체하겠습니다. 그래서 0번을 6번과 교체합니다. 

 

다음으로 0번 페이지를 교체할 때 

1 - 2번

2 - 3번

6 - 1번

7 - 2번

 

6번을 다시 0번과 교체합니다.

 

4. OPT

앞으로 사용되지 않을 페이지를 찾아서 Page-out을 해주는 방식입니다. 

실사용은 불가능하고, 연구용으로 많이 사용합니다. 

 

페이지 교체 성공률 = 6 / 12 = 50%

 

6번을 교체하고 싶을 때 

앞으로 7, 0, 1, 2 순이기 때문에 2번 대신 6번을 넣어줍니다.

 

그리고 마지막에서 교체방식은 위에 처럼 다른 방식이 주어지는데 FIFO로 진행하겠습니다

그래서 2번 페이지가 1번과 교체되는 알고리즘입니다.


세그먼트 기법

 

세그먼트 기법은 가변분할로 아래의 그림을 보시면 쉽게 이해 할 수 있습니다.

 

이런식으로 논리적 구조로 잘라 주게 됩니다.

 

 

세그먼트 역시 페이지와 마찬가지로 세그먼트 사상 테이블을 이용해 어떤 세그먼트의 분할된 프로그램인지 현재 페이지 번호는 몇번인지, 크기와 메모리에 올라와 있는 없나에 해당하는 정보를 가지고 프로그램을 실행시켜줍니다.

 

당장 필요없는 프로그램과 필요한 프로그램을 교체해주는데 페이지와 다르게 고정된 크기가 아니고 가변분할된 크기 이기 때문에 가변분할에서 발생하는 외부단편화가 발생하게 됩니다. 이때 남는 공간들 효율적으로 사용하기위해 

"압축" 을 하게 되고, 압축된 공간을 활용하여 프로그램을 적재하는 방식입니다.

 

압축의 예로는 디스크 조각모음을 생각하시면 되겠습니다.

 


마무리

 

실제로는 세그먼트 기법을 사용하는데 그 안에 세그먼트를 다시 페이지처럼 고정크기로 분할하여 혼합해서 사용하는 경우가 많다고 합니다. 

 

마지막으로 퀴즈아닌 퀴즈인데

 

위의 글을 보고나서 이 퀴즈를 이해하시면 완벽히 이해하신거라고 생각합니다.

 

1. 과연 페이지 기법에서는 단편화가 발생하는가 ??? 발생한다면 어떤 단편화가 발생하는가 ??

 

정답 :  발생한다. 내부단편화만 발생한다

페이지의 크기를 4KB로 분할한다고 할때, 프로그램의 크기가 53KB라면 프로그램 역시 동일한 4KB로 분할하게 되는데

이떄 마지막 1KB가 남게되고 교체하게되면 4KB - 1KB로 3KB가 생기게 됩니다.

 

2. 페이지 크기가 커지면 페이지 부재 발생은 커지는가 작아지는가??

 

정답 : 작아진다

페이지를 4KB로 분할 했을 때 53KB 프로그램은 총 4KB의 페이지 12개와 1KB 페이지 1개로 구성된다.

페이지 프레임이 총 4개라면 4개까지는 적재되지만 다른 분할된 프로그램의 9개 페이지는 부재가 발생하게된다.

 

하지만 10KB로 분할 했을 떄 53KB 프로그램은 10KB 5개와 3KB의 페이지 1개로 구성되고

페이지 프레임이 총 4개라고 하면 4개 적재 후, 10KB 1개와 3KB 1개, 총 2개의 페이지 부재가 발생하기 때문에 작아지는 것이다.

 

3. 페이지 크기가 커지면 단편화는 많아 지는가??

 

정답 : 2번문제와 연관해서 생각하시면 쉽게 생각 할 수 있습니다.

4KB로 분할했을 때, 1KB가 남는데 이떄 페이지 단편화는 3KB 내부 단편화가 발생합니다.

하지만 10KB로 분할했을때 3KB가 남게되는데 이떄 페이지 단편화는 7KB의 내부 단편화가 발생하기 때문에

페이지 단편화는 커지게 됩니다. 

 

4.  페이지의 크기는 작을수록 좋은가??

 

정답 : 페이지의 크기는 정답은 없습니다. 적절하게 분할하는게 좋습니다.

이유는 너무 작게되면 페이지의 부재가 커지게 되고, 계속해서 페이지교체가 이루어지기 떄문에 속도 저하 문제가 발생하게 됩니다. 이러한 현상을 스레싱 현상이라고 합니다. 

그렇다고 페이지의 크기가 너무 커지면 주 메모리의 크기는 적은데, 페이지 프레임의 크기가 늘어나게 되는 현상이 발생되고, 다른 프로그램들을 사용할 수 있는 공간이 줄어 들기 떄문에 적절한 분할이 중요합니다. 

 

 

긴글 읽으시느라 고생많으셨습니다. 많은 도움이 되셨으면 좋겠습니다.