메모리 관리 작업은 크게 가져오기(fetch), 배치(placement), 재배치(replacement)로 구분된다.
실행할 프로세스와 데이터를 메모리로 가져오는 작업이다.
가져온 프로세스와 데이터를 메모리의 어떤 부분에 올려놓을지 결정하는 작업이다.
배치 정책은 페이징과 세그먼테이션의 장단점을 파악하여 메모리를 효율적으로 관리할 수 있도록 정책을 만드는 것이다.
이는 한정된 메모리를 효율적으로 사용하기 위한 것으로, 시스템의 효율을 좌우하는 매우 중요한 기준이 된다.
꽉 찬 메모리에 새로운 프로세스를 가져오기 위해 오래된 프로세스를 내보내는 작업을 재배치 작업이라고 한다.
메모리 관리자는 메모리를 운영체제 영역
과 사용자 영역
으로 나누어 관리한다.
운영체제는 시스템을 관리하는 중요한 역할을 하기 때문에 사용자가 운영체제를 침범하지 못하도록 분리해서 관리한다.
사용자 영역이 운영체제 영역으로 침범하는 것을 막으려면 하드웨어의 도움이 필요한데, 이는 CPU 내에 있는 경계 레지스터
가 담당한다.
경계 레지스터는 운영체제 영역과 사용자 영역 경계 지점의 주소를 가진다.
메모리 관리자는 사용자가 작업을 요청할 때마다 경계 레지스터의 값을 벗어나는지 검사하고, 만약 경계 레지스터를 벗어나는 작업을 요청하는 프로세스가 있으면, 그 프로세스를 종료한다.
CPU가 프로세스를 처리할 때 보는 주소 값과 실제 메모리의 주소 값은 다르다.
프로세스가 보는 메모리 영역을 논리 메모리 영역 또는 가상 메모리 영역이라고 하며, 실제로 사용되는 메모리 영역(RAM)을 물리 메모리 영역이라고 한다.
하드웨어 입장에서 바라본 메모리의 주소 공간을 물리 주소 공간이라 하며, 컴퓨터마다 그 크기가 다르다.
사용자 입장에서 바라본 메모리 주소 공간을 논리 주소 공간이라고 한다.
프로그램이 실행될 때마다 시작하는 물리 주소는 매번 바뀐다.
어쩔 땐 360번 부터 시작할 수도 있고, 어쩔 땐 460번 부터 시작할 수도 있다.
CPU가 프로세스를 실행할 때 사용하는 주소 값과 실제 주소 값이 다르므로 논리 주소를 물리 주소로 변환해줘야 하는데, 이러한 동작을 하는 하드웨어 장치를 메모리 관리 유닛(MMU)
이라고 한다.
MMU는 CPU에 위치하며, CPU에서 메모리에 접근하기 전에 MMU를 거쳐 논리 주소에 해당하는 물리 주소를 얻는다.
MMU는 보호해야 하는 메모리 영역에 대한 접근을 제한해 메모리를 보호하는 역할을 한다.
사용자 프로세스가 논리 주소 40번지에 있는 데이터를 요청한다.
CPU는 MMU에 40번지에 있는 내용을 가져오라고 명령한다.
MMU는 재배치 레지스터를 사용하여 400번지에 저장된 데이터를 가져온다.
재배치 레지스터
는 주소 변환의 기본이 되는 주소 값을 가진 레지스터로, 메모리에서 사용자 영역의 시작 주소 값이 저장된다.
사용자 프로세스 입장에서는 메모리 관리자가 재배치 레지스터를 사용하여 논리 주소를 물리 주소로 변환하기 때문에 메모리가 항상 0번지부터 시작하는 연속된 작업 공간으로 보인다.
절대 주소 지정과 상대 주소 지정의 차이점은 뭘까요?
절대 주소 지정은 물리적 메모리의 실제 주소를 할당 해주는 방법입니다.
상대 주소 지정은 프로세스마다 0번지에서 시작되는 논리 주소를 할당 해주는 방법입니다.
가상 주소와 물리 주소(실주소)에 대해 설명해주세요.
하드웨어 입장에서 바라본 메모리의 주소를 물리 주소라 합니다.
또한, 사용자 입장에서 바라본 메모리 주소를 논리 주소 즉 가상 주소라고 합니다.
프로그램이 실행될 때마다 시직하는 물리 주소는 매번 바뀌며 CPU가 프로세스를 실행할 때 사용하는 주소 값과 실제 주소 값이 다르므로 논리 주소를 물리 주소로 변환해줘야 합니다.
가상 주소를 물리 주소(실주소)로 어떻게 변환할까요?
주소 변환은 CPU와 메모리 사이에 위치하는 MMU라는 하드웨어에서 이루어 집니다.
MMU에는 TLB라는 캐시가 있는데, 자주 주소 변환이 이루어지는 주소들을 캐싱해 둡니다.
만약 요청된 주소가 TLB에 캐싱되어있지 않다면, 페이지 테이블을 통해 주소를 변환합니다.
변환 색인 버퍼 (TLB)
변환 색인 버퍼(Translation Lookaside Buffer, TLB)는 가상 메모리 주소를 물리적인 주소로 변환하는 속도를 높이기 위해 사용되는 캐시로, 약칭은 TLB이다.
TLB는 최근에 일어난 가상 메모리 주소와 물리 주소의 변환 테이블을 저장하기 때문에 일종의 주소 변환 캐시라고 할 수 있다.
현재 모든 데스크탑 및 서버용 프로세서는 하나 또는 그 이상의 TLB를 메모리 관리 하드웨어에 가지고 있다. 페이지 단위나 세그먼트 단위로 처리하는 가상 메모리를 사용하는 거의 모든 하드웨어는 TLB를 사용한다. CPU는 1차적으로 TLB에 접근하여 원하는 페이지가 존재하는지 탐색하고, TLB에 존재하지 않을 경우 MMU의 페이지 테이블을 참조한다.
프로그램의 크기가 실제 메모리(물리 메모리)보다 클 때 전체 프로그램을 메모리에 가져오는 대신 적당한 크기로 잘라서 가져오는 기법을 메모리 오버레이
라고 한다.
메모리 오버레이는 하나의 메모리에 여러 프로그램을 겹겹이 쌓아놓고 실행하는 것을 말하며, 프로그램을 몇 개의 모듈로 나누고 필요할 때마다 모듈을 메모리에 가져와 사용한다.
메모리 오버레이에서 어떤 모듈을 가져오거나 내보낼지는 CPU 레지스터 중 하나인 프로그램 카운터(PC)가 결정한다.
해당 모듈이 메모리에 없으면, 메모리 관리자에게 요청하여 가져오게 한다.
한정된 메모리에서 메모리보다 큰 프로그램을 실행할 수 있다.
프로그램 전체가 아니라 일부만 메모리에 올라와도 실행할 수 있다.
메모리에 모듈 B를 가져올 때 먼저 메모리에 올라온 묘듈 A를 어딘가에 보관해야 한다.
이때, 다시 사용할지도 모르고 아직 작업이 끝나지 않았기 때문에 하드디스크 위치로 옮기는 것이 아니라, 저장장치의 별도 공간에 보관한다.
메모리가 모자라서 쫒겨난 프로세스를 저장장치의 특별한 공간에 모아두는데, 이러한 영역을 스왑 영역
이라고 한다.
스왑 영역은 메모리 관리자가 관리한다.
원래 하드디스크 같은 저장장치는 저장장치 관리자가 관리하지만, 스왑 영역은 메모리에서 쫒겨났다가 다시 돌아가는 데이터가 머무는 곳이기 때문에 저장장치는 장소만 빌려주고 메모리 관리자가 관리한다.
한 번에 여러 프로세스를 동시에 실행하는 경우에는 메모리 관리가 복잡한데, 이는 프로세스들의 크기가 달라 메모리를 어떻게 나누어 사용할 것인지가 가장 큰 문제이기 때문이다.
한 프로세스가 메모리의 연속된 공간에 배치되기 때문에 연속 메모리 할당
이라고 한다.
물리 메모리에서 하나의 프로세스에 해당하는 주소 공간이 연속적으로 이어지기 때문이다.
연속적인 공간을 할당하려면 떨어져 있는 빈 공간들을 합쳐야 하므로, 메모리 통합 등의 부가적인 작업이 필요해 메모리 관리가 복잡하다.
외부 단편화가 발생한다.
프로세스가 들어갈 수 있는 메모리 영역이 남지 않아, 프로세스가 할당되지 못하는 경우를 말한다.
프로세스의 메모리 영역을 논리적 단위인 세그먼트
로 분할해 할당한다.
여기서 논리적 단위는 파일 내 함수 단위나 프로세스의 스택, 힙과 같은 영역을 의미하기도 한다.
세그먼테이션 테이블
을 사용해 세그먼트의 논리 주소를 물리 주소로 매핑한다.
세그먼테이션 테이블은 세그먼트 번호를 인덱스로 사용하며, 세그먼트별 시작 주소인 base와 세그먼트 길이인 limit를 저장한다.
프로세스의 메모리 영역을 논리적 단위로 나눠 저장하므로, 단위별로 데이터를 보호하기 쉽다는 장점이 있다.
하지만 세그먼트의 크기가 균등하지 않아서, 프로세스의 할당/해제를 반복하는 과정에서 외부 단편화 문제가 발생할 수 있다.
또한, 메모리에 로드된 스택 세그먼트 영역에서 오버플로가 발생하면, 다른 프로세스와 메모리 영역이 겹칠 수 있다.
그러면 다른 프로세스의 세그먼트나 스택 오버플로가 발생한 세그먼트를 디스크로 스왑 아웃해야 하는 단점이 있다.
세그먼테이션은 프로그램을 논리적인 단위인 세그먼트(segment)로 나누어 메모리에 할당하는 방법이다.
이때 세그먼트는 크기가 가변적이고 논리적인 단위이다.
이 방식은 프로그램의 크기가 달라지는 경우 유연하게 대처할 수 있지만, 외부 단편화와 같은 문제점이 있다.
조각 모음
조각 모음은 프로세스가 사용 중인 메모리 공간을 재배치해서 흩어져 있는 가용 메모리 공간을 하나로 합치는 것으로, 메모리 집약
이라고도 한다.
조각 모음은 후처리에 해당한다.
메모리 배치 방식
대표적인 메모리 배치 방식으로 최초 배치, 최적 배치, 최악 배치가 있다.
메모리 할당 알고리즘을 이용해 가용 메모리 공간에서 프로세스가 로드될 수 있는 메모리 공간을 찾는다.
메모리 배치 방식은 선처리에 해당한다.
최초 적합(first-fit)
가용 메모리 공간에서 프로세스 크기만큼 비어 있는 메모리 공간을 찾아 차례대로 프로세스를 로드하는 방식
최적 적합(best-fit)
할당하려는 프로세스 크기 이상인 가용 메모리 공간 중에서 가장 작은 공간에 프로세스를 할당하는 방식으로, 가용 메모리 공간을 모두 탐색해야 한다.
최악 적합(worst-fit)
할당하려는 프로세스 크기보다 큰 가용 메모리 공간 중에서 가장 큰 공간에 프로세스를 할당하는 방식으로, 가용 메모리 공간을 모두 탐색해야 한다.
큰 프로세스가 메모리에 올라오면 여러 조각으로 나뉘어 배치된다.
물리 메모리가 부족할 경우 나눈 조각 중 일부는 스왑 영역에 위치하게 된다.
고정 분할 방식에서는 하나의 프로세스가 여러 개로 나뉘어 배치되기 때문에, 비연속 메모리 할당이라고 한다.
비연속 메모리 할당
프로세스의 메모리 영역을 나눠서 메모리 공간에 저장하는 방법
프로그램이 메모리의 여러 영역에 분산되어 올라갈 수 있는 것을 말한다.
메모리를 일정한 크기로 나누기 때문에, 메모리 관리가 편하며 스왑 영역에 나머지 프로세스 조각이 저장되어 있어 실행에 문제가 없다.
현대 운영체제에서는 위의 이유로 기본적으로 고정 분할 방식을 사용한다.
하나의 프로세스가 여러 곳으로 나뉠 수 있다.
메모리에 올릴 수 있는 프로세스 수와 각 프로세스 크기가 제한된다는 단점이 있고, 단편화 문제가 발생할 수 있다.
내부 단편화가 발생할 수 있다.
분할된 메모리 영역에 프로세스가 할당되었지만, 메모리 영역보다 프로세스 크기가 작아 분할된 공간에서 일부 메모리 공간이 남는 경우를 말한다.
프로세스의 논리 메모리 영역과 물리 메모리 영역을 각각 일정한 크기의 페이지와 프레임으로 나눈다.
페이지와 프레임에는 각각 번호를 할당해 프로세스의 페이지와 메모리의 프레임을 매핑한다.
페이지와 프레임을 매핑하는 데는 페이지 테이블
을 사용한다.
페이지 테이블은 프로세스의 페이지 정보와 페이지에 매핑하는 프레임의 주소 값을 저장한다.
페이지 테이블은 각 프로세스의 PCB에 저장된다.
페이징 기법을 사용하면 페이지를 물리 메모리에 연속으로 할당할 필요가 없어서 외부 단편화 문제를 해결할 수 있다.
하지만 프로세스 크기가 페이지 수로 나누어 떨어지는지는 보장하지 않는다.
따라서 프로세스의 마지막 페이지가 페이지 크기보다 작을 수 있으므로 내부 단편화 문제가 발생할 수 있다.
또한, 페이지 테이블을 저장하기 위한 메모리 공간이 추가로 필요하다.
페이징은 프로그램을 고정된 크기의 블록인 페이지(page)로 나누어 메모리에 할당하는 방법이다.
이때 페이지는 크기가 고정적이며 물리적인 단위이다.
이 방식은 외부 단편화를 해결할 수 있지만, 내부 단편화와 같은 문제점이 있다.
가변 분할 방식의 단점인 외부 단편화를 완화하는 방법으로, 개변 분할 방식과 고정 분할 방식의 중간 구조이다.
가변 분할 방식처럼 메모리가 프로세스 크기대로 나뉘며, 고정 분할 방식처럼 하나의 구역에 다른 프로세스가 들어갈 수 없고, 메모리의 한 구역 내부에 조각이 생겨 내부 단편화가 발생한다.
프로세스의 크기에 맞게 메모리를 1/2로 자르고, 프로세스를 메모리에 배치한다.
나뉜 메모리의 각 구역에는 프로세스가 1개만 들어간다.
프로세스가 종료되면 주변의 빈 조각과 합쳐서 하나의 큰 덩어리를 만든다.
가변 분할 방식에서는 작은 조각이 큰 조각 사이사이에 있어 조각을 모으려면 큰 덩어리로 옮겨야 한다.
그러나 버디 시스템에서는 비스한 크기의 조각이 서로 모여있기 때문에 작은 조각을 통합하여 큰 조각을 만들기가 쉽다.
메모리 관리 측면에선 고정 분할 방식과 버디 시스템은 비슷한 수준이다.
하지만 모든 공간을 똑같은 크기로 나누는 고정 분할 방식이 단순하기 때문에 버디 시스템보다 고정 분할 방식을 많이 사용한다.
메모리 분할에 대해 설명해주세요.
메모리 분할은 여러 프로그램을 번갈아가며 수행시키는 멀티 프로그래밍 환경에서, 메모리에 여러 프로그램을 적재 시키기 위해 메모리 공간을 나누는 것입니다.
프로세스를 통째로 메모리에 연속해서 올리는 연속 메모리 할당 방식과 프로세스를 여러 조각으로 나누어 메모리에 올리는 불연속 메모리 할당 방식이 있습니다.
메모리 배치 기법(메모리 관리 전략)에 대해 설명해주세요.
프로세스를 메모리에 통째로 올리는 연속할당 기법에서는 메모리 외부 단편화 문제가 발생할 수 있습니다.
메모리의 외부 조각 공간을 최대한 활용하기 위해 어느 메모리 공간에 프로세스를 적재할지 결정해야 합니다.
이를 메모리 배치 기법 또는 동적 메모리 할당 문제라고 합니다.먼저 first-fit은 메모리의 가용공간을 순차적으로 살펴보면서, 프로세스가 적재될 수 있는 공간이 있으면 즉시 적재하는 방법입니다.
best-fit은 적재하고자 하는 프로세스 크기와 유사한 공간을 찾아 적재하는 방법입니다.
worst-fit은 적재 가능한 메모리 공간 중 크기가 가장 큰 곳에 프로세스를 배치하는 방법입니다.
외부 단편화와 내부 단편화의 차이가 뭔가요?
외부 단편화는 메모리 내에 프로세스가 1개만 들어갈 수 있는 10MB의 공간이 있다고 가정할 때, 12MB의 프로세스를 공간이 비좁아 넣지 못할 때 10MB의 공간을 외부 조각, 즉 외부 단편화라고 합니다.내부 단편화는 메모리 내에서 똑같이 1개만 들어갈 수 있는 10MB의 공간이 있다고 가정할 때, 8MB의 프로세스를 넣었을 때 2MB의 본 공간을 내부 조각, 즉 내부 단편화라고 합니다.
메모리 배치 기법 중 하나인 통합(colaescing)에 대해 설명해주세요.
크기가 일정하지 않은 프로세스를 통째로 메모리에 적재하는 방식에서는 외부 단편화가 발생할 수 있습니다.
통합은 인접한 외부 조각 또는 빈 메모리 공간을 합쳐서 새로운 빈 공간을 마련하는 기법입니다.
메모리 배치 기법 중 하나인 압축(compaction)에 대해 설명해주세요.
크기가 일정하지 않은 프로세스를 통째로 메모리에 적재하는 방식에서는 외부 단편화가 발생할 수 있습니다.
압축은 메모리의 한쪽으로는 프로세스들을 몰고 한쪽으로는 외부 조각들을 몰아서 빈 공간을 마련하는 기법입니다.
압축은 수행중인 프로세스의 메모리 위치를 이동시키는 오버헤드가 큰 작업입니다.
메모리 배치 기법 중 하나인 버디 시스템에 대해 설명해주세요.
고정 분할 기법의 내부 단편화, 가변 분할 기법의 외부 단편화가 발생하는 단점을 극복하기 위한 메모리 배치 기법입니다.
버디 시스템에서 일정 크기의 메모리 공간을 요청받으면, 그 공간과 비슷한 크기의 메모리 공간을 마련합니다.
메모리 공간이 다 쓰이고 해제되면, 인접한 두 개의 공간을 합치면서 큰 공간을 마련합니다.
메모리 배치 기법 중 하나인 페이징에 대해 설명해주세요.
페이징이란, 프로세스의 주소 공간을 일정한 크기의 페이지로 나눠서 메모리의 서로 다른 위치에 프로세스를 적재하는 기법입니다.
페이징 기법에서 메모리는 페이지 크기와 동일한 페이지 프레임으로 나누어져 있기 때문에 외부 조각이 발생하지 않습니다.
하지만, 프로세스의 크기가 항상 페이지 크기의 배수가 아닐 수 있기 때문에 내부 단편화는 발생할 수 있습니다.페이징 기법에서 특정 프로세스의 몇 번째 페이지가 물리적 위치의 몇 번째 페이지 프레임에 들어있는지에 대한 주소 변환 정보를 페이지 테이블에 유지합니다.
페이징 기법에서 메모리 접근을 하기 위해서는 먼저 페이지 테이블에 접근하여 주소를 얻고, 주소를 통해 다시 메모리에 접근해야 합니다.
즉, 메모리 접근을 두번씩 해야하는 오버헤드가 있습니다.
이런 오버헤드를 줄이기 위해 TBL이라는 고속 하드웨어 캐시에 자주 참조되는 페이지에 대한 주소 변환 정보를 캐싱해두어 성능을 높일 수 있습니다.
메모리 배치 기법 중 하나인 세그먼테이션에 대해 설명해주세요.
세그먼테이션이란, 프로세스의 주소 공간을 논리 다위인 세그먼트로 나누어 메모리의 서로 다른 위치에 적재하는 기법입니다.
일반적으로는 코드, 데이터, 스택 등을 기준으로 세그먼트를 정의합니다.
세그먼트는 논리 단위로 나누어져 있기 때문에 공유와 보안의 측면에서 페이징 기법에 대해 훨씬 효과적입니다.
프로세스간 주소 공간을 공유하거나, 특정 주소 공간에 대해 쓰기/읽기 전용 등의 접근 권한 제어를 하고자 할 때, 논리 단위로 이루어지기 때문입니다.
세그먼트는 크기가 균일하지 않기 때문에 외부 단편화를 발생시킵니다.
따라서 세그먼트를 메모리의 어느 공간에 적재할 것인지 결정해야하는 단점이 있습니다.
가상 메모리에 대해 설명해주세요.
가상 메모리는 프로세스마다 가상 주소를 할당하는 메모리 관리 기법입니다.
가상 메모리 기법에서 프로세스의 가상 메모리 공간 중 일부는 메모리에 적재되거나 일부는 디스크의 스왑영역에 존재할 수 있습니다.
물리적 메모리의 연장 공간으로써 디스크의 스왑영역이 사용될 수 있기 때문에, 프로그램 입장에서 물리적 메모리 크기에 대한 제약을 극복할 수 있습니다.
가상 메모리는 프로세스의 주소 공간을 메모리로 적재하는 단위에 따라 페이징 또는 세그먼테이션 방식으로 구현될 수 있습니다.