쉽게 배우는 운영체제 Chapter07 물리 메모리 관리

Eunkyung·2021년 11월 2일
0

OS

목록 보기
8/9

1. 메모리 관리의 개요

1.1 메모리 관리의 복잡성

메모리 구조는 1바이트 크기로 나누어지며 메모리 주소는 0번지부터 시작한다. CPU는 메모리에 있는 내용을 가져오거나 작업 결과를 메모리에 저장하기 위해 메모리 주소 레지스터를 사용한다.

메모리 주소


폰노이만 구조에 의해 모든 프로그램은 메모리에 올라와야 실행이 가능하다. 과거의 일괄 처리 시스템과 달리 오늘날의 시분할 시스템에서 운영체제를 포함한 모든 응용 프로그램이 메모리에 올라와 실행되기 때문에 메모리 관리가 복잡하다.

1.2 메모리 관리의 이중성

메모리 관리의 이중성은 프로세스 입장에서 작업의 편리함과 메모리 관리자 입장에서 관리의 편리함이 충돌을 일으키는 것을 말한다.

1.3 소스코드의 번역과 실행

컴퓨터는 0과 1로 이루어진 기계어만 이해할 수 있기 때문에 프로그래밍 언어로 작성한 코드를 컴파일러를 통해 실행 가능한 코드로 변경한다. 대표적인 언어 번역 프로그램은 컴파일러와 인터프리터가 있다.

컴파일러

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

인터프리터

소스코드를 한 행씩 번역하여 실행한다.
ex) Js, Python

그렇다면 컴파일러와 인터프리터의 차이는 무엇일까? 먼저, 컴파일러를 사용하는 프로그래밍 언어는 사용할 변수를 먼저 선언한 후 코드를 작성한다. 이는 오류를 찾고 코드를 최적화하기 위해 반드시 필요한 작업으로 컴파일러는 실행 전에 소스코드를 점검하여 오류를 수정하고 필요 없는 부분을 정리하여 최적화된 실행 파일을 만든다.
한편, 인터프리터는 한 줄 씩 위에서부터 아래로 실행되기 때문에 같은 일을 반복하는 경우나 필요 없는 변수를 확인할 수 없다.
따라서 크고 복잡한 프로그램에는 컴파일러를 사용하고 간단한 프로그램에는 인터프리터를 사용한다.

컴파일은 사용자가 작성한 소스코드를 목적 코드로 변환한 후 라이브러릴 연결하고 최종 실행 파일을 만들어 실행하는 과정으로 다음과 같다.

컴파일 과정

1.4 메모리 관리자의 역할

  • 가져오기
    프로세스와 데이터를 메모리로 가져오는 작업이다. 메모리가 충분하지 않다면 데이터의 일부만 가져와 실행하거나 사용자의 요청이 없더라도 필요하다고 예상되는 데이터를 미리 가져오기도 한다.

  • 배치
    나누어진 메모리의 구역에 따라 프로세스와 데이터를 어떤 위치에 놓을지 결정하는 작업이다. 메모리를 같은 크기로 자르는 것을 페이징, 프로세스의 크기에 맞게 자르는 것을 세그먼테이션이라고 한다.

  • 재배치
    꽉 차 있는 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업이다.

2. 메모리 주소

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

2.1 32bit CPU와 64bit CPU의 차이

CPU의 비트는 한 번에 다룰 수 있는 데이터의 최대 크기를 의미한다. 즉, 32bit CPU는 한 번에 다룰 수 있는 데이터의 최대 크기가 32bit이고, 64bit CPU는 64bit이다.
컴퓨터에 설치된 메모리에는 각 메모리 주소 공간이 있는데 설치된 메모리 주소 공간을 물리 주소 공간이라고 하며, 사용자 입장에서 바라본 주소 공간은 논리 주소 공간이라고 한다.

2.2 절대 주소와 상대 주소

일괄 처리 시스템에서 볼 수 있는 단순 메모리 구조는 다음과 같다.
메모리 관리자는 사용자가 운영체제를 침범하지 못하도록 운영체제 영역과 사용자 영역으로 나누어 관리한다. 운영체제는 0~359번지를 사용하고 사용자는 360~999번지를 사용한다.
사용자 영역이 운영체제 영역으로 침범하는 것을 막기 위해 경계 레지스터가 경계 레지스터의 값을 벗어나는지 확인하고 벗어나는 작업을 요청하는 프로세스가 있으면 그 프로세스를 종료한다.

단순 메모리 구조

  • 절대 주소
    메모리 관리자 입장에서 바라본 주소로 컴퓨터에 꽂힌 램 메모리의 실제 주소를 말한다.
  • 상대 주소
    사용자 프로세스 입장에서 바라본 주소로 절대 주소와 관계없이 항상 0번지부터 시작한다.
절대 주소와 상대 주소

메모리 접근 시 상대 주소를 절대 주소로 변환해야 하는데 상대 주소를 절대 주소로 변환하는 과정은 다음과 같다.

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

1. 사용자 프로세스가 상대 주소 40번지에 있는 데이터 요청한다.
2. CPU는 메모리 관리자에게 40번지에 있는 내용을 가져오라고 명령한다.
3. 메모리 관리자는 재배치 레지스터를 사용하여 상대 주소 40번지를 절대 주소 400번지로 변환하고 메모리 400번지에 저장된 데이터를 가져온다.

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

3.1 메모리 오버레이

프로그램의 실제 크기가 물리 메모리보다 클 때 적당한 크기로 잘라서 가져오는 기법으로 프로그램을 몇 개의 모듈로 나누고 필요할 때마다 모듈을 메모리에 가져와 사용한다.
메모리 오버레이에서 어떤 모듈을 가져오거나 내보낼지는 프로그램 카운터가 결정한다.

메모리 오버레이 작동 방식


문서 편집기에는 기본 문서 편집 기능 외에 맞춤법 검사, 출력, 그림판 등의기능이 있다. 이러한 기능은 각각 모듈 형태로 분리되어 있다가 프로그램이 실행되면 필요한 모듈만 메모리에 올라와 실행된다.

3.2 스왑

메모리가 모자라서 쫓겨난 프로세스는 저장장치의 특별한 공간에 모아두는데 이러한 영역을 스왑 영역이라고 부르며 이는 메모리 관리자가 관리한다.
스왑인은 스왑 영역에서 메모리로 데이터를 가져오는 작업이고, 스왑아웃은 메모리에서 스왑 영역으로 데이터를 내보내는 작업이다.

스왑인과 스왑아웃


메모리에 모듈 B를 가져올 때 먼저 메모리에 올라온 모듈 A를 스왑 영역에 보관한다.

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

4.1 메모리 분할 방식

메모리를 어떤 크기로 나눌 것인지는 메모리 배치 정책에 해당되는데 배치 방법은 크게 가변 분할 방식과 고정 분할 방식이 있다.

메모리 분할 방식의 구현

  • 가변 분할 방식
    프로세스 크기에 따라 메모리가 분할되며 한 프로세스가 연속된 공간에 배치되기 때문에 연속 메모리 할당이라고 한다.
    [장점]
    하나의 프로세스를 연속된 공간에 배치한다.
    [단점]
    빈 공간을 하나로 합치기 위한 부가적인 작업이 필요하기 때문에 메모리 관리가 복잡하다.

  • 고정 분할 방식
    프로세스 크기와 상관없이 같은 크기로 메모리가 분할되며, 큰 프로세스가 메모리에 올라오면 여러 조각으로 나뉘어 배치된다. 이처럼 한 프로세스가 분산되어 배치되기 때문에 비연속 메모리 할당이라고 한다.
    [장점]
    메모리 관리가 수월하다.
    [단점]
    일정하게 나누어진 공간보다 작은 프로세스가 올라올 경우 메모리 낭비가 발생한다.

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

가변 분할 방식은 빈 영역이 있어도 서로 떨어져 있으면 프로세스를 배정하지 못하는 문제가 발생하는데 이로 인해 작은 조각들이 발생하는 현상을 단편화라고 한다.

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

프로세스 B와 D가 종료되면 18KB와 17KB의 빈 공간이 생긴다. 이 때 18KB보다 큰 프로세스가 들어오면 적당한 공간이 없어 메모리를 배정하지 못하는데, 프로세스 바깥쪽에 조각이 발생하는 이러한 작은 빈 공간을 외부 단편화라고 한다.

이러한 문제를 해결하기 위해 메모리 배치 방식이나 조각 모음을 사용한다. 메모리 배치 방식은 작은 조각이 발생하지 않도록 프로세스를 배치하는 작업으로 선처리에 해당하고 조각 모음은 조각이 발생했을 때 작은 조각들을 모아서 하나의 큰 덩어리로 만드는 작업으로 후처리에 해당한다.

  • 메모리 배치 방식
    1. 최초 배치
      단편화를 고려하지 않는 것으로 프로세스를 메모리의 빈 공간에 배치할 때 첫 번째로 발견한 공간에 프로세스를 배치하는 방법이다.
    2. 최적 배치
      메모리의 빈 공간을 모두 확인한 후 적당한 크기 가운데 가장 작은 공간에 프로세스를 배치하는 방법이다.
    3. 최악배치
      빈 공간을 모두 확인한 후 가장 큰 공간에 프로세스를 배치하는 방법이다.
메모리 배치 방식의 비교

  • 조각 모음
    서로 떨어져 있는 여러 개의 빈 공간을 합치는 작업이다. 조각 모음을 하기 위해서는 프로세스를 중지시키고, 이동하고, 주소를 바꾸고, 다시 시작하는 작업을 해야 하기 때문에 많은 시간이 걸린다.
    이처럼 가변 분할 방식은 외부 단편화로 인해 조각 모음 같은 부가적인 작업이 필요하므로 메모리 관리가 복잡하다.
조각 모음

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

고정 분할 방식은 가변 분할 방식보다 공간을 효율적으로 관리하여 조각 모음 같은 부가적인 작업이 불필요하여 오늘날 고정 분할 방식을 기본으로 사용하고 있다.

고정 분할 방식의 프로세스 배치

분할된 크기가 20KB이므로 40KB인 프로세스 A는 A1과 A2로 나뉘어 메모리에 할당된다. 30KB인 프로세스 C는 C1과 C2로 나뉘는데 메모리에 남는 공간이 없으므로 프로세스 C2는 스왑 영역으로 옮겨진다.

고정 분할 방식도 단점이 있는데 같은 크기로 나뉜 공간 내부에서 공간이 남는 내부 단편화가 발생한다. 이는 동일하게 분할되는 공간의 크기를 조절하여 내부 단편화를 최소화환다.

가변 분할 방식과 고정 분할 방식의 비교

4.4 버디 시스템

외부 단편화를 완화하는 방법으로 1/2로 메모리를 분할하고 프로세스가 종료될 때마다 빈 공간을 하나로 합친다.
버디 시스템은 가변 분할 방식과 고정 분할 방식의 특징을 모두 가지고 있다. 가변 분할 방식처럼 메모리가 프로세스 크기대로 나뉘며, 고정 분할 방식처럼 하나의 구역에 다른 프로세스가 들어갈 수 없고, 메모리의 한 구역 내부에 조각이 생겨 내부 단편화가 발생한다.

출처

  • 쉽게 배우는 운영체제 - 조성호 지음
profile
꾸준히 하자

0개의 댓글