Summary

[운영체제와 정보기술의 원리] 07장. 메모리 관리

프로그래민 2021. 12. 27. 23:56
반응형

컴퓨터에서는 byte 단위로 메모리 주소를 부여하기 때문에 만일 32비트 주소 체계를 사용하면 2^32바이트만큼의 메모리 공간에 서로 다른 주소를 할당한다. 또한 내부적으로 보통 4KB(2^12byte) 단위로 묶어서 페이라는 하나의 행정구역을 만들어서 처리한다. 

 

주소 바인딩

프로그램이 메모리에 적재되면 프로세스마다 프로세스를 위한 독자적인 주소 공간이 생긴다. 이를 논리적 주소(Logical Address) 혹은 가상 주소(Virtual Address)라고 한다. CPU는 이 논리적 주소에 근거해 명령을 실행한다. 논리적 주소는 각 프로세스마다 독립적이며 0부터 가지고, 이와 반대로 물리적 주소는 메모리에 실제로 올라가는 위치이다. 

CPU가 기계어 명령을 수행하기 위해 논리적 주소를 참조하면, 논리적 주소가 물리적 메모리의 어느 위치에 매핑되어있는 지 확인해야한다. 이렇게 논리적 주소를 물리적 메모리 주소로 연결시켜주는 것을 주소 바인딩이라고 한다. 주소 바인딩 방식은 크게 3가지로 분류할 수 있다. 물리적 메모리 주소가 프로그램을 컴파일할 때 결정되는 주소 바인딩 방식인 컴파일 타임 바인딩, 프로그램이 실행이 시작될 때 물리적 주소가 결정되는 주소 바인딩 방식인 로트 타임 바인딩 그리고 프로그램이 실행을 시작한 후에도 그 프로그램이 위치한 물리적 메모리상의 주소가 변경될 수 있는 주소 바인딩인 실행시간 바인딩이 있다. 

MMU 기법에 의한 주소 변환

실행시간 바인딩은 주소 매핑 테이블, 기준 레지스터(Base Register), 한계 레지스터(Limit Register), MMU(Memoryt Management Unit)을 활용하여 매핑한다. MMU는 논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치이다. CPU가 특정 프로세스의 논리적 주소를 참조하려고 할 때 MMU 기법은 그 주소값에 기준 레지스터의 값을 더해 물리적 주소를 얻어낸다. 이때 기준 레지스터는 그 프로세스의 메모리 시작 주소값을 가지고 있게 된다. MMU 기법에서는 문맥교환시에 기준 레지스터(재배치 레지스터)의 값을 해당 프로세스 값으로 재설정하는 것을 지원한다.

기준 레지스터와 한계 레지스터에 의한 주소 변환

다만 다중 프로그래밍에서의 MMU 방식은 해당 프로세스의 주소 공간을 벗어나는 경우가 발생할 수 있다. 이는 메모리 보안을 침범할수 있기 때문에 한계 레지스터를 사용한다. 기준 레지스터와 한계 레지스터값을 이용하여 다른 프로세스를 접근하는지 확인하게 되고, 만일 다른 프로세스의 메모리를 참조하게 된다면 트랩을 발생시켜 해당 프로세스를 강제 종료 시키게 된다.

 

메모리 관리와 관련된 용어

동적로딩

동적로딩(Dynamic Loading)은 여러 프로그램이 동시에 메모리에 올라가게 되는 다중 프로그래밍 환경에서 메모리 사용의 효율을 높이는 기법 중 하나이다. 동적로딩에서는 프로세스가 시작 될 때 프로세스의 주소 공간 전체를 메모리에 올려놓는 것이 아니라 해당 부분이 불릴 때 그 부분만을 메모리에 적재하는 방식을 사용한다. 즉 프로세스 내에서 실행에 필요한 부분이 실제로 불릴 때마다 메모리에 적재를 하는 것이다. 

 

동적연결

동적연결(Dynamic Linking)은 컴파일을 통해 생성된 목적파일과 라이브러리 파일 사이의 연결을 프로그램의 실행 시점까지 지연시키는 방법이다. 라이브러리가 실행시점에 연결되기 때문에 라이브러리 코드가 실행파일에 포함되지 않으며 호출될 때 라이브러리에 대한 연결이 이루어 진다. 이를 위해 실행파일의 라이브러리 호출 분에 라이브러리를 찾기 위한 스텁(Stub)이라는 코드를 사용한다.

 

중첩

중첩(Overlays)이란 프로세스의 주소 공간을 분할해 실제 필요한 부분만을 메모리에 적재하는 기법이다. 동적로딩과 유사하지만 동적로딩은 메모리에 더 많은 프로세스를 동시에 올려놓고 실행하기 위한 용도인 반면, 중첩은 단일 프로세스만을 메모리에 올려놓는 환경에서 메모리 용량보다 큰 프로세스를 실행하기 위한 방식이다.

 

스와핑

스와핑(Swapping)이란 메모리에 올라온 프로세스의 주소 공간 전체를 디스크의 스왑 영역에 일시적으로 내려놓는 것을 말한다. 스왑 영역은 백킹스토어라고 하며 디스크내에 파일시스템과 별도로 존재하는 영역이다. 파일 시스템은 비휘발성인 반면 스왑영역은 휘발성이다. 디스크에서 메모리로 올리는 작업을 스왑 인, 메모리에서 디스크로 내리는 작업을 스왑 아웃이라고 한다. 보통 중기 스케줄러에 의해 스왑 아웃시킬 프로세스가 선정된다.

 

물리적 메모리의 할당 방식

물리적 메모리는 운영체제 상주 영역(커널)과 사용자 프로세스 여역으로 나뉘어 진다. 사용자 프로세스 영역의 관리 방법은 프로세스를 메모리에 올리는 방식에 따라 연속할당, 불연속할당 방식으로 나누어 진다. 연속할당 방식에서는 물리적 메모리를 다수의 분할로 나누어 하나의 분할에 하나의 프로세스가 적재되도록 하는 방식이다. 이때 분할 관리 방식에 따라 고정분할, 가변분할이 있다. 불연속할당 방식하나의 프로세스를 물리적 메모리의 여러 영역에 분산해 적재하는 방식이다. 크게 페이징 기법과 세그멘테이션 기법, 페이지드 세그멘테이션 기법이 있다.

 

연속할당 방식 - 고정분할 방식

고정분할 방식은 물리적 메모리를 주어진 개수만큼의 영구적인 분할로 미리 나누어두고 각 분할에 하나의 프로세스를 적재해 실행시키는 방식이다. 고정분할 방식에서는 동시에 메모리에 올릴 수 있는 프로그램의 수가 고정되며 프로그램의 크기보다 분할의 크기가 작은 외부조각(External Fragmentation), 프로그램의 크기보다 분할의 크기가 큰 내부조각(Internal Fragmentation)이 발생할 수 있다. 

 

연속할당 방식 - 가변분할 방식

가변분할 방식은 고정분할 방식과 달리 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식이다. 가변분할 방식에서는 프로그램 크기보다 크게 할당하지 않기에 내부조각은 발생하지 않지만, 새롭게 시작되는 프로그램의 크기가 작을 경우 외부조각이 발생할 수 있다. 

가변분할 방식에서는 프로그램을 메모리어 어떤 위치에 올릴지를 결정하는 동적 메모리 할당 문제가 중요하다. 이를 위해 세가지 방법이 있다. 첫번째로는 크기가 n이상인 가용 공간중 가장 먼저 찾아지는 곳에 프로세스를 최초적합(First-Fit) 방법이다. 두번째 방법은 크기가  크기가 n이상인 가용 공간중 가장 작은 곳에 프로세스를 할당하는 최적적합(Best-Fit)이다. 세번째 방법으로는 가용 공간중에서 크기가 큰 곳에 새로운 프로그램을 할당하는 최악적합(Worst-Fit)이 있다.

가변분할 방식에서는 외부조각을 해결하기 위해 컴팩션이라는 것을 한다. 물리적 메모리에서 프로세스에 의해 사용중인 메모리 영역을 한쪽으로 몰고 가용 공간들을 다른 한쪽으로 모아서 하나의 큰 가용 공간을 만드는 방법이다.

 

불연속할당 기법

불연속할당기법은 하나의 프로세스가 물리적 메모리의 여러 위치에 분산되어 올라갈 수 있는 메모리 할당기법이다. 하나의 프로그램을 분할하는 기준에 따라 동일한 크기로 나누어 메모리에 올리는 페이징 기법과 크기는 일정하지 않지만 의미 있는 단위로 나누어 메모리에 올리는 세그멘테이션 기법, 그리고 세그멘테이션을 기본으로 하되 이를 다시 동일 크기의 페이지로 나누어 메모리에 올리는 페이지드 세그멘테이션 기법이 있다.

 

페이징 기법

페이징(Paging) 기법이란 프로세스의 주소 공간을 동일한 크기의 페이지 단위로 나누어 물리적 메모리의 서로 다른 위치에 페이지들을 저장하는 방식이다. 페이징 기법에서는 각 프로세스의 주소 공간 전체를 메모리에 한꺼번에 올릴 필요가 없고, 일부는 백킹스토어(디스크)일부는 물리적 메모리에 혼재시킨다. 페이징 기법에서는 물리적 메모리를 페이지와 동일한 프레임(Frame)으로 미리 나누어 둔다. 따라서 메모리에 빈 프레임이 있으면 페이지를 할당하는 방식이다.

페이징 기법

하나의 프로세스더라도 주소 페이지 단위로 물리적 메모리에 올리는 위치 상이하여 논리적 주소를 물리적 주소로 변환하는 작업이 페이지 단위로 이루어져야 한다. 이를 위해 모든 프로세스가 각각의 페이지 테이블을 가지게 된다. 페이징 기법에서는 페이지 단위 이기 때문에 외부조각 문제가 없다. 하지만 프로세스의 가장 마지막 페이지에서는 내부조각이 발생할 수 있다.

 

주소 변환 기법

페이징 기법에서는  CPU가 사용하는 논리적 주소를 페이지 번호(p)와 페이지 오프셋(d)로 나누어 주소 변환한다. 페이지 번호는 각 페이지별 주소 변환 정보를 담고 있는 페이지 테이블 접근시 인덱스로 사요되고, 해당 인덱스의 항목에는 그페이지의 물리적 메모리상의 기준주소인 시작 위치가 저장된다.

 

페이지 테이블의 구현

페이지 테이블은 페이징 기법에서 주소 변환을 위한 자료구조로 물리적 메모리에 위치한다. 메모리 내에서의 페이지 테이블의 시작위치를 가르키는 페이지 테이블 기준 레지스터와 페이지 테이블의 크기를 보관하는 페이지 테이블 길이 레지스터로 운영한다. 

TLB에 의한 페이징 기법의 주소 변환

페이징에서 메모리에 접근하기 위해선 페이지 테이블, 메모리 이렇게 2단계로 접근하기 때문에 이를 위해 주소 변환용 하드웨어 캐시인 TLB(Translation Look-aside Buffer)를 사용한다. 빈번히 참조되는 페이지에 대한 주소 변환 정보를 TLB에서 저장한다. 따라서 TLB에 존재하는 페이지 정보는 그대로 사용할 수 있다. 

 

계층적 페이징

2단계 페이징 기법에서는 주소 변환을 위해 외부 페이지 테이블과 내부 페이지 테이블 두 단계에 걸친 페이지 테이블을 사용한다. 사용되지 않는 주소 공간에 대해서는 외부 페이지 테이블의 항목을 NULL로 설정하며, 여기에 대응하는 내부 페이지 테이블을 생성하지 않는 방식이다. 

 

역페이지 테이블

페이지 테이블로 인한 메모리 공간의 낭비가 심한 이유는 모든 프로세스의 모든 페이지에 대해 페이지 테이블 항목을 다 구성해야 했기 때문에, 이것을 해결하기 위한 대안으로 역페이지 테이블 기법을 사용한다. 역페이지 테이블 기법은 물리적 메모리의 페이지 프레임 하나당 페이지 테이블에 하나씩의 항목을 두는 방식이다. 즉, 논리적 주소에 대해 페이지 테이블을 만드는 것이 아니라 물리적 주소에 대해 페이지 테이블을 만드는 방식이다. 각 프로세스마다 페이지 테이블을 두는 것이 아니라 시스템 전체에 페이지 테이블을 하나만 두는 방식이다.

 

공유 페이지

공유 페이지

공유 코드는 메모리 공간의 효율적인 사용을 위해 여러 프로세스에 의해 공통으로 사용될 수 있도록 작성된 코드이다. 공유 페이지는 공유 코드를 가진 페이지로써 읽기전용의 성질이 있고, 페이지를 공유하는 모든 프로세스의 주소 공간에서 동일한 페이지 번호를 가지게 된다.

 

메모리 보호

페이지 테이블의 각 항목에는 주소 변환 정보뿐만 아니라 메모리 보호를 위한 보호비트와 유효-무효 비트를 가지고 있다. 보호비트는 각 페이지에 대한 접근 권한을 담고, 유효 무효 비트는 해당 페이지의 내용이 유효한지에 대한 내용을 담게 된다.

 

세그먼테이션

세그먼테이션은 프로세스의 주소 공간을 의미 단위의 세그먼트(Segment)로 나누어 물리적 메모리에 올리는 기법이다. 세그먼트는 논리적 단위이기 때문에 크기가 균일하지 않다. 페이징과 비교했을때 프로세스의 주소 공간이 통째로 올라가지 않고 나누어져 메모리에 올라간다는 점이 비슷하지만 세그먼트단위이기 때문에 크기가 균일하지 않다는 점이 다르다. 다만 물리적 메모리 관리에서 외부조각이 발생하며 세그먼트를 어느 가용 공간에 할당할 것인지 결정하는 문제가 발생한다. 

세그먼테이션 기법에서의 주소 변환

세그먼테이션에서는 주소 변환을 위해 세그먼트 테이블을 사용하며, 세그먼트 테이블의 각 항목은 기준점(Base)과 한계점(Limit)을 가지고 있다. 세그먼트 테이블 기준 레지스터(Segment Table Base Register)와 세그먼트 테이블 길이 레지스터(Segment Table Length Register)를 사용한다. 요청된 세그먼트 번호가 세그먼트 테이블 기준 레지스터에 저장된 값보다 작은 값인가와 논리적 주소의 오프셋 값이 세그먼트의 길이보다 작은 값인가를 비교하여 주소를 변환한다.

세그먼테이션도 페이징과 비슷하게 공유 세그먼트라는 개념이 있어서 각 세그먼트 테이블마다 공유 세그먼트를 공유할 수 있게 된다.

 

페이지드 세그먼테이션

페이지드 세그먼테이션은 페이징과 세그먼테이션의 장점만을 취한 방식이다. 세그먼테이션과 마찬가지로 프로그램을 의미있는 단위의 세그먼트로 나누지만 임의의 길이가 아니라 동일한 크기의 페이지들의 집합으로 구성된다. 하나의 세그먼트 크기를 페이지 크기의 배수가 되도록 하여 세그먼테이션에서 발생하는 외부조각 문제 해결함을 동시에 세그먼트 단위로 프로세스를 나누는 이점을 가지도록 하는 방식이다. 

페이지드 세그먼테이션에서는 주소 변환을 위해 외부의 세그먼트 테이블과 내부의 페이지 테이블을 이용한다.

 

 

출처
운영체제와 정보기술의 원리 - 이화여자대학교출판문화원 출판, 반효경 저
 

운영체제와 정보기술의 원리 - 교보문고

이 책은 총 10장으로 구성되어 있다.1장 ‘컴퓨터 및 정보기술의 역사’에서는 운영체제를 설명하기에 앞서 정보기술의 원리와 철학에 대해 정의하고, 컴퓨터와 정보기술 분야의 역사를 간략히

www.kyobobook.co.kr

반응형