#Segmentatoin
- 기본 아이디어: 프로그래머의 프로그램 관점을 사용하여 프로세스를 메모리에서 별도의 세그먼트로 분할
> 각 세그먼트는 각각 구분된 목적을 가짐: ex) 코드, 정적 데이터, 힙, 스택
> 각 함수마다 별도의 코드와 stack segment 가질 수도 있음
> 세그먼트는 서로 다른 크기일수도
> 스택과 힙은 충돌하지 않음
> 전체 프로세스는 메모리에 로드되지만, 프로세스를 구성하는 세그먼트는 연속적으로 메모리에 로드될 필요가 없음
> 세그먼트 내부의 공간은 연속적임
> 각 세그먼트에는 보호 비트가 있음
> Read-Only 세그먼트(코드)
> Read-Write 세그먼트(데이터, 힙, 스택)
> 프로세스가 코드와 데이터를 공유하도록 허용
#Segment Addresses
- 가상(논리) 주소의 구성:
1. 세그먼트 번호
2. 해당 세그먼트의 시작으로부터의 오프셋
> 이 둘은 어셈블러에 의해 생성
- 명령어에 저장되는 것:
1. 간단한 방법:
> 주소의 상위비트는 세그먼트를 지정
> 주소의 하위비트는 오프셋을 지정
2. 암시적 세그먼트 지정:
> 실행되는 명령에 의해 세그먼트가 암묵적으로 선택됨(코드 vs 데이터)
> ex) PDP-11, Intel 386/486
3. 명시적 세그먼트 지정:
> 명령어 접두사를 통해 특정 세그먼트 사용을 요청 가능
> ex) Intel 386/486
#Implementing Segments
- 세그먼트 테이블은 특정 프로세스의 각 세그먼트를 추적하는 데 사용됨
> 각 항목은 베이스, 한계를 포함
> 보호 정보(공유 허용 여부, 읽기 vs 읽/쓰)도 포함
- 추가 하드웨어 지원이 필요:
> 다중 베이스와 한계 레지스터 또는 세그먼트 테이블 베이스 포인터(메모리의 테이블을 가리킴)
#Segmentation Example
#Managing Segments
- 프로세스가 생성될 때:
> 프로세스의 모든 세그먼트에 대해 가상 메모리에 공간을 할당
> (대부분 비어있는) 세그먼트 테이블을 생성하고, 이를 프로세스의 PCB에 저장
- Context Switing 발생시:
> 이전 프로세스의 PCB에 OS의 세그먼트 테이블 저장
> 새로운 프로세스의 PCB에서 OS의 세그먼트 테이블 로드하고, 처음으로 프로세스가 실행되는 경우 물리 메모리에 공간을 할당
- 물리 메모리에 공간이 없는 경우:
> 메모리를 압축하여(세그먼트 이동, 기준 업데이트) 연속된 공간을 만듦
> 하나 이상의 세그먼트를 디스크로 스왑
> 해당 프로세스를 다시 실행하려면, 모든 세그먼트를 메모리로 스왑
- 세그먼트를 확장하려면:
> 세그먼트 위의 공간이 비어있다면 os는 세그먼트의 한계를 업데이트, 그 공간 중 일부를 사용
> 이 세그먼트를 더 큰 빈 공간으로 이동
> 이 세그먼트 위의 세그먼트를 디스크로 스왑
> 이 세그먼트를 디스크로 스왑하고, 더 큰 빈 공간으로 다시 가져옴
- 세그먼트의 장점:
> 세그먼트는 연속적이지 않아도
> 세그먼트는 독립적으로 스왑할 수 있음
> 세그먼트는 공유를 허용
- 세그먼트의 단점:
> 복잡한 메모리 할당(최적 적합 등)
> 외부 단편화(Fragmentation)
'CS > 컴퓨터운영체제' 카테고리의 다른 글
OS-0606: File System(L29, 30, 31) (0) | 2023.06.06 |
---|---|
OS-0523: Paging (0) | 2023.05.23 |
OS 0523 - Dynamic Relocation (0) | 2023.05.23 |
OS(0516) - Memory Management (1) | 2023.05.16 |
OS(0516) - Deadlock 처리 방법 (0) | 2023.05.16 |