개발자 도전기

[STUDY] 가상메모리와 메모리 할당 본문

개발공부/코딩용어

[STUDY] 가상메모리와 메모리 할당

jnnjnn 2024. 4. 12. 11:37

 

가상메모리란?

운영 체제에서 제공하는 메모리 관리 기술 중 하나로

물리메모리(RAM)와 가상주소공간간의 매핑을 관리하는 시스템으로 보조 기억 장치(디스크)를 메모리처럼 사용하는 방식

 

 

가상메모리의 이해

 

사용자는 동시에 여러 프로그램을 사용하게 되고 그 프로그램의 크기는 메모리의 용량을 넘어서기도 한다. 그럼에도 우리가 무리없이 여러 프로그램을 실행할 수 있는 것은 여러 프로그램의 메모리 할당이 물리메모리(RAM)가 아닌 가상메모리에 할당되기 때문이다.

 

가상메모리에 할당된 가상 주소는 MMU를 통해 물리 주소로 변환되고 물리 메모리에 할당된다. 물리 메모리에 할당되지 않은 영역은 디스크에 SWAP 됨으로써 실제 메모리보다 큰 가상 주소 공간을 제공한다

 

 

논리 주소와 물리 주소

논리 주소란 프로그램 실행 중 CPU가 생성하는 주소이다.

 

예를 들어 32bit CPU의 경우 하나의 주소 크기는 32bit(=4byte)이다. 이 주소는 메모리에 1바이트씩 저장된다

따라서 주소 하나의 크기는 1byte이고 총 주소의 저장 공간은 2^32btye = (2^2*2^10*2^10)byte = 4GB가 된다.

 

64bit CPU의 경우 2^64개의 저장 공간이 생성된다.

이는 2^61 페타바이트이다.

 

MMU(Memory-Management Unit)

논리 주소를 물리 주소로 매핑해주는 하드웨어 장치를 말한다

  • Relocation Register : 접근할 수 있는 물리적 메모리 주소의 최소값
  • Limit Register : 논리적 주소의 범위 (할당된 메모리 공간을 벗어나는지 체크한다)
  • trap : 할당된 메모리 공간을 벗어나면 trap을 발생시킨다

 

 

 

주소 바인딩

컴파일 타임 바인딩

처음부터 논리적 주소와 실제 주소가 같은 것을 말함.

새로운 주소를 할당하기 위해서는 다시 컴파일을 해야 하기 때문에

하나의 프로세스에서 사용이 가능하고 멀티 프로세스에서는 적절한 방법이 아님

 

로드 타임 바인딩

프로그램이 실제 메모리에 로드 될 때 메모리를 매핑 하는 것. 논리적 주소와 물리적 주소가 다름

reloadlocation 항상 특정 위치에 주소가 올라가고 프로그램이 종료될 때까지 물리적 메모리 상의 위치가 고정됨

 

런타임바인딩(Execution Binding)

프로그램이 실행 이후에도 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있음

CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지 주소 매핑 테이블을 이용해 주소 바인딩을 점검함

 

MMU 필요

 

메모리 할당이란?

프로세스가 메모리 공간을 요청하면 운영체제가 요청을 수락하고 메모리를 할당하는 것

OS가 할당된 부분을 제외하고 사용자 프로세스 영역을 할당하게 됨

 

연속할당

✅ 고정분할방식

 

물리적 메모리를 몇 개의 영구적 분할(파티션)로 나누는 것을 말한다.

 

프로그램은 파티션 사이즈가 프로그램 이상인 최초의 빈 파티션을 찾아 들어가게 된다.

이로 인해 단편화 문제로 외부조각과 내부조각이 발생하게 된다

 

메모리 단편화

RAM에서 메모리의 공간이 작은 조각으로 나뉘어져 사용가능한 메모리가 충분히 존재하지만 할당(사용)이 불가능한 상태로 내부단편화와 외부 단편화가 있다.

 

내부 단편화(Internal Fragmentation)

프로세스가 필요한 양보다 더 큰 메모리가 할당되어서 프로세스에서 사용하는 메모리 공간이 낭비되는 상황

👉 4kb를 할당받았지만 사실상 사용하는 부분은 1kb일 때 내부단편화는 3kb

 

외부 단편화(External Fragmentation)

중간중간에 생긴 사용하지 않는 메모리가 존재하지만 할당은 불가능한 상태

👉 메모리의 가장 큰 빈 공간은 8kb이지만 9kb짜리 프로세스를 할당을 해야 해서 할당이 불가능한 경우 외부단편화는 8kb

 

 

✅ 가변분할방식

가변분할 방식은 고정분할방식과 다르게 메모리 영역을 미리 나누어 놓지 않는 것

 

메모리에 차곡차곡 프로그램을 올리는 방식으로, 파티션을 나누어 놓지 않아 내부조각은 발생하지 않는다.

하지만 중간에 프로그램이 종료되어 사이에 빈 공간이 발생하였을 때, 새로 올릴 프로그램이 해당 영역보다 사이즈가 커서 메모리에 올리지 못하는 상황이 발생하여 외부 조각(hole)은 발생한다.

 

size n인 프로그램의 요청을 만족하는 적절한 hole 찾기

First-fit

: Size가 N 이상인 것 중 최초로 찾아지는 hole에 할당하는 방법  빈 공간(hole)을 찾는 오버헤드가 작다는 장점이 존재

 

Best-fit: Size가 N 이상인 가장 작은 Hole을 찾아서 할당하는 방법  hole을 찾는 오버헤드는 존재하지만 조각의 발생을 최소화할 수 있다

 

Worst-fit: 가장 큰 hole에 할당하는 방법   가장 큰 외부 조각을 생성하기 때문에 가장 비효율적인 방법이다

 

이 외부 단편화 문제를 해결하기 위해 compaction이라는 방법을 사용하는데

사용중이 메모리 영역을 한 장소로 모아서, hole들을 모아 큰 block을 만드는 방법이다.

 

이 방법을 수행하려면 프로세스를 중지시키고, 이동하고, 주소를 바꾸고, 다시 시작하는 작업을 해야하기 때문에 시간이 많이 걸린다.

 

 

불연속할당

불연속 할당이란 프로그램을 여러 개로 나누어서 메모리의 여러 영역에 분산되어 올라갈 수 있는 것을 말한다

가상 메모리를 구현한 것으로 현대 시스템에서는 불연속 할당 기법을 사용한다.

 

가상 주소란?

가상 메모리에 할당된 주소이다

 

페이징

페이징 기법이란 프로세스의 가상 메모리와 물리 메모리를 동일한 사이즈(페이지)로 나누어서 할당하는 것을 말한다.

물리 메모리의 페이지가 동일한 크기의 페이지 프레임에 할당되게 되므로 외부 조각은 발생하지 않고, 프로세스의 크기가 페이지의 배수로 나누어 떨어지지 않기 때문에 내부 조각이 발생한다.

 

해당 페이지 정보는 페이지 테이블에 존재하며 논리 메모리에 저장된 페이지가 어느 페이지 프레임에 존재하는지 확인할 수 있다. 또, 페이지 테이블은 프로그램마다 존재한다.

세그먼테이션

세그멘테이션 기법이란 프로그램을 의미 단위인 세그먼트로 나누는 것을 말한다.

의미 단위란 프로그램을 기능이나 함수 단위로 나눈 것으로 각 세그먼트마다 별도의 크기를 가진다.

세그멘테이션은 각 세그먼트를 독립적으로 관리하므로 프로세스의 중요한 데이터나 코드를 다른 세그먼트로부터 격리시킬 수 있다. 예를 들어 실행 코드를 포함하는 세그먼트는 실행 권한만 부여하고, 읽기/쓰기 권한은 부여하지 않을 수 있다.

 

페이징과 유사하게 세그먼트 정보를 저장하는 세그먼트 테이블이 프로그램별로 존재한다.

내부 조각은 발생하지 않지만 외부 조각이 발생하므로 추가적인 관리가 필요하다.

 

 

 

세그멘테이션-페이징 혼용 기법

페이징 방식과 세그멘테이션 방식을 혼합해서 사용하는 것으로 세그먼트 하나가 여러 개의 페이지로 구성되는 방식이다.

의미나 보안 면에서는 세그먼트 방식의 장점을 챙길 수 있고, 메모리 면에서는 페이지로 쪼개서 저장하므로 외부 조각의 발생을 막을 수 있다. 즉, 두가지 방식의 장점을 모두 사용할 수 있는 방식이다