목차
- 🤔 비연속할당(Noncontiguous allocation)이란?
- 🧩 세그먼테이션(Segmentation)이란?
- 🙉 세그먼트 테이블(Segment table)
- 🙊 세그먼테이션(Segmentation) 주소 변환
- 🙈 Segmentation의 문제점
🤔 비연속 할당(Noncontiguous allocation)이란?
기존에는 연속 할당(contiguous allocation) 기법을 사용하여 프로세스를 통째로 메모리에 적재하였습니다.
연속 할당 기법은 base address에 상대 주소인 logical address를 더해줌으로써 물리 주소를 간단하게 translation 할 수 있다는 장점이 있었습니다.
따라서 MMU를 단순화할 수 있었지만, 외부 단편화가 발생하여 메모리 공간을 효율적으로 사용하지 못 한다는 문제가 있었습니다.
그렇게 등장한 것이 바로 비연속 할당(noncontiguous allocation)입니다.
비연속 할당(noncontiguous allocation)은 하나의 큰 프로세스를 보다 작은 Hole에 할당할 수 없기 때문에 분산해서 메모리에 적재하자는 개념입니다.
분산하는 기준에 따라 명칭이 다른데, 크게 Segmentation과 Paging이라는 방법이 있습니다.
🧩 세그먼테이션(Segmentation)이란?
세그먼테이션(Segmentation)은 프로세스를 논리적 단위(Logical Unit)로 조각내어 메모리에 적재하는 기법입니다.
여기서 논리적 단위는 Segment이며, Segment는 프로세스를 이루고 있는 단위라고 생각할 수 있습니다.
메모리 구조는 크게 Stack, Heap, Data(+bss), Code 영역으로 나뉘어집니다.
그래서 프로세스를 Stack Segment, Heap Segment, Data Segment, Code Segment 등으로 나눈다는 관점에서 접근할 수 있습니다.
Segmentation을 사용하면 프로세스를 분리할 수 있기 때문에, 프로세스를 통째로 메모리에 적재하려고 할 때보다 할당 가능한 Hole이 많이 존재한다는 장점을 갖습니다.
즉, 외부 단편화를 기존 방식에 비해 가능한 적게 발생시킬 수 있습니다.
🙉 세그먼트 테이블(Segment Table)
Segment에는 Segment table이라고 하는 새로운 개념이 등장합니다.
이는 한 프로세스의 여러 Segment들에 대한 Base와 Limit 값을 포함하는 Entry를 갖습니다.
Base와 Limit은 각각 해당 Segment에 대한 시작 주소 값과 크기를 의미합니다.
또한, STBR(Segment Table Base Register), STLR(Segment Table Length Register)가 존재하는데, 해당 Register에는 각각 Segment table의 시작 주소와 Segment의 개수를 가지고 있습니다.
🙊 세그먼테이션(Segmentation) 주소 변환
Segmentation을 사용하면 MMU는 기존과 다른 방식으로 주소 변환을 해야 합니다.
우선, logical address(논리 주소)는 Segment number와, Segment offset으로 나뉩니다.
위 그림에서 s가 Segment number, d가 Segment offset에 해당합니다.
Segment number는 여러 Segment를 구분하기 위한 값이며, Segment Offset은 해당 Segment의 몇 번째 메모리 번지에 위치하는지에 대한 값을 가지고 있습니다.
MMU는 주소 변환을 할 때, 논리 주소의 Segment number를 바탕으로 Segment table의 Entry를 찾습니다.
그리고 논리 주소의 Offset과 Entry의 Limit 값을 비교하는데, 만약 Offset이 Limit보다 큰 경우, 다른 Segment나 Process의 메모리 영역에 접근하는 문제가 발생하기 때문에 Memory protection fault를 발생시킵니다.
만약 문제가 없다면, Base + Offset을 통해 물리 주소로 변환을 마치게 됩니다.
Base와 Limit이라는 개념을 사용한다는 점에서 Contiguous allocation과 약간은 유사하다는 특징을 가지고 있습니다.
하지만, 프로세스를 논리적 단위로 나눈다는 점에서 확연한 차이가 있습니다.
🙈 Segmentation의 문제점
그럼에도 불구하고 외부 단편화(External Fragmentation)는 해결되지 않았습니다.
외부 단편화를 최소화하기 위한 임시방편일 뿐, Hole보다 큰 Segment가 존재하는 이상, 남은 메모리 공간의 합이 충분해도 적재하지 못한다는 것입니다.
이러한 문제점을 해결하기 위해 또 다른 비연속 할당 기법인 Paging이 등장합니다.
Paging을 간략히 설명하자면, 논리 주소 공간과 물리 주소 공간을 동일한 고정 크기로 잘게 나누어 할당하여 자투리 공간이 발생하지 않게끔 하는 방법입니다.
자세한 내용은 다음 포스팅에서 다루겠습니다.
github : https://github.com/tmdgh1592