* 본 내용은 운영체제를 공부하며 추후 복습하기 위해 포스팅하는 게시물입니다.
프로그램을 실행할 때 프로그래머가 개발 시 사용했던 심볼릭 주소(참조변수)를 논리적 주소 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 |