Base & Bound의 한계
- Heap과 Stack을 위한 free 영역이 낭비된다
- Physical Memory가 address space에 딱 맞게 남지 않으면 안된다
위의 한계점 때문에 Segmentation이라는 방법이 등장했다!
Segmentaion
- Address Space를 논리적 Segment로 나눈 것이다
- Segment 는 Address Space 의 연속된 부분의 일부이다
- 각각의 Segment는 Address Space에서 논리적 Entity이다(ex. code, heap, stack등으로 잘라서 사용한다)
- 각각의 Segment가 독립적이다
- 각각 Physical Memory의 다른 곳에 들어갈 수 있다
- 메모리 공간을 유연하게 쓸 수 있다(Segment의 크기를 늘리거나 줄일 수 있다)
- 각 Segment마다 Base와 Bound가 필요하다
Placing Segment
Base&Bound와는 다른 방법으로 Physical Address를 구한다
offset이라는 것이 등장하는데,
offset = virtual address - start address of segment이다.
Physical Address = offset + base이다.
Stack Segment
Stack Segment는 Heap, Code와는 다르게 주소가 줄어드는 방향으로 메모리를 할당한다.
따라서 direction이라는 하드웨어의 도움이 필요하다.
direction이 1이면 주소가 늘어나는 방향으로 할당되는 것이고, 0이면 줄어드는 방향으로 할당된다.
Stack의 Physical Memory를 구하는 방법은
Offset - Max Stack Size를 해서 Correct negative offset을 구한 뒤,
Base + Correct negative offset = Physical Address가 된다.
Segmentation Fault or Violation
잘못된 주소가 heap에 할당된 메모리를 벗어난 곳에 접근할 때
Segmentation Fault가 발생된다

위의 방식으로 Segmentation Fault인지 알아낸다.
Referring to Segment
- Explicit approach
- 상위 몇개의 bit만 Segment를 구별하는 것으로 사용한다

Support for Sharing
- Segment는 Address Space 사이에서 공유할 수 있다
printf()
같은 함수는 모두가 동일하게 사용하기 때문에 공유가 가능하다
- 몇개의 bit를 더 할당해주어서 Protection bit(권한 설정을 위한 bit)를 만들어주어야 한다
Fine-Grained & Coarse-Grained
- Coarse-Grained
- Segment의 갯수가 작다(Segment 하나의 크기가 크다)
- ex) Code, Heap, Stack
- Fine-Grained
- Segmentation을 조금 더 작은 단위로 자른다
- 유연한 메모리 관리가 가능하다
- 좀 더 큰 Segment Table이 요구된다
Fragmentation
- External Fragmentation
- Physical Memory 사이에 작은 쓸모없는 공간이 새로운 Segment를 위한 공간 할당을 어렵게 한다
- 예를들어, 24KB의 빈 공간이 있지만, 연속되어있지 않으면 20KB짜리 Segment를 위한 공간은 없는 것이 된다
- Compaction
- Fragmentation을 위한 해결방안이다
- 하드디스크 조각모음과 비슷
- 하지만, 비용이 많이 들게 된다
- 실행중인 프로세스를 멈추고
- 데이터를 어딘가에 복사한 뒤
- Segment Register 값들을 바꾸어 준다

Segmentaion의 장점
- Sparse allocation이 가능하다
- Stack과 Heap이 독립적으로 증가가 가능하다
- Internal Fragmentation이 없다
- 빠르고, 쉬우며, Hardware에도 잘 맞는다
- Segment끼리의 공유가 쉽다
- 각각의 Segment별로 동적 할당을 지원한다
Segmentaion의 단점
- 아직도 각각의 Segment는 연속적으로 할당되어야 한다
- External Fragmentation이 발생된다
- 아직 충분히 유연하지가 않다