Computer Science 기본 지식/운영체제

[운영체제] 주 메모리 관리

로파이 2021. 1. 18. 14:22

독학사 운영체제 편을 공부하고 정리한 글입니다.

 

메모리 관리

 

  • 메모리의 구조는 1바이트 단위로 나뉘고 주소로 구분하는데 0번지 부터 시작한다.
  • CPU는 메모리 주소 레지스터를 통해 데이터를 메모리에서 읽어오거나 쓰기가 가능하다.
  • 오늘날 시분할 시스템에서 많은 응용프로그램이 동시에 메모리에 올라와있으므로 관리가 복잡하다.

메모리 관리자

 

  • 다중 프로그래밍 환경에서 효율적으로 메모리를 사용하기위해 메모리 할당 및 해제 등의 작업을 수행한다.
  • 메모리 관리 유닛(Memory Manage Unit, MMU)라는 하드웨어가 메모리 관리를 담당한다.
  • 메모리 관리 작업은 가져오기(fetch), 배치(placement) 그리고 재배치(replacement)로 나뉜다.

1. 적재 정책

- 프로세스와 데이터를 메모리로 가져오는 적재 작업에서 언제 메모리에 가져올지 결정하는 정책이다.

  • 요구 적재(demand fetch): 운영체제나 시스템 프로그램, 사용자프로그램 등 참조 요청이 있을 시 메모리에 적재
  • 예상 적재(anticipatory fetch): 시스템 요청을 미리 예측하여 메모리에 적재하는 방법

2. 배치 정책

가져온 프로세스와 데이터를 메모리에 올려놓는 배치 작업에서 어느 위치에 저장할 것인지 결정한다.

  • 최초 적합: 분할된 빈 메모리 공간 중에서 배치 가능한 첫 번째 분할 공간에 적재
  • 최적 적합: 분할된 빈 메모리 공간 중에서 배치 가능한 가장 작은 공간에 적재
  • 최악 적합: 분할된 빈 메모리 공간 중에서 배치 가능한 가장 큰 공간에 적재

3. 재배치 정책

새로운 프로세스를 메모리에 올리기 위해 메모리에 충분한 공간이 없을시 디스크로 내보낼(swap-out) 프로세스를 결정하는 작업에서 어떤 프로세스를 제거할지 결정하는 정책이다.

  • 선입선출: 가장 먼저 실행된 (오래된) 프로세스를 내보냄
  • 최근 최소 사용(LRU): 가장 사용한지 오래된 프로세스를 내보냄

메모리 주소

 

- 32bit CPU vs 64bit CPU

  • CPU 비트는 한 번에 다룰 수 있는 데이터의 최대 크기 (레지스터의 크기)를 의미.
  • 데이터를 주메모리에서 CPU로 전송할 때 사용하는 버스의 대역폭도 같은 크기를 가진다.
  • 32bit ~ 4GB를 다루며 64bits는 거의 무한대의 메모리 주소 공간을 사용할 수 있다.

- 메모리 영역 구분

메모리 영역 구분

  • 운영체제의 기능이 정의된 함수와 데이터, 부팅관련 소스 등의 보호된 영역으로 0번지 부터 시작하여 일정 영역을 차지하고 있다.
  • 사용자 영역에서 프로세스가 실행될 때 마다 높은 주소부터 차례대로 할당된다.
  • 사용자 영역이 운영체제 영역을 침범하는 것을 막기 위해 "limit"의 주소를 가진 경계 레지스터가 CPU에 존재한다.
  • 메모리 관리자는 사용자가 프로세스를 요청할 때 경계 레지스터를 조사하여 경계를 벗어나는지 확인하고 그렇다면프로세스를 종료한다.

- 절대주소와 상대주소

절대 주소와 상대 주소

  • 절대주소는 메모리 관리자(하드웨어)에서 보는 물리적인 주소이고 실제 메모리 (RAM)에서 사용하는 메모리 주소와 일치한다.
  • 프로세스 생성시 메모리가 확보되고 적절한 위치에 적재되는데 프로세스마다 시작 주소를 가진다.
  • 이 시작주소를 기준으로 코드, 데이터, 스택, 힙과 같은 영역이 구분되고 사용자 관점에서 바라본 주소를 상대주소라고한다.
  • 프로그램에서 출력되는 주소는 상대주소이다.
  • 실제로 메모리 관리자가 Process 2의 힙 영역의 데이터를 접근하기 위해 기준 주소를 사용하여 상대주소를 절대주소로 번역한다.
  • 위의 가상 예에서 3600(상대주소)를 4800(Process 2의 기준 주소)를 더해 실제 물리주소 8400를 구해 힙 영역을 접근할 수 있다.
  • 프로세스마다 기준 주소를 가지고 있으며 재배치 레지스터가 이 값을 저장한다.

단일 프로그래밍에서 메모리 할당

 

- 메모리 오버레이

프로그램의 크기가 메모리 용량보다 클 때 구성 프로그램을 모듈별로 잘라 일부분만 메모리에 적재한다.

프로그램 카운터가 다음 실행할 모듈에 대한 내용이 메모리에 없으면 MMU에 요청하여 필요 모듈을 적재한다.

 

- 스왑

메모리에서 새로운 프로세스나 모듈이 적재될 때 공간확보를 위해 기존 오래된 프로세스나 모듈을 디스크로 내보내게 되는데 이를 스왑 아웃 (swap-out)이라 하고 디스크로부터 메모리에 적재하는 것을 스왑 인 (swap-in)이라고 한다.

 

- 두 기능을 통해 사용자는 실제 메모리의 크기와 상관 없이 큰 프로그램을 실행할 수 있다.

 

다중 프로그래밍에서 메모리 할당

 

- 고정 분할 방식

메모리를 일정한 크기로 나누어 "조각"으로 관리

프로세스가 조각의 크기보다 클 시 나누어 여러 조각에 적재

고정 분할 방식과 내부 단편화

- 단점

조각내부에 사용하지 않는 빈 공간이 생기는 현상, 내부 단편화로 인한 메모리 낭비

분할 크기에 따른 내부 단편화 조절

 

- 가변 분할 방식

메모리를 일정하지 않은 크기로 나누며 주로 "프로세스" 단위로 메모리에 적재

가변 분할 방식과 외부 단편화

- 단점

메모리 관리가 복잡하다

외부 단편화, 적재해야할 프로세스 크기가 기존 프로세스 종료 후 반납된 메모리 조각들보다 커서 메모리 적재가 불가능한 현상

P5를 메모리에 적재해야하는데 기존 메모리 조각 중 충분한 크기를 가진 공간이 없음

 

외부 단편화를 위한 해결 방법

 

1. 배치 정책

기존 여러 크기의 빈 조각에 어떻게 프로세스를 할당할 것 인가

- 최초 배치

조각 순서대로 가능한 공간에 배치

- 최적 배치

가능한 공간 중 가장 작은 공간에 배치

- 최악 배치

가능한 공간 중 가작 큰 공간에 먼저 배치

 

2. 메모리 조각 모음

이동할 프로세스를 중단시키고 프로세스 기준 주소를 변경하여 메모리 적재 위치를 변경한다.

공간이 큰 메모리 조각이 충분히 확보된 후 프로세스를 다시 시작한다.