메모리 관리의 개요
시작
- 이전에는 하나의 프로그램만 실행시켜서 메모리 관리에 어려움이 크지 않았다.
- 현재 시분할 시스템에서는 많은 프로세스들이 메모리에 올라와 실행된다. 이를 효휼적으로 관리할 방법이 필요하다.
MMU
- memory manage unit
- 하드웨어이다.
- 간단히 정리한다.
역할
가져오기
- 프로세스와 데이터를 메모리로 가져온다.
- 요청이 없어도 필요할 것 같은 데이터를 미리 가져온다.
배치 작업
- 가져온 프로세스와 데이터를 메모리에 적절히 배치한다.
재배치 작업
- 메모리가 가득 찬 상황이면 일부 프로세스를 하드로 옮기는 작업을 한다.
정책
가져오기 정책
- 프로세스의 필요한 데이터를 언제 가져올지 결정하는 정책
- prefetch 를 하기도 한다.
배치 정책
- paging : 메모리를 같은 크기로 자르는 것
- segmentation : 프로세스 크기에 맞게 자르는 것
- 이런 기술을 이용해 효율적인 메모리 관리 정책을 만든다.
재배치 정책
- replacement algorithm : 무슨 프로세스를 내보낼지 정한다.
메모리 주소
32bit / 64bit cpu
메모리는 1byte마다 주소를 붙여 사용한다.
이때 MAR(메모리 주소 레지스터)를 이용한다.
- 32bit는 MAR의 크기가 32비트이다.
- 64bit는 64비트
여기서 cpu가 관리할 수 있는 메모리 공간의 사이즈를 알 수 있다.
- 32bit : 2^32 byte = 4GB 정도
- 64bit : 2^64 byte = 겁내 많음
즉 32bit에 16GB RAM을 박는 것은 …
- 메모리 주소는 다음과 같이 나눌 수 있다.
- Physical address space : 하드웨어 관점
- logical address space : 사용자 입장
절대 주소와 상대 주소
메모리 영역
기본적으로 메모리는 운영체제 영역과 사용자 영역으로 나뉜다.
이때 사용자 영역이 운영체제 영역을 침범하지 못하도록
- cpu의 경계 레지스터 값을 이용해 검사하고 막는다.
문제점은 운영체제의 크기가 변한다면 사용자 프로그램의 주소가 변해야 한다.
- 즉 프로그램을 짤 때는 360번지부터 400번지를 사용해서 프로그래밍하면, 후에 os가 바뀌면 문제가 발생한다.
- 이렇게 직접 물리주소를 이용하는 것은 문제가 많다.
절대 주소와 상대 주소
메모리 관리자 입장에서는 실제 메모리의 주소를 사용한다.
- 절대 주소는 실제 물리 주소를 가르킨다.
하지만 사용자 프로세스 입장에서는 0번부터 생각한다.
- 즉 운영체제와 mmu가 알아서 관리한다.
- 이때 재배치 레지스터를 이용한다.
- 이를 논리 주소 공간이라 부른다.
- 즉 운영체제와 mmu가 알아서 관리한다.
단일 프로그래밍과 메모리 할당
메모리 오버레이
- 컴퓨터의 메인 메모리보다 큰 프로그램을 실행하도록 만드는 방법
- 적당한 크기로 잘라서 메모리에 가져온다.
- module 단위로 나눈다.
- 프로그램의 일부만 올라와서 실행된다.
스왑
module 단위로 나누어졌을 때 사용하지 않는 module은 어디에 보관될까?
저장장치의 swap area에 보관된다. ( 공간을 마련함 )
- swap in : 스왑 영역에서 메모리로 데이터를 가져옴
- swap out : 메모리에서 스왑 영역으로 데이터를 내보냄
이는 메모리 관리자가 관리한다.
이때 사용자는 스왑 영역과 메모리 영역의 크기를 합쳐서 인식하게 된다.
- 사진에서 사용자는 5GB 프로그램을 돌리는 것으로 인식한다.
다중 프로그래밍과 메모리
- 지금까지는 한 프로세스만 실행되는 상황을 다루었다.
- 지금부터는 여러 프로세스들이 실행될 때 메모리 관리를 살펴보겠다.
메모리 분할 방식
- 메모리 배치 정책에 해당된다.
- 여러 프로세스를 메모리에 어떻게 배치할 것인가?
- variable-size partitioning : 가변 분할 방식
- fixed-size partitioning : 고정 분할 방식
variable-size partitioning
프로세스의 크기에 맞게 메모리가 분할 된다.
- 즉 메모리의 영역 크기가 모두 다르다.
한 프로세스가 연속된 공간에 배치된다.
- contiguous memory allocation
장점
- 프로세스를 한 덩어리로 처리해서 연속적인 공간에 배치 가능
단점
- 메모리 관리가 복잡하다.
fixed-size partitioning
프로세스의 크기 상관없이 메모리가 같은 크기로 분할 된다.
비연속 메모리 할당이라 부른다.
- noncontiguous memory allocation
장점
- 메모리 관리가 편하다.
단점
- 작은 프로세스가 올라오면 메모리 낭비가 발생한다.
- 혹은 잘려서
- 작은 프로세스가 올라오면 메모리 낭비가 발생한다.
Variable-size partitioning
외부 단편화
- 만약 B와 D가 종료되고 E라는 프로그램이 메모리에 올라오는 상황을 생각해보자
- 빈 공간보다 큰 공간을 필요로 하는 E는 올라가지 못한다.
- 결국 E는 공간을 받을 수 있을 때까지 기다린다 ( 아사 )
- 결국 작은 빈 공간이 생기게 된다.
- 이 현상을 Fragmentation(단편화)이라 부른다.
- 빈 공간을 external fragmentation이라 부른다.
- hole
프로세스 밖에서 빈 공간(조각)이 발생하기 때문이다.
- 이를 해결하기 위해
- memory placement strategy : 메모리 배치 방식
- 조각이 발생하지 않도록 배치
- defragmentation : 조각 모음
- 조각을 모아서 크게 만듬
- memory placement strategy : 메모리 배치 방식
메모리 배치 방식
- 대표적인 방법은 다음과 같다. (버디 시스템도 있다.)
- 최초 배치
- 적재 가능한 공간을 순서대로 탐색하다가 첫 번째 공간에 넣음
- 빈 공간 전체 탐색이 필요 없다.
- 다만 단편화가 잘 발생한다.
- 최적 배치
- 빈 공간을 모두 확인하고 가장 작은 공간에 배치한다.
- 아주 작은 조각이 남게 된다.
- 최악 배치
- 빈 공간을 모두 확인하고 가장 큰 공간에 배치한다.
- 남은 조각도 커서 재활용이 가능하다.
- 다만 시간이 지나면 작은 조각이 남는다.
조각 모음
아무리 배치를 잘해도 단편화 현상이 발생한다.
사용하지 못하는 작은 조각들을 모아 쓸모 있게 만들 필요가 있다.
단계
- 프로세스들 중단
- 적당한 위치로 차곡차곡 옮긴다. ( 상대 주소 값 )
- 프로세스 다시 시작
많은 시간이 걸린다.
Fixed-size partitioning
- 가상 메모리에서는 고정 분할 방식을 paging이라 부른다.
- 메모리를 같은 크기로 나누어 관리는 쉽지만 프로세스가 나눠 저장된다.
내부 단편화
기본적으로 가변 분할 방식보다는 고정 분할 방식을 기본으로 사용한다.
- 이는 관리가 수월하기 때문이다.
프로그램을 일정 단위로 나누기 때문에 외부 단편화는 발생하지 않는다.
- 일정 단위를 페이지라 부른다. ( 가상 메모리 기준 )
하지만 단위보다 작은 공간을 필요로 하면 내부 단편화가 발생한다.
- internal fragmentation
이를 해결하는 방법은 없다.
- 조각 모음이나 남는 공간을 다른 프로세스에게 넘길 수 없다.
유일한 해결책은 단위의 크기를 조절하는 것이다.