[운영체제] 메모리 관리해야지, 어떻게?

운영체제 중간고사 시험공부를 하고 있는데, 

메모리 관리 관련 이해가 쏙쏙되는 15년전 블로그 글을 발견해서 토대로 한번 정리해보려고 한다.

유일한 시험기간 딴짓 = 시험공부 내용 블로그 글 쓰기 ㅎㅎ...

의외로 좀 재밌어서 정리하게 되었다.

재밌자나 한잔해~

메모리 관리가 필요한 이유

원하는 작업을 컴퓨터에서 처리하기 위해서는 처리대상의 내용, 처리 결과를 잠시 기억하고 있어야 한다. 

이것을 "메모리"라고 하고,

따라서 하나의 프로세스를 실행할때 프로세스의 실행에 필요한 메모리가 할당되어야 한다.

 

대부분 시스템에서 여러 프로세스들이 서로 cpu를 차지하려고 경쟁하는 것과 같이 메모리 또한 차지하려고 경쟁하는 

"멀티프로그래밍" 환경이다.

 

한정된 메모리 자원을 이용할 수 있도록 경쟁을 적절히 중재하기 위해 (얘네도 경쟁을 하네..)

, 그리고

실제로 요구되는 메모리가 실제 물리 메모리보다 크기때문에

메모리를 할당하는 정책이 필요하다. 이에 대해 더 깊게 알아보자.

1. 고정 분할 정책

    - 정적 배치

    - 동적 배치

2. 가변 분할 정책

 


고정 분할 + 정적 배치 정책

static relocation = 고정 분할 + 정적 배치 정책

이 정책은 메모리를 고정된 크기의 파티션으로 분할 후, 각 프로세스가 로드되는 메모리 파티션을 고정적으로 결정하는 것이다.

아래와 같이 p1,p2,p3,p4,p5,p6 프로세스가 있다고 할때,

a -------------

      파티션 1             <-     {P1,  P2}

b -------------

      파티션 2             <-      {P3 , P4}

c -------------

      파티션 3             <-      {P5, P6}

d -------------

파티션1에는 p1,p2프로세스의 메모리 내용이 고정되어 실행되고, 파티션1만 사용된다면, 메모리의 파티션2,3은 비어있게 되어 매우 효율이 안 좋다.

고정분할 + 동적 배치 정책

 

dynamic relocation = 고정 분할 + 동적 배치 정책

앞서 언급한 정적 배치처럼 메모리를 고정된 크기의 파티션으로 분할하지만,

각 프로세스가 로드되는 메모리 파티션은 동적으로 결정하는 정책이다.

위의 파티션 그림에서

p1,p2는 반드시 파티션1을 사용해야하지만, 

파티션1에서 p1이 실행중이고, 파티션2,파티션3가 비어있어 p2를 실행할 수 있으면, 

해당 비어있는 파티션 중 하나에 p2를 실행할 수 있는 것이다.

 

이 방식은 기존 고정 분할+정적 배치에 비해 나아보이나, 다음과 같은 문제가 존재한다.

 

동시에 메모리에 올릴 수 있는 프로세스 개수가 고정되어 제한되어 있고,

아래 그림과 같이 외부 조각, 내부 조각 문제가 발생해 

메모리가 낭비될 수 있다. 

내부 조각 문제는 내부 단편화(Internal Fragmentation)이라고 하는데,

이것은 프로세스가 필요로 하는 메모리 크기가 고정 분할 크기보다 작을 때

메모리 낭비가 발생하는 것을 말한다. 

 

내부 단편화 문제를 해결할 수 없어서 소개한 고정 분할을 안 쓰고, 이를 해결하는 다른 정책이

동적 분할 정책이다.

 

동적 분할 정책

프로세스가 요구하는 정확한 메모리 크기를 할당하는 것으로

앞선 고정 분할 정책에서의 내부 단편화 문제가 생기지 않는다.

 다만, 다른 문제가 생긴다!! (끝도 없이 나오는 문제 ㅎㅎ)

 

프로세스의 생성과 소멸이 반복될 때 다음과 같은 문제가 생긴다.

프로세스가 소멸하면 빈 파티션이 발생 하고, 새로운 프로세스가 해당 파티션에서 필요한 크기만큼만 할당한다.

파티션이 더욱 작아지고,

이런 과정이 반복되어 너무 작아진 파티션은 나중에 사용이 불가하다.

이를 프로세스가 사용하는 파티션 밖에 위치하게 된다고 해서 외부 단편화라고 하는데,

 

그렇다면 이런 외부 단편화를 막기 위한 방법은?

best fit, first fit, worst fit이 있다. 

의문

❓내가 참고한 글에서 왜 worst fit이 괜찮은 방법이라고 서술한거지?

🫢 다시 말해, worst fit이 괜찮을 수 있는 상황이 무엇이 있을까?

worst fit의 정의부터 다시 보자. 프로세스를 적재하는데 가장 크기가 안 맞는 곳에 프로세스를 적재하는 방법이다. 딱 맞는 공간이 있는데도 데이터의 크기와 가장 안맞는 부분에 적재하기 때문에 worst여서 메모리 낭비가 심해 선호도가 낮다.

말그대로 worst인데, 

의외로 first fit, best fit을 적용했을 때 생기는 남는 작은 메모리 조각 부분들 -> 외부 단편화를 막는 하나의 방법이 될 수 있다!
오히려 적재가능한 메모리 공간들 중 가장 큰 조각에 일부러 적재해 
남는 메모리 조각들의 평균을 크게 유지할 수도 있다.

하지만, 진짜 말그대로 worst이므로
진짜 큰 프로세스가 못 들어가는 상황이 발생할 수도 있고
해당 부분을 탐색하는데 시간이 오래 걸릴 수도 있다.

🎯 하지만, worst fit이 항상 최악인 것은 아니고, 
외부 단편화를 방지할 수도 있다는 사실이 새롭다.

지금까지 본 방법들은 현재 잘 사용하지 않는다.

현재 os에서는 demand paging + virtual memory를 쓰는데

demand paging은 프로세스의 모든 코드가 실행에 필요한 것이 아니기에 일부 영역만 요청하는 것이다.

그럼 현재 os에서 사용하는 방법을 알아보자. 


가상 메모리 (virtual memory)

실제 메모리가 아닌, 프로세스 마다 가지는 가상의 메모리이다.

이전에는 하나의 메모리 공간을 여러 프로세스들이 나누어 사용하는 방식이였다면,

해당 가상 메모리 방법에서는

32비트 프로세스의 경우, 

2^32 byte의 주소 공간 = 4 x 2^30 KB = 4GB 만큼의 가상 메모리 공간을 가지게 되고, 각 프로세스가 하나의 메모리를 소유하는 단일 프로세스 환경처럼 보이게 된다.

 

virtual memory에 64비트를 사용하고, Physical memory에 32비트를 사용할 경우 아래와 같이 페이지 테이블이 만들어진다.

각각의 칸은 virtual memory(이하 vm)에서 페이지 공간을 뜻하고 크기가 4KB이다.

physical memory(이하 pm)에서 페이지 프레임 크기또한 4KB이므로, vm에서 각 페이지의 page frame number에 쓰인 값들을 찾으면, pm의 페이지 프레임 인덱스를 가리키는 것이다. 

해당 그림은 Page table로 전체적인 그림은 아래와 같다.

이때, 당연히 vm에 있는 페이지가 pm과 매핑 되지 않은 경우가 있을 수 있다.

pm을 효율적으로 사용하기 위해서 vm의 페이지를 모두 pm의 페이지 프레임과 매핑하지 (로드하지) 않는다.

그래서 페이지 테이블에 페이지가 없는 경우

Page fault가 발생할 수 있다.

그럼 page fault가 발생하고 이와 관련된 부분을 수행하는 예시를 하나 보자.

 

1.cpu는 물리 메모리를 확인하여 페이지가 없으면 trap을 발생하여 운영체제에 알린다.
2.운영체제는 cpu의 동작을 잠시 멈춘다.
3.운영체제는 페이지 테이블을 확인하여 가상 메모리에 페이지가 존재하는지 확인, 없으면 프로세스를 중단한다.
4.페이지 폴트면 현재 물리 메모리에 비어있는 프레임이 있는지 찾는다.
5. 비어있는 프레임에 해당 페이지를 로드하고, 페이지 테이블을 최신화한다.
6. 중단되었던 cpu를 다시 시작한다.

🫢 여기서 왜 비어있는 프레임을 찾을까? 

물리 메모리(pm)에서 비어있는 프레임이 없는 경우, 계속 돌아가야하는 프로세스의 주소들중 희생될 프레임을 골라 디스크에 저장후(필요시), 필요한 페이지를 물리 메모리에 로드한다. 

🫢 그럼 어떤 프레임을 희생시켜야할까?

해당 부분은 페이지 교체 알고리즘(page replacement algorithm)에 의해 선택된다. 

 


      [프로세스] → 가상 주소 요청
             ↓
      [페이지 테이블] 확인
             ↓
     ┌─────────────────────────────────────┐
     │ 있음 → 물리 메모리에서 데이터 접근          │
     └─────────────────────────────────────┘
             ↓
     ┌────────────────────────────────────────────┐
     │ 없음 → 페이지 폴트 발생                         │
     │      → 디스크에서 해당 페이지 불러옴              │
     │      → 필요 시 다른 페이지 내보냄 (교체)          │
     └────────────────────────────────────────────┘

요약하자면, 디스크는 오래된 물건을 쌓아두는 창고, 

물리 메모리는 작업할 물건을 올려두는 책상

가상 메모리는 사용자 눈에 보이는 정돈된 작업 공간이다.

참고자료

https://trts1004.tistory.com/12109160

 

Memory(메모리)란 무엇인가?

메모리란 ? 컴퓨터정보공학과 권필재(1189004) 2011. 5. 16 목차 1. 메모리란? 2. FSB란 무엇인가? 3. 메모리에서 DDR과 DDR2, DDR3의 차이점은 무엇인가? 1. 메모리란? 메모리'라는 말은 기억장치라는 뜻을 가

trts1004.tistory.com

https://m.blog.naver.com/PostView.naver?blogId=sungeuns&logNo=50098110493&navType=by

 

메모리관리(Memory Management)에 관한 간단한 정리~

메모리관리는 내용이 방대하고 중요해서, 그냥 학교에서 수업했던것 위주로 간단한 이론적 내용을&nbs...

blog.naver.com

https://cano721.tistory.com/18

 

[운영체제] 페이지 교체 알고리즘(FIFO, OPT, LRU), 쓰레싱, working set

운영체제 관련 글 순서 - 프로세스란 - 쓰레드 - CPU 스케줄링 - 동기화 툴 - 동시성 제어 예제 - 데드락 - 주 메모리 - 페이징과 스와핑 - 가상 메모리와 디맨드 페이징 - 페이지 교체 알고리즘(FIFO, O

cano721.tistory.com

https://preamtree.tistory.com/21

 

[IT 기술면접 준비자료] 가상메모리의 동작과 페이지폴트(Page Fault)

윈도우 운영체제의 가상 메모리(Virtual Memory)는 RAM을 관리하는 방법 중 하나로, 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 할당하는 방식을 말한다. RAM의 부족한 용량을 보완

preamtree.tistory.com