읽은 책 정리/쉽게 배우는 운영체제

[정리] 07 물리 메모리 관리

포포015 2022. 9. 26. 16:44

목차

  • 1. 메모리 관리의 개요
  • 2. 메모리 주소
  • 3. 단일 프로그래밍 환경에서의 메모리 할당
  • 4. 다중 프로그래밍 환경에서의 메모리 할당

 1. 메모리 관리의 개요

- 폰노이만 구조의 컴퓨터에서 메모리는 유일한 작업 공간이며, 모든 프로그램은 메모리에 올라와야 실행이 가능.

 

1.1 메모리 관리 시스템 

- 메모리에는 사용자 프로세스뿐 아니라 운영체제 프로세스도 같이 공존한다. 
  여러 작업을 동시에 처리 할 때 메모리는 메모리 관리 시스템 이 담당해서 관리한다.

 

1.2 메모리 관리의 이중성

- 프로세스 입장에서 작업의 편리함과 관리자 입장에서 관리의 편리함이 충돌을 일으키는것을 말한다.
( 메모리 공간 관리는 매우 복잡하다. 작업하다 메모리가 부족하거나 빈공간이 남았을경우 어떻게 처리할지에 대한 충돌)

 

1.3 컴파일러와 인터프리터

컴파일러 - 소스코드를 컴퓨터가 실행할 수 있는 기계어로 번역한 후 한꺼번에 실행. ( C , Java)

인터프리터 - 소스코드를 한 행씩 번역하여 실행 ( JS , Basic) 

 

1.4 컴파일러의 목적

오류 발견심벌 테이블을 이용하여 소스코드에서의 오류를 발견해 사용자에게 알려준다.

코드 최적화 - 불필요한 중복코드 및 사용하지 않는 변수를 점검해 사용자에게 알려준다.

결과적으로 코드를 점검하여 오류를 수정하고 최적화 함으로써 빠른 실행 파일을 만들게 도와준다.

 

* 심벌 테이블 - 변수 선언부에 명시한 각 변수의 이름과 종류를 모아놓은 테이블. 컴파일시 심벌테이블을 이용한다.

1.5 컴파일 과정

  1. 사용자가 작성한 소스코드를 컴파일러를 통해 목적코드(기계어)로 변환
  2. 라이브러리를 연결해 최종 실행 파일을 만든다.

1.6 컴파일러와 인터프리터의 차이

- 컴파일러는 실행전에 소스코드를 점검하여 오류를 수정하고, 필요 없는 부분을 정리하여 최적화된 실행 파일을 만듬.

- 인터프리터는 한 줄씩 위에서부터 아래로 실행되기 때문에, 중복코드나 필요없는 변수를 확인 할수 없음.

1.7 메모리 관리자의 역할

- 메모리 관리는 정확히 말하면, 메모리 관리 유닛 이라는 하드웨어 인데, 일반적으로 메모리 관리자 라고 말함.

  1. 가져오기 작업 - 프로세스와 데이터를 메모리로 가져오는 작업.
  2. 배치 작업 - 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업.
  3. 재배치 작업 - 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업.

2. 메모리 주소

- 메모리에 접근할 때는 주소를 이용한다. 메모리의 주소는 절대 주소 와 상대 주소로 나뉜다.

 

2.1 경계 레지스터

- 메모리 는 운영체제의 영역과 사용자 영역이 분명하게 구분되어 있는데 사용자의 한 프로세스가 운영체제 메모리 영역을 침범했을경우

 경계 레지스터는 그 프로세스를 종료한다. 

 

2.2 상대주소를 절대 주소로 변환하는 과정

- 책에서 내용을 보면 장황하게 작성 되어 있는데, 간단하게 정리하자면 운영체제 마다, 사용하고 있는 메모리 영역이 다르다.

사용자 프로세스는 운영체제가 사용하고 있는 메모리를 계산해서 메모리 할당하기 복잡하니, 

일단 사용자 프로세스는 메모리 할당을 0 번으로 시작하고, 프로세스가 실행 되었을때 재배치 레지스터를 이용해

운영체제가 사용하고 있는 메모리 영역을 확인후 사용자 프로세스의 메모리 할당 번지에  운영체제 할당 영역을 더해준다.

(Ex : 운영체제 400번 메모리까지 사용 , 사용자는 0번부터라면 실행시 400 + 0 을 할당해서 400번지부터 사용한다.)

 

3. 단일 프로그래밍 환경에서의 메모리 할당

3.1 메모리 오버레이

- 프로그램의 크기가 실제 메모리(물리메모리)보다 클때 전체 프로그램을 메모리에 가져오는 대신, 적당한 크기로 잘라서 가져오는 기법.

- 프로그램을 몇개의 모듈로 나누고 필요할 때 마다 모듈을 메모리에 가져와 사용한다.

- 프로그램 전체를 메모리에 올려놓고 실행하는 것보단 속도가 느리지만, 메모리가 프로그램보다 작을때 실행 할수 있어 유용.

* 프로그램 카운터 - 어떤 모듈을 가져오거나 내보낼지에 대한 CPU 레지스터

 

3.2 스왑

- 메모리 오버레이를 이용하다 보면 모듈이 내보내질 경우가 있는데, 잠시 모듈을 보관해야할때 보관되는 장소

- 스왑을 이용하면 스왑 영역의 크기가 메모리의 크기로 인식된다.

(실제 메모리 크기와 스왑 영역 크기를 합쳐 전체 메모리로 인식가능.)

(스왑 영역은 하드디스크에 존재하지만, 메모리 관리자가 관리하기 때문에 디스크 관리자는 내용이나, 어떻게 관리되는지 확인할수 없다)

 

4. 다중 프로그래밍 환경에서의 메모리 할당

4.1 메모리 분할방식

메모리 분할방식은 크게 두 방식이 있다. 각 장단점이 나뉜다.

  • 가변 분할 방식 - 프로세스의 크기에 따라 메모리를 나누는것 (연속 메모리 할당)
    [장점]
    - 프로세스를 한 덩어리로 처리하여 하나의 프로세스를 연속된 공간에 배치
    [단점]
    - 메모리 관리 복잡 (프로세스가 작업을 마쳐서 빈공간이 생겼을때 다시 합치고 옮기고.. 복잡하다)

  • 고정 분할 방식 - 프로세스의 크기와 상관없이 메모리를 같은 크기로 나누는것 (비 연속 메모리 할당)
    [장점]
    - 메모리를 일정한 크기로 나누어 관리하기 때문에, 메모리 관리 수월
    [단점]
    - 쓸모 없는 공간으로 메모리 낭비가 발생 할수 있음.

4.2 가변 분할 방식의 메모리 관리

* 페이징 - 메모리를 일정한 크기로 자른다

* 세그먼테이션 - 메모리를 크기에 맞게 자른다.

- 가변 분할 방식을 세그먼테이션 기법이라고 한다.

- 가변 분할 방식은 빈 영역이 있어도 서로 떨어져 있으면 프로세스를 배정하지 못하는 문제가 있다.

  (이로 인해 작은 조각들이 발생하는 현상을 단편화 혹은 조각화 라고한다.)

 ( A , B , C ,D 프로세스가 각 18KB, 20KB , 15KB , 10KB 가 할당 되었고 B , C 프로세스가 종료 되었을때, 

 B, C가 할당받은 메모리의 크기보다 더 큰 프로세스는 B, C에 할당 될수 없음. 이로인해 발생하는 문제를 외부 단편화 라고한다)

 

4.3 외부 단편화 해결방법

- 외부 단편화의 문제를 해결하기 위해 메모리 배치 방식 이나 조각 모음을 사용해서 정리한다.

 

4.4 메모리 배치 방식

- 가변 분할 방식의 외부 단편화 문제를 해결하기 위한 대표적인 메모리 배치 방식은 3가지가 있다.

  1. 최초 배치 - 단편화를 고려하지 않는것
    ( 메프로세스를 메모리의 적재 가능한 공간을 순서대로 찾다가  첫 번째로 발견한 공간에 프로세스 배치)
  2. 최적 배치 - 메모리의 빈공간을 모두 확인한 후 가장 작은 공간에 프로세스 배치
  3. 최악 배치 - 메모리의 빈공간을 모두 확인한 후 가장 큰 가장 프로세스를 배치

* 위 세가지 배치 방식 마다 다르지만, 결국엔 완전 딱 맞는 공간이 없을경우엔 조각이 발생한다.

 

4.5 조각 모음

- 위의 메모리 배치 방식을 사용해도 단편화 현상이 발생.

- 단편화가 발생한 조각들을 여러개의 빈공간을 합치는 작업.

- 조각 모음을 실행하려면, 프로세스를 1)중지 2)이동 3)주소 변경 4) 다시 시작 처럼 많은 시간 소요.

 

4.6 고정 분할 방식의 메모리 관리

- 고정 분할 방식을 페이징 기법이라고 한다.

- 프로세스의 크기에 상관없이 메모리를 같은 크기로 나누기 때문에 관리하기 편하다.

 

4.7 내부 단편화

- 고정 분할 방식도 문제가 있다.
일정하게 나뉜 메모리의 크기보다 작은 프로세스가 배치 될경우, 낭비되는 공간이 생긴다 이를 내부 단편화라 한다.

- 내부 단편화를 줄이기 위해, 메모리의 크기를 신중히 나누어야 한다.

 

4.8 메모리 단편화 해결 기법

  • 페이징 - 외부 단편화 해결, 내부 단편화 존재
  • 세그먼테이션 - 내부 단편화 해결, 외부 단편화 존재
  • 메모리 풀 - 미리 고정된 크기의 메모리를 할당받아 메모리 동적 할당을 가능하게 해준다. 
                     처음 미리 할당 받은 공간에 대해서 일정 크기 블록을 나누어주고 회수하는 방식이라 단편화 발생 X
                     잦은 동적 할당/해제가 필요한 경우 사용하는 방식이며, 프로그래머가 직접 구현해서 사용할수 있음.

메모리풀 장점 - 미리 공간을 할당 해놓고 가져다쓰고 반납하기 때문에, 할당과 해제로 인한 외부,내부 단편화가 생기지 않음

메모리풀 단점 - 메모리 풀들은 메모리 풀을 사용하는 응용프로그램에 따라 조정된다.