고정크기로 분할하는 방식이 아니기때문에 메모리를 미리 분할해둘 수 없음 => 가변 분할 방식(Variable Partition Multi-Programming)과 유사
가변 분할 방식과 마찬가지로 내부 단편화는 발생하지 않으나 외부 단편화는 발생할 수 있음
페이징 시스템에 비해 주소 매핑과 메모리관리의 오버헤드가 큼
프로그램의 논리적 흐름을 고려한 분할방식이기에 블록(세그먼트)의 공유, 보호가 쉬움
2. 주소 매핑(Address Mapping)
(segment number, offset) 의 쌍으로 이루어진 가상 주소를 사용
SMT(Segment Map Table)을 사용하여 가상주소를 실제주소에 매핑
SMT에서는 세그먼트가 메모리에 적재되어있는지 여부를 나타내는 residence bit와 swap device 상의 어느 위치에 저장되어있는지를 나타내는 secondary storage address(= 실제주소), 메모리상의 주소(segment address in memory), 세그먼트의 길이(segment legnth), 세그먼트 보호를 위한 protection bits 등의 값을 관리한다.
프레임 번호만 알면 실제 메모리에서의 위치를 알 수 있었던 페이징 시스템과 달리 세그먼트의 길이가 서로 다르기 때문에 segment length 가 추가적으로 필요해진다.
페이징 시스템에서는 페이지가 논리적으로 분할된 블록이 아니기에 protections bits를 사용한 권한 관리가 복잡했지만 세그멘테이션 시스템의 경우 한 블록이 하나의 논리적인 단위이기에 세그먼트 단위로 권한을 관리할 수 있어 세그먼트 보호가 훨씬 용이해진다.
주소 변환 과정
SMT의 시작주소가 b이고 세그먼트 번호는 s, offset은 d 일 때
SMT에 접근하여 세그먼트(s)의 엔트리 위치를 탐색(b + (entry_size * s)
해당 세그먼트의 residence bit를 체크, 메모리에 적재되지 않은 상태라면 segment fault가 발생하고 페이징 시스템의 page fault 때와 마찬가지로 커널에 요청하여 세그먼트를 메모리에 적재
offset(d) 이 세그먼트의 범위를 벗어나는 경우 overflow 가 발생, 이를 처리하는 루틴을 거침
protection bits 를 체크하여 허용되지 않은 연산을 시도할 경우 예외가 발생, 이를 처리하는 루틴을 거침
문제가 없다면 실제 주소(r = entry_address + d)를 계산하여 메모리에 접근
3. 세그멘테이션 시스템의 메모리 관리
페이징 시스템이 FPM과 유사했듯이 세그멘테이션 시스템은 VPM과 유사한 방식으로 메모리를 관리
세그먼트 적재시 크기에 맞춰 메모리를 분할하여 적재, Partition Table을 통해 이를 관리한다.
파티션 테이블(Partition Table)
페이징 시스템의 프레임 테이블에 대응하는 메모리 관리를 위한 테이블
시작 주소(start address)
파티션의 시작 주소
크기(size)
파티션의 크기
PID(Process ID)
해당 파티션을 사용중인 프로세스의 ID
세그먼트 번호(segment number)
해당 파티션에 적재된 세그먼트의 번호
기억장치 접근권한(storage protection key)
해당 파티션에 대한 접근 권한 정보
세그먼트 공유(Segment Sharing)
페이징 시스템의 경우 페이지가 논리적 단위가 아니기 때문에 특정 페이지에서 branch(=jump)가 발생할 경우 프로세스에 따라 목적지 주소가 달라져야하는 모호한 경우가 생길 수 있었으며 이를 공유하는 페이지에 대한 정보는 PMT의 같은 엔트리에 저장하는 등의 방식으로 해결하였음
세그먼트의 경우 애초에 논리적인 단위로 프로그램을 분할하였기에 jump가 세그먼트 내에서 발생하므로 이러한 문제가 발생할 일이 없어 세그먼트 공유가 용이함
세그먼트 보호(Segment Protection)
페이징 시스템의 경우 하나의 페이지가 하나의 논리적 흐름을 가지는 것이 아니기에 페이지 보호가 복잡했음
세그멘테이션 시스템의 경우 하나의 세그먼트는 하나의 논리적 단위이기에 세그먼트 단위로 protection bits를 적용하는 것만으로 간단하게 세그먼트 보호가 가능해짐