본문 바로가기

운영체제

Memory Management에 관해서 알아보자

* 본 내용은 운영체제를 공부하며 추후 복습하기 위해 포스팅하는 게시물입니다.

 

프로그램을 실행할 때 프로그래머가 개발 시 사용했던 심볼릭 주소(참조변수)를 논리적 주소 or 물리적 주소로 바인딩한다. 바인딩 방법은 시점에 따라 구분할 수 있다.

 

1. 컴파일 타임 바인딩

 - 소스코드를 컴파일하는 시점에 물리적 주소가 결정되기 때문에 프로그램을 실행하기 위해서는 메모리에 물리적 주소가 비어있어야 한다.

 - 초창기 메모리가 부족했을 때 많이 사용하던 방법이다.

 - 물리적 주소를 변경하기 위해서는 다시 컴파일 해야한다.

 

2. 로드 타임 바인딩

 - 프로그램이 실행되는 시점에 물리적 주소가 부여된다. 

 - 프로그램 내 논리적 주소는 변경되지 않음

 

3. 런타임 바인딩

 - 프로그램이 실행되는 중 물리적 주소가 변경된다.

 - 메모리 부족 현상으로 일부 프로세스가 디스크로 이동하는데(Swap) 이동된 프로세스가 다시 메모리에 올라올 때 물리적 주소가 변경된다.(물리적 주소가 변경되지 않을 경우 만약 해당 주소가 할당되었을 때 프로세스는 메모리에 올라오지 못함)    

 - 현대의 운영체제는 런타임 바인딩을 지원

 

* CPU는 프로세스의 다음 명령어를 실행할 때 물리적 주소가 아닌 논리적 주소를 읽는다.

* 운영체제는 물리적 메모리를 관리하는 역할이 없음(만약 물리적 메모리 관리를 위한 주소변환을 운영체제가 한다면 사용자 프로세스가 CPU를 할당받은 상태에서 메모리 접근하기 위한 주소변환을 위한 Context Switch가 빈번히 발생하여 성능이 저하될 수 있음) 

 

MMU 

- 논리적 주소를 물리적 주소로 바인딩해주는 하드웨어

- Base Register(메모리 내 프로세스의 시작주소)와 Limit Register(프로세스 크기)를 사용하여 프로세스가 올라온 메모리에 접근

- Limit Register 범위를 벗어난 접근일 경우 Trap을 발생시켜 운영체제가 해당 프로세스를 강제종료하게 한다.(프로세스는 자신이 할당받은 메모리 공간만 접근가능)

 

 

연속할당

1) 고정분할 방식

 - 메모리를 고정된 크기로 분할하여 고정된 크기에 프로세스를 할당하는 방식

 - 고정된 크기에 프로세스가 정확하게 일치하지 않을 수 있기 때문에 조각이 발생할 수 있음

 

2) 가변분할 방식

 - 메모리를 고정된 크기로 분할하는 것이 아니기 때문에 낭비되는 공간 없이 메모리를 할당하는 방식

 - 프로세스가 실행 후 종료되었을 때 조각이 발생할 수 있음

 

고정분할 방식과 가변분할 방식은 프로세스가 실행되고 종료될 때 조각(Hole)이 생길 수 있는데 Hole을 어떻게 관리할것인가에 관한 문제가 발생

 

1) First-fit

 - 처음으로 size가 n이상인 Hole을 발견할 때 해당 Hole에 할당

 

2) Best-fit

 - size가 n이상인 Hole 중 가장 size가 작은 Hole에 할당

 

3) Worst-fit

 - size가 n이상인 Hole 중 가장 size가 큰 Hole에 할당

 

=> First-fit, Best-fit이 Worst-fit보다 시간적, 공간적 효율이 좋음

 

불연속 할당

1) Paging(페이징) 

 - 프로세스와 메모리를 동일한 크기로 나누어 각 크기를 메모리에 할당하는 방식(동일한 크기로 분할한 것을 Page라 칭함)

 - 메모리에 나뉘어진 각 공간을 Page Frame이라 칭함

 - Paging 테이블을 이용하여 논리적 주소를 물리적 주소로 변환(Paging 테이블은 메모리에 할당됨)

 - 32bit 주소체계에서 Page의 크기가 4kb라고 한다면, 프로그램이 최대로 분할할 수 있는 Page 개수는 1M개(32bit를 주소로 치환한다면 4gb까지 접근가능하며 이 뜻은 최대 물리적 메모리가 4GB까지 가능하다는 이야기)

 - Page와 Paging 테이블의 엔트리는 1대1로 매핑하기 때문에 프로그램마다 Paging 테이블의 용량은 4mb 

 - Paging 테이블에 대한 접근은 접근하고자 하는 Page 번호(인덱스)을 통해 접근하기 때문에(인덱스를 사용하지 않을경우 순차검색해야하기 때문에 검색 속도가 저하) 실직적으로 사용되지 않는 페이지도 Paging 테이블의 엔트리로 만들어야 함

 - 공간을 절약하기 위해서 Paging 테이블은 여러 단계로 구성하여 사용되지 않는 Page에 관한 엔트리를 할당하지 않음(RDBMS의 인덱스 구조와 동일) 

 - Paging 테이블은 메모리에 할당하기 때문에 여러 단계의 Paging 테이블을 구성할 경우 여러 번의 메모리 접근이 필요한 문제가 발생

 - 메모리 접근 문제를 해결하기 위해 TLB라는 캐시를 사용하여 평균 접근속도 향상 

 

* 32bit/64bit의 의미는 CPU가 데이터를 처리할 수 있는 단위를 의미

* 64bit가 처리할 수 있는 단위가 크기 때문에 연산이 빠르며(Page 크기, Locality) 메모리가 크기 때문에 여러 프로그램을 할당할 수 있음 

 

2) Segmentation(세그먼테이션)

 - 프로세스를 의미단위로 나누어 메모리에 할당하는 방식

 - 의미는 각각의 함수단위도 될 수 있으며, 코드, 데이터, 스택 등으로 나뉠 수도 있다.

 - Paging 기법과 동일하게 Segment 테이블을 이용하여 주소를 변환함

 - Segmentation은 의미단위로 분할하기 때문에 분할한 크기가 각각 다름

 - 분할한 크기가 제각각이기 때문에 가변분할 방식과 동일한 문제가 발생함(조각발생, Hole 채우기에 관한 최적화 방안)

 - 연속할당에서 사용하는 Base Register는 Segmentation 테이블의 시작주소를 가리키며, Limit Register는 Segementation 테이블의 길이를 나타냄 

 

3) Paged-Segmentation

 - Page의 장점과 Segmentation의 장점을 혼합한 방식

 - 의미(Segmentation) 단위로 분할 후 Segmentation을 Page 단위로 분할하는 방식

 - Segmentation의 단점인 조각이 발생하지 않으며, Page의 단점인 분할한 단위에 의미를 부여할 수 있음

 - 프로세스의 논리적주소에는 segmentation number와 offset으로 구성되어 있으며 Segmentation 테이블에 접근 후 Segmentation 엔트리로부터 Paging 테이블의 시작주소를 가져옴. 이 후 Paging 테이블을 접근 후 offset를 page number와 offset 으로 분할 한 후 page number의 entry로부터 page frame을 얻어 주소변환을 처리함

 

'운영체제' 카테고리의 다른 글

File System이란?  (0) 2021.04.04
Virtual Memory에 대해서 알아보자  (0) 2021.03.29
DeadLock에 관해서 알아보자  (0) 2021.03.21
Race Condition(경쟁 상태)이 발생하는 사례란?  (0) 2021.03.19
CPU 스케줄링이란?  (0) 2021.03.17