운영체제

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

체리1001 2022. 6. 6.
메모리 주소

 

: 1Byte로 나뉜 메모리의 각 영역은 메모리 주소로 구분하는데 보통 0번지부터 시작한다.

(대부분 OS가 0번지부터 들어간다)

: CPU는 메모리에 있는 내용을 가져오거나 작업 결과를 메모리에 저장하기 위해 CPU 안에 있는 메모리 주소 레지스터(MAR)를 사용한다.

 

 

메모리 관리의 복잡성

 

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

시분할 시스템에서는 운영체제를 포함한 모든 응용 프로그램이 메모리에 올라와 실행되기 때문에 메모리 관리가 복잡하다.

(일괄 처리 시스템은 한번에 하나의 프로그램만 실행시키기 때문에 메모리 관리가 단순하다)

 

 

메모리 관리의 이중성

 

프로세스 입장: 메모리를 독차지하고 싶어 한다.

메모리 관리자 입장: 되도록 효율적으로 관리하고 싶어 한다. (여러 개의 프로그램을 실행할 수 있게)

 

 

메모리 관리자 (Memory Manage Unit, MMU)

 

: 메모리 관리를 담당하는 하드웨어

* 운영체제도 하나도 프로그램이기 때문에 메모리에 올라가 있어야 실행이 가능하다!

 

메모리 관리자의 작업

1. 가져오기 작업: 프로세스와 데이터를 메모리로 가져온다.

2. 배치 작업: 가져온 프로세스와 데이터를 메모리의 어떤 부분에 올릴지 결정한다.

3. 재배치 작업: 꽉 차 있는 메모리에 새로운 프로세스를 가져오기 위해 오래된(덜 중요한) 프로세스를 내보낸다.

 

메모리 관리자의 정책

1. 가져오기 정책: 프로세스가 필요로 하는 데이터를 언제 메모리로 가져올지 결정하는 정책

2. 배치 정책: 가져온 프로세스를 메모리의 어떤 위치에 올려놓을지 결정하는 정책

3. 재배치 정책: 메모리가 꽉 찼을 때 메모리 내에 있는 어떤 프로세스를 내보낼지 결정하는 정책

 

 

물리 주소 공간 vs 논리 주소 공간

 

물리 주소 공간: 하드웨어 입장에서 바라본 주소 공간으로 컴퓨터마다 크기가 다르다.

논리 주소 공간: 사용자의 입장에서 바라본 주소 공간

 

 

단순 메모리 구조

 

: 한 번에 한 가지 일만 처리하는 일괄 처리 시스템에서 볼 수 있다.

: 메모리를 운영체제 영역사용자 영역으로 나누어 관리한다.

단순 메모리 구조에서 사용자 프로세스 적재

: 사용자 프로세스는 운영체제 영역을 피하여 메모리에 적재된다.

: 사용자 프로세스가 운영체제의 크기에 따라 매번 적재되는 주소가 달라지는 것이 번거롭다. -> 이를 개선하여 사용자 프로세스를 메모리의 최상위부터 사용하는 방안이 있으나 메모리를 거꾸로 사용하기 위해 주소를 변경하는 일이 복잡하기 때문에 잘 쓰이지는 않는다.

 

경계 레지스터

: 운영체제 영역과 사용자 영역 경계 지점의 주소를 가진 레지스터

: CPU 내에 있는 경계 레지스터가 사용자 영역이 운영체제 영역으로 침범하는 것을 막아준다

-> 메모리 관리자는 사용자가 작업을 요청할 때마다 경계 레지스터의 값을 벗어나는지 검사하고, 만약 경계 레지스터를 벗어나는 작업을 요청하는 프로세스가 있으면 그 프로세스를 종료시킨다.

 

 

절대 주소 vs 상대 주소 (absolute address VS relative address)

절대 주소: 실제 메모리의 물리 주소를 가리키는 주소

-> 메모리 주소 레지스터가 사용하는 주소

-> 컴퓨터에 꽂힌 램 메모리의 실제 주소

 

상대 주소: 사용자 영역이 시작되는 번지를 0번지로 변경하여 사용하는 주소

-> 사용자 프로세스 입장에서 바라본 주소

-> 절대 주소와 관계없이 항상 0번지부터 시작한다.

-> 프로세스의 입장에서는 상대 주소가 사용할 수 없는 영역의 위치를 알 필요가 없고, 주소가 항상 0번지부터 시작하기 때문에 편리하다.

 

* 논리 주소 공간은 상대 주소를 사용하는 주소 공간 / 물리 주소 공간은 절대 주소를 사용하는 주소 공간

 

 

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

: 메모리 접근 시 상대 주소를 사용하면 절대 주소로 변환해야 한다.

 

-> 메모리 관리자는 사용자 프로세스가 상대 주소를 사용하여 메모리에 접근할 때마다 상대 주소 값에 재배치 레지스터 값을 더하여 절대 주소를 구한다

(재배치 레지스터는 주소 변환의 기본이 되는 주소 값을 가진 레지스터로, 메모리에서 사용자 영역의 시작 주소 값이 저장되어 있다)

 

 

메모리 오버레이

 

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

-> 메모리 오버레이를 사용하면 물리 메모리(한정된 크기의 메모리)보다 더 큰 프로그램도 실행이 가능하다.

-> 프로그램 전체가 아니라 일부만 메모리에 올라와도 실행이 가능하다.

 

작동방식

: 프로그램이 실행되면 필요한 모듈만 메모리에 올라와 실행한다.

 

 

스왑 영역 (swap)

 

: 메모리가 모자라서 쫓겨난 프로세스를 저장장치(보조기억장치)의 특별한 공간에 모아두는 영역

: 메모리에서 쫓겨났다가 다시 돌아가는 데이터가 머무는 곳이기 때문에 저장장치는 장소만 빌려주고 메모리 관리자가 관리한다.

-> 사용자는 실제 메모리의 크기와 스왑 영역의 크기를 합쳐서 전체 메모리로 인식하고 사용한다.

 

1. 스왑인

: 스왑 영역에서 메모리로 데이터를 가져오는 작업

 

2. 스왑아웃

: 메모리에서 스왑 영역으로 내보내는 작업

 

 

메모리에 여러 개의 프로세스를 배치하는 방법

1. 가변 분할 방식 (= 연속 메모리 할당 방식)

: 프로세스의 크기에 따라 메모리를 나누는 것

: 프로세스의 크기에 맞게 메모리를 분할 -> 메모리의 영역이 각각 다르다.

: 연속으로 할당을 하기 때문에 맨 마지막 부분에 빈 공간이 생긴다.

 

2. 고정 분할 방식 (= 비연속 메모리 할당 방식)

: 프로세스의 크기와 상관없이 메모리를 같은 크기로 나누는 것

: 큰 프로세스가 메모리에 올라오면 여러 조각으로 나누어 배치

: 메모리가 미리 나뉘어져 있기 때문에 그 크기보다 작은 프로세스가 들어올 경우 빈 공간이 중간중간에 생긴다.

 

 

가변 분할 방식

 

- 장점: 프로세스를 한 덩어리로 처리하여 하나의 프로세스를 연속된 공간에 배치할 수 있다.

- 단점: 중간에 있는 프로세스가 먼저 작업을 끝내고 나갈 경우 뒤에 있는 프로세스를 땡겨서 비어 있는 공간을 하나로 합쳐야 하며, 이 과정에서 다른 프로세스의 자리도 다 옮겨야 하므로 메모리 관리가 복잡하다.

* 외부 단편화: 중간에 있는 프로세스가 작업을 끝내고 나갔을 때 생기는 작은 빈 공간 (18KB의 프로세스가 작업을 끝내고 나갔는데 18KB보다 큰 프로세스가 들어오면 적당한 공간이 없기 때문에 메모리를 배정하지 못하고 빈 공간이 생김)

 

외부 단편화 해결

- 메모리 배치 방식: (빈 공간에 들어갈 수 있는 크기의 프로세스가 있을 경우) 작은 조각이 발생하지 않도록 프로세스를 배치하는 것

- 조각 모음: 조각이 발생했을 때 작은 조각들을 모아서 하나의 큰 덩어리로 만드는 작업

 

1. 메모리 배치 방식의 종류

(1) 최초 배치(first fit)

: 프로세스를 메모리의 빈 공간에 배치할 때 메모리에서 적재 가능한 공간을 순서대로 찾다가 첫 번째로 발견한 공간에 프로세스를 배치하는 방법 -> 빈 공간을 찾아 다닐 필요가 없다.

 

(2) 최적 배치(best fit)

: 메모리의 빈 공간을 모두 확인한 후 적당한 크기 가운데 가장 작은 공간에 프로세스를 배치하는 방법

->  빈 공간을 모두 확인하는 부가적인 작업이 있지만 딱 맞는 공간을 찾을 경우 단편화가 일어나지 않는다.

->  딱 맞는 공간이 없을 때는 아주 작은 조각을 만들어내는 단점이 있다.

 

(3) 최악 배치(worst fit)

: 메모리의 빈 공간을 모두 확인한 후 가장 큰 공간에 프로세스를 배치하는 방법 

-> 프로세스를 배치하고 남은 공간이 크기 때문에 쓸모 있다.

->  빈 공간의 크기가 클 때는 효과적이지만, 빈 공간의 크기가 점점 줄어들면 최적 배치처럼 작은 조각을 만들어낸다.

 

 

2. 조각 모음

: 이미 배치된 프로세스를 옆으로 옮겨 빈 공간들을 하나의 큰 덩어리로 만드는 작업

조각 모음 순서

(1) 조각 모음을 하기 위해 이동할 프로세스의 동작을 멈춘다.

(2) 프로세스를 적당한 위치로 이동시킨다. (프로세스가 원래의 위치에서 이동하기 때문에 프로세스의 상대 주소 값이 바뀐다)

(3) 작업을 다 마친 후 프로세스를 다시 시작시킨다.

 

 

고정 분할 방식

 

- 장점: 메모리를 일정한 크기로 나누어 관리하기 때문에 메모리 관리가 수월하다 (가변 분할 방식의 메모리 통합 같은 부가적인 작업을 할 필요가 없다)

- 단점: 쓸모 없는 중간 중간의 빈 공간으로 인해 메모리 낭비가 발생할 수 있다. (위 그림의 프로세스B가 차지한 공간의 2KB)

 

* 내부 단편화: 각 메모리 조각에 프로세스를 배치하고 공간이 남는 현상

-> 고정 분할 방식은 내부 단편화를 줄이기 위해 신중하게 메모리의 크기를 결정해서 나눠야 하지만 사용하는 프로세스의 크기가 제각각이기 때문에 메모리를 얼마로 나누느냐에 대한 정답은 없다.

 

구분 가변 분할 방식 고정 분할 방식
메모리 단위 세그먼테이션 페이징
특징 연속 메모리 할당 비연속 메모리 할당
장점 프로세스를 한 덩어이로 관리 가능 메모리 관리가 편리
단점 빈 공간의 관리가 어려움 프로세스가 분할되어 처리됨
단편화 외부 단편화 내부 단편화

 

 

버디 시스템

 

작동 방식

(1) 프로세스의 크기에 맞게 메모리를 반으로 자르고 프로세스를 메모리에 배치한다.

(2) 나뉜 메모리의 각 구역에는 프로세스가 1개만 들어간다.

(3) 프로세스가 종료되면 주변의 빈 조각과 합쳐서 하나의 큰 덩어리를 만든다

 

-> 가변 분할 방식처럼 메모리가 프로세스 크기대로 나뉜다. (딱 맞게는 아닐 수도 있음..)

-> 고정 분할 방식처럼 하나의 구역에 다른 프로세스가 들어갈 수 없고, 메모리의 한 구역 내부에 조각이 생겨 내부 단편화가 발생한다.

->  비슷한 크디의 조각이 서로 모여 작은 조각을 통합하여 큰 조각을 만들기 쉽다.

 

* 쉽게 배우는 운영체제 책 참고

댓글