middlefitting

[OS] 논리(Logical) 메모리와 물리(Physical) 메모리에 관하여 본문

OS

[OS] 논리(Logical) 메모리와 물리(Physical) 메모리에 관하여

middlefitting 2023. 2. 4. 22:37

Logical Address vs Physical Address

물리적 메모리 관리에 앞서 논리 메모리 주소와 물리 메모리 주소에 관해 알아보고자 합니다.

 

논리적 주소는 가상 주소라고도 말하며, 프로세스마다 독립적으로 가지는 주소 공간을 말합니다.

 

물리적 주소는 실제 메모리 하드웨어에 올라와 있는 주소를 말합니다.

 

이 두개가 나누어져 있는 이유는 일반적으로 논리적 메모리가 물리적 메모리보다 크기 때문입니다.

 

물리적 메모리에는 그때 그때 필요한 메모리가 들어가게 되고, 만약 공간이 부족할 경우에는 Swap 영역으로 쫓겨나게 되는 것입니다.

 

쫓겨났던 메모리가 다시 들어오게 될 때에는 Swap 영역에서 다시 물리 메모리 공간으로 들어온다고 생각하실 수 있습니다.

 

 

 

주소 바인딩

컴파일시에 심볼 주소는 논리형 숫자 주로소 바뀌게 되고, 그것은 프로그램마다 가지는 주소가 됩니다.

 

프로그램이 실행되기 위해서 물리 메모리에 내용이 올라가게 되는데, 물리 메모리 주소 결정을 주소 바인딩이라고 합니다.

 

주소 바인딩의 결정 시점에 따라 다음과 같은 종류가 존재합니다.

 

 

컴파일 타임 바인딩

컴파일 시점에 물리 메모리가 결정되는 것을 말하며, 논리 주소가 곧 물리 주소가 되는 것을 말합니다.

 

매우 비효율적인 방식이고, 과거 하나의 컴퓨터에 하나의 프로세스만 올라갈 때에는 사용되었지만,

 

현재는 사용되지 않는 방식입니다.

 

 

로드 타임 바인딩

프로그램이 실행될 때 메모리에 올라갈 물리 메모리가 결정되는 것을 말하며,

 

컴파일러가 재배치 가능 코드를 생성한 경우 수행이 가능합니다.

 

재배치 가능 코드란 항상 특정 위치에 주소가 올라가는 것이 아니라 실행 시점의 비어있는 위치에 올라가게 되는 것을 말합니다.

 

 

런타임 바인딩

런타임 바인딩도 로드 타임 바인딩처럼 실행시 주소가 결정됩니다.

 

로드 타임과의 차이점은 주소가 실행 도중 바뀔 수 있다는 점입니다.

 

현대 운영체제에서 사용하는 방식이며, 로드 타임 바인딩과 비교해서 장점을 가지게 되는데,

 

런타임 바인딩을 사용하면

 

물리 메모리는 경우에 따라 Swap 영역으로 쫓겨난 이후 해당 주소에 다른 값이 들어올 수 있고,

 

다시 돌아온 메모리가 꼭 해당 주소가 아니라 다른 위치에 들어갈 수 있기 때문에 유연하게 메모리 관리를 수행할 수 있는 것입니다.

 

런타임 바인딩을 위해서는 하드웨어적인 지원이 필요하며, MMU라는 하드웨어가 그때그때 주소바인딩을 지원합니다.

 

 

 

MMU란

MMU란 논리 주소를 물리 주소로 매핑해주는 하드웨어 장치를 말합니다.

 

기본적인 수행 방식은 레지스터 2개를 통해 주소를 변환하는데, 시작 위치를 지정하는 Base 및 프로그램의 최대 크기가 존재하는 Limit

 

레지스터를 통해 시작 위치에 논리 주소를 더해줘서 진행합니다.

 

리미트를 벗어나는 메모리 위치를 요청하는 경우에는 다른 프로그램의 주소에 접근하는 것이나 마찬가지인 악의적인 요청이기 때문에

 

정보를 주지 않고 abort하는 등의 방식으로 응징을 하게 됩니다.

 

 

 

 

메모리 관리 용어

Dynamic Loading

다이나믹 로딩(동적 로딩)은 프로세스 전체를 미리 메모리에 올리는 것이 아니라  해당 루틴이 불려질 때 메모리에 올리는 것을 말합니다.

 

메모리를 유연하게 사용할 수 있으며, 가끔씩 사용되는 코드가 많은 경우에 유용하겠습니다

 

동적 로딩을 위해서 프로그래머가 쉽게 수행할 수 있도록 운영체제가 라이브러리 형태로 제공하는데, C언어에서 malloc을 하는 등의

 

방식을 생각하시면 될 것 같습니다.

 

 

Overlays

메모리의 프로세스의 부분 중 실제 필요한 정보만을 올리는 것을 말합니다.

 

운영체제 지원없이 사용자에 의해 구현되며, 프로세스의 크기가 메모리보다 클 경우에 유용합니다.

 

오버레이가 동적 로딩과 다른점은 역사적인 차이가 있습니다. 오버레이는 과거에 메모리 공간이 너무 작았기 때문에 수잡업으로 프로그램을

 

잘라서 올리게 되었던 것을 말하며 사용자가 직접 구현하는 내용입니다.

 

동적 로딩은 라이브러리를 통해 할당을 해주게 됩니다.

 

 

Swapping

프로세스를 일시적으로 메모리에서 backing store(하드디스크)로 쫓아내는 것을 말합니다.

 

하드디스크의 swap area라는 곳으로 쫓겨나게 되는데 디스크는 메인 메모리보다 느리긴 하지만 사용자의 프로세스 이미지를 담을 만큼 큰

 

저장공간입니다. 스왑핑을 유용하게 사용하기 위해서는 런타임 바인딩을 사용해야 하는데, 왜냐하면 로드 타임에서는 쫓아냈다가 다시

 

불러오려면 같은 메모리에 올려야 하므로 유연하게 동작이 어렵기 때문입니다. 따라서 런타임 바인딩을 해야 다른 비어있는 위치에 유연하게

 

올릴 수 있으니 효율적으로 사용할 수 있습니다.

 

 

Dynamic Linking

링킹을 실행시간까지 미루는 기법을 말합니다.

 

링킹이란 프로그램을 작성하고, 실행시키기 위해 여러개의 실행파일을 묶는 과정을 말합니다.

 

링킹에는 스태틱 링킹과 다이나믹 링킹이 존재하는데,

 

스태틱 링킹이란 라이브러리 코드가 프로그램 실행 파일 코드에 포함되는 것을 말합니다. 

 

당연히 실행 파일의 크기가 커지게 되고,

 

동일한 라이브러리를 각각의 프로세스가 메모리에 올릴 수 있기 때문에 메모리 낭비가 발생하게 됩니다.

 

다이나믹 링킹은 라이브러리가 실행 파일을 만들때 포함되지 않고, 실행중 해당 라이브러리가 필요할때, 라이브러리를 찾게 됩니다.

 

라이브러리는 별도의 파일에 존재하는 것이고, 코드 안에는 라이브러리를 찾을 수 있는 작은 코드 stub이 존재하는 방식으로 작동합니다.

 

즉 메모리에 해당 라이브러리가 올라와 있는 상황이면 해당 주소로 가게 되고, 없다면 디스크에서 읽어오는 방식입니다.

 

다이나믹 링킹은 라이브러리를 다른 프로그램과 공유할 수 있으니 스태틱 링킹보다 메모리를 효율적으로 사용할 수 있게 됩니다.

 

 

 

출처

KOWS 운영체제 - 반효경 교수님 - Memory Management 1

http://www.kocw.net/home/search/kemView.do?kemId=1046323