Segmentation
- 대규모의 가상 주소 공간을 어떻게 지원하는가?
- 어떻게 효율적으로 수행할 것인가?
- 보호를 어떻게 할 수 있는가?
- 세그먼트(segment)를 관리하는 방법은?
📌From logical to physical address
✔️ Faulty addressing
📌 주소공간을 관리해야 하는 이유
- Limited physical memory space vs. extensive virtual memory space
- Virtual memory는 프로세스가 자유롭게 사용할 수 있는 virtual address space를 제공
- 그러나, 실제 물리 메모리의 용량은 충분하지 않을 수있음
- Extended (or multi-dimensional) virtual memory
- Address space 공간은 상위 구조를 가질 수 있음 • e.g.가상머신,보안을위한영역등
- 그러나, 결국 linear address로 표현되어야 하고, 실제 저장된 물리 메모리 위치와 매핑되어야 함.
- Memory allocation/release is not easy
- OS 관점에서 다수의 프로세스들이 빈번한 메모리 할당/해제를 수행
- 잦은 할당과 해제는 메모리 공간 내의 internal or external fragmentation 문제를 야기
- 특히 한정된 물리 메모리를 위해 효율적인 여유메모리(free memory) 관리가 필요
📌MMU and Virtual memory
- Memory management unit (MMU)
- CPU 패키지 내에 존재
- 메인 메모리 또는 장치 메모리 접근을 위한 물리 주소 변환을 담당함
- CPU가 Load/Store 명령에서 사용하는 Virtual address (VA)들을 최종적인 physical address (PA)로 address translation 하기 위해서 별도의 주소 변환 테이블을 사용
- 그 위치는?
- 메인 메모리
- E.g. Intel IA-32, 64의 global descriptor table (GDT) or 여러 종류의 page table들
📌Allocating a logical memory to an address space
- 가정: Address space = a single memory chunk
- 프로세스 마다 주어진 logical memory로 간주
- 예) Base = Address space의 시작 주소, Limit = Address space의 끝 주소
- 그러나, code, data는 생각보다 크지 않음
- e.g. Linux kernel도 수 MB에서 수십 MB 단위
- 나머지 영역에서 큰 부분을 차지하는 heap과 stack 영역이 늘 실제 메모리를 차지하고 있어야 한다면 ? -낭비다! 다수의 프로세스가 공존하는 경우, 여유 메모리 공간 (free address space)을 효율적으로 관리 해야 함
- 즉, Address space 전체를 하나의 logical memory로 간주하고 관리하는 것은 매우 비 효율적
📌Segmentation
- 의미
- Address space를 다수로 분할하여 관리
- 각 분할 영역에 대해 확장된 속성을 부여 가능 • 보호 설정, 실행/쓰기/읽기 권한, 공유 등
- Segment
- 분할된 각각의 메모리 단위를 의미
- 세그먼트 안에서 연속된 메모리 주소를 사용
- 기존 logical memory의 확장
• base, limits (or bounds) + 확장된 필드들
• 보호레벨,접근/실행권한비트등
- 세그먼트의 수 ∝ 분할 정도
- 많아질 경우, 유지 비용이 증가
📌Segmentation에서 보호가 필요한 이유
- 하나의 가상 주소 공간만 주어지면?
- 프로그램 실행 중에 얼마든지 다른 공간을 침범 할 수 있음
- 동적 자료구조의 사용에 따라서 증가
- 트리 노드를 계속 추가.
- 테이블의 엔트리가 증가.
- Stack push -Heap에서 새로운 메모리 할당
- 침범한 메모리 영역에 민감 데이터가 존재하면?
📌Segmentatino을 H/W로 구현하는 방법
- 메인 메모리 내 세그먼트 테이블 (segment table)을 두어 관리함
- MMU가 세그먼트 레지스터들을 직접 사용
• STBR := Segment table base 주소 적재
• STLR := Segment table length를 적재
- STBR과 STLR로 올바른 세그먼트 번호를 구분 가능 -잘못된 세그먼트 번호의 경우?
예외 발생 (Segmentation violation or fault)
- 세그먼트의 수 ∝ 세그먼트테이블엔트리수
- 메모리 참조
- Base 주소가 아니라, Segment 번호를 사용.
- 세그먼트 내 특정 위치는 offset 값으로 참조
예) 2비트 세그먼트 번호, 12비트 오프셋인, 14비트 세그멘테이션의 VA 4200 (0x1068)은?
📌Direction bit in Segmentation
- Heap이나 일반적인 메모리 주소의 성장 방향?
- 낮은 주소(low address)에서 상위(high address)로 성장
- Stack은?
- Segmentation에서 이 차이를 표현하는 방법은?
- direction bit
• 1 = positive, 0 = negative
- (질문) 왜 필요할까?
- 경계 체크 : 다음load&store할주소의구분이필요(더낮은주소?더높은주소?)
📌Sharing in Segmentation
- 프로그램 메모리의 일부를 공유할 수 있다면 많은 이점이 존재
- 여러 프로그램 간의 효율적 데이터 교환 -라이브러리 등에서 필요한 프로그램 코드의 재활용 등
- Segmentation에서는 protection bit를 통해 제한적인 Segment 공유가 가능
- 읽기, 쓰기, 실행의 권한 조합을 통해 해당 권한이 있는 프로세스는 공유가 가능해짐
- 보통 코드는 읽기 및 실행 권한이 주어짐
- 권한이 없으면? → Raise an exception
📌Segment sizes can be different
- 가상 메모리 내에서는 얼마든지 세그먼트를 생성 가능 (논리적 단위)
- 생성한 세그먼트들은 결국 물리 메모리에 최종 배치되어야 프로세스가 사용 가능함
- 그러나 세그먼트들의 크기는 서로 다 다를 수 있음
📌Pure Segmentation의 결과
- External fragmentation (외부 단편화)
- (a)-(d) 공간은 있으나, 할당할 수 없는 메모리 영역이 발생
- (e) 빈 공간을 합친다면? (compaction)
✔️ Compaction
- 여유 메모리를 확보하기 위해 기존의 segment들을 재배열
- 수행중인 프로세스들을 멈추고, 필요한 크기의 연속된 메모리 영역에 데이터를 복사
- 새로운 물리 메모리 영역을 가리키도록 세그먼트 레지스터를 변경
- Compaction is expensive!!
- 어떻게 비어 있는 메모리를 선택할 것인가?
- 여유 메모리 관리 (free memory management)
✔️ Segmentation의 기본적인 여유 메모리 관리 방법
- 기본적으로 할당되지 않은 메모리 공간은 OS가 free list로 관리함
- Segmentation의 경우, 할당하지 않은 메모리 영역 역시 Free 세그먼트로 보고 리스트로 유지
- 세그먼트 적재 시 free list 내 영역 선택 정책
- First-fit 비어있는메모리영역가운데,현재세그먼트를적재가능한경우,가장처음의공간을선택
- Best-fit 현재 세그먼트의 크기와 가장 차이가 적은 비어있는 공간을 선택 크기에 의해 정렬되지 않았다면?
→ 전체여유공간리스트를검색해야함
- Worst-fit 현재세그먼트의크기와가장차이가큰비어있는공간을선택
마찬가지로, 정렬이 필요하며, 안된 경우 전체 영역을 모두 검색해야 함
- Best-fit과 Worst-fit은 둘 다 현재 배치된 순서와 무관하게 선택
✔️예상문제