- [OS] 메모리 관리 2편 (연속 할당/불연속 할당)2024년 02월 09일 01시 35분 34초에 업로드 된 글입니다.작성자: @kimyu0218
메모리 관리
메모리 배치
메모리 배치는 시스템의 성능을 향상시키고 자원을 효율적으로 활용하는 데 중요한 역할을 한다. 올바른 메모리 배치는 프로세스 간의 메모리 접근을 최적화하여 프로그램 실행 속도를 향상시킨다. 이는 메모리의 인접한 위치에 있는 데이터 및 명령어에 빠르게 접근할 수 있게 함으로써 프로그램의 실행 효율성을 높인다.
또한, 메모리 공간을 효율적으로 활용하여 메모리 공간 낭비를 최소화한다. 이는 메모리 단편화*를 방지하여 더 많은 프로세스를 동시에 실행할 수 있도록 돕는다.*단편화 (fragmentation) : 메모리가 여러 조각으로 나누어져 메모리를 효율적으로 사용하지 못하는 상황
메모리는 크게 운영체제와 사용자 프로세스가 사용하는 영역으로 나뉜다. os 상주 영역은 운영체제 커널과 시스템 리소스를 관리하는 데 필요한 데이터와 코드를 포함한다. 반면, 사용자 프로세스 영역은 사용자가 실행하는 프로그램에 할당되는 영역이다.
사용자 프로세스 영역에 메모리를 배치하는 방법은 크게 두가지가 있다. 지금부터 사용자 프로세스 영역을 할당하는 방법에대해 알아보자.
연속 할당
고정 분할은 프로세스 크기가 비슷할 때, 가변 분할은 프로세스 크기가 다양한 상황에서 적합하다.
연속 할당 (contiguous allocation) 은 각각의 프로세스를 메모리의 연속된 공간에 적재하는 방식이다. 즉, 각 프로세스가 필요로 하는 메모리의 크기에 따라 연속적인 영역에 배치시킨다. 이 방식은 주로 고정된 크기의 메모리 블록을 사용하는 시스템에서 사용하며, 한 군데에 통째로 올리기 때문에 주소 바인딩이 간단하다는 장점이 있다.
연속 할당 방식에는 크게 고정 분할과 가변 분할 방식이 있다.고정 분할 (fixed partitioning) 은 메모리를 고정된 크기의 파티션으로 나누고, 각각의 파티션에 하나의 프로세스를 할당하는 방식이다. 이 방식은 메모리를 미리 파티션으로 나누어 놓기 때문에 구현이 비교적 간단하다. 하지만 프로세스가 크기가 파티션 크기보다 작을 경우 내부 단편화*가 발생하고, 파티션 크기를 변경할 수 없기 때문에 유연성이 떨어진다.
🚨 파티션 당 하나의 프로세스를 적재하기 때문에 메모리에 로드할 수 있는 프로세스의 수가 고정된다.
반면, 가변 분할 (variable partitioning) 은 파티션의 크기를 프로세스의 크기에 따라 유연하게 조절한다. 즉, 각 프로세스에게 필요한 만큼의 메모리 공간을 할당하여 메모리를 효율적으로 활용한다. 고정 분할에 비해 유연성이 높지만, 외부 단편화가 발생할 수 있다는 단점이 있다.
내부 단편화 외부 단편화 프로세스 할당 여부 o x 외부 단편화는 프로세스를 할당하기에 충분한 공간이 있지만 현재 프로세스 크기보다 작아 할당에 실패하는 경우를 말한다. 이 때, 메모리 공간 중 사용하지 않는 부분을 hole*이라고 한다. 외부 단편화를 최소화하기 위해서는 hole을 효율적으로 관리하여 사용 가능한 공간을 최대한 활용해야 한다.
*hole : 가용 메모리 공간
- First-fit - 프로세스 크기가 n일 때, 파티션의 크기가 n 이상인 것 중 최초로 찾아지는 hole에 할당
- Best-fit - 프로세스 크기가 n일 때, 프로세스의 크기와 가장 비슷한 hole에 할당 (hole 리스트가 크기순으로 정렬되지않은 경우, 모든 hole을 탐색해야 함!)
- compaction - 메모리 내의 hole들을 이동하여 연속된 공간으로 합치는 과정 (오버헤드가 큰 작업이므로 실시간 시스템에서는 권장하지 않음)
불연속 할당
불연속 할당은 하나의 프로세스가 연속된 메모리 공간에 할당되지 않고, 여러 개의 분산된 위치에 할당되는 방식이다. 이는 프로세스를 연속된 메모리 공간에만 할당하는 연속 할당과 대비된다.
연속 할당은 프로세스 크기에 따라 파티션을 할당하기 때문에 공간 낭비가 발생할 수 있지만, 불연속 할당은 메모리 공간을 동적으로 할당하여 공간을 더 효율적으로 사용할 수 있다.
불연속 할당 방식에는 paging, segmentation, paged segmetation이 있다.
페이징은 프로세스의 메모리를 고정된 크기의 페이지로 나누어 관리하는 방법이다. (물리적 메모리도 페이지와 동일한 크기의 페이지 프레임으로 나누어진다!) 프로세스가 실행되면 운영체제는 해당 프로세스에 필요한 페이지들을 물리적 메모리의 페이지 프레임에 할당한다. 이 때, 각 페이지는 페이지 테이블을 통해 논리적 주소에서 물리적 주소로 매핑된다.페이징의 특징
- 페이지와 페이지 프레임의 크기가 동일하기 때문에 단편화가 발생하지 않는다.
- 페이지 단위로 메모리를 할당하기 때문에 프로세스의 크기가 메모리 크기보다 크더라도 프로세스를 실행할 수 있다.
- 각 프로세스는 자신의 논리적 주소를 물리적 메모리에 매핑하기 위한 페이지 테이블을 가진다.
페이징 기법을 사용하는 경우, 논리적 주소는 `(p, d)`의 형태를 가진다. 여기서 `p`는 페이지 번호, `d`는 페이지 오프셋을 의미한다. 페이지 번호는 페이지 테이블의 인덱스로 사용되는데, 페이지 테이블의 값은 페이지 프레임의 번호를 의미한다. 페이지 오프셋은 해당 페이지 프레임 내에서의 위치를 가리킨다.
1편에서 주소 바인딩을 위해 MMU를 사용한다는 걸 배웠다. MMU는 페이지 번호를 사용하여 페이지 테이블에 접근하고, 해당 페이지 번호에 대응하는 물리적 페이지 프레임의 주소를 가져온다. MMU는 가져온 물리적 프레임 주소와 페이지 오프셋을 결합하여 최종적인 물리적인 주소를 생성한다.페이지 테이블을 이용하여 논리적 주소를 물리적 주소로 변환하게 되면 두 번의 메모리 액세스가 발생한다. 첫번째 액세스는 페이지 테이블에 접근하여 해당 페이지 번호에 대응하는 물리적 프레임 번호를 가져오는 것이고, 두번째 액세스는 실제 데이터에 접근하는 것이다. 이러한 두 번의 메모리 액세스로 인해 속도 저하가 발생할 수 있다.
이 때, TLB*라는 캐시 메모리를 활용하여 속도 저하를 보완할 수 있다. TLB는 페이지 테이블의 일부를 캐시하는데 논리적 주소와 물리적 주소의 쌍을 저장한다.TLB에 논리적 주소에 해당하는 물리적 주소가 캐시되어 있으면, (TLB hit) TLB에서 직접 물리적 주소를 가져와 메모리에 접근한다. 페이지 테이블을 접근할 필요가 없으므로 더 빠른 속도로 메모리에 접근할 수 있다. 논리적 주소에 해당하는 물리적 주소가 캐시되어 있지 않은 경우 (TLB miss) 에는 페이지 테이블을 사용하여 물리적 주소를 찾고 TLB를 업데이트하여 새로운 매핑 정보를 저장한다.
*TLB : translation look-aside buffer (= associative registe)
세그멘테이션은 프로세스의 주소 공간을 논리적 단위인 세그먼트*로 나누어 관리하는 방식이다. 프로세스는 고유의 세그먼트 테이블을 갖는다. 세그먼트 테이블은 페이지 테이블처럼 프로세스의 논리적 주소를 물리적 주소로 매핑하는 역할을 수행한다. (세그먼트 테이블은 세그먼트의 시작 위치 (base) 와 세그먼트의 크기 (limit) 정보를 포함한다!)*세그먼트 : 코드, 데이터, 스택 등
세그멘테이션의 논리적 주소도 `(s, d)` 구조를 가진다. MMU는 세그먼트 번호 `s` 를 사용하여 세그먼트 테이블에 접근하고, 해당 위치에서 세그먼트의 시작 위치와 크기를 조회한다. 이후 조회한 세그먼트 시작 주소와 오프셋 정보 `d` 를 결합하여 물리적 주소를 생성한다.
세그멘테이션 기법은 `offset`값이 `limit`보다 작은 값인지 확인하여 주소가 유효한 범위 내에 있는지 확인한다.
페이징과 세그멘테이션에서의 메모리 보호
- 페이징과 세그멘테이션은 각각 PTBR*과 PTLR*, STBR*, STLR*이라는 메모리 보호와 관련된 레지스터를 갖고 있다.
- 페이징은 PTBR을 통해 페이지 테이블의 시작 위치를 찾고, PTLR을 사용하여 페이지 테이블 크기를 확인한다.
- 세그멘테이션은 STBR을 통해 세그먼트 테이블의 시작 위치를 찾고, STLR으로 세그먼트 테이블 크기를 확인한다.
- PTLR과 STLR은 테이블 크기를 제한하는데 해당 레지스터 값을 초과하는 인덱스를 조회하면 범위를 벗어난 접근으로 간주한다.
*P(S)TLR : page(segment) table limit register🤔 어떤 상황에서 페이징/세그멘테이션을 사용해야 할까?
- 페이징은 일관된 크기의 페이지로 나누어 관리하므로 메모리 관리의 효율성을 강조하는 경우에 사용한다.
- 세그멘테이션은 프로세스를 논리적 단위인 세그먼트로 분할하므로 논리적 구조를 보존하고자 할 때 유용하다.
- 종종 두 가지 기법이 혼합되어 사용되기도 하는데 이를 paged segmentation이라고 한다.
'학습기록 > CS 공부' 카테고리의 다른 글
[OS] 커널 (모드 비트/시스템 콜/인터럽트) (2) 2024.02.12 [OS] 가상 메모리 (페이지 부재/페이지 교체/스레싱/워킹셋) (0) 2024.02.09 [OS] 메모리 관리 1편 (주소 바인딩/메모리 로드) (2) 2024.02.07 [DB] 트랜잭션 (ACID/격리 수준) (1) 2024.02.05 [DB] 인덱스 (clustered/secondary) (0) 2024.02.04 다음글이 없습니다.이전글이 없습니다.댓글