세그멘테이션(segmentation)
페이징은 분명, 외부단편화가 생기지 않고, 간단하게 메모리 효율을 높일수 있었지만,하나의 문제점이 발생한다.
바로, 하나의 프로세스를 구성하는 논리적인 의미의 코드나 데이터들을 나눌수 없었던 것이다.
즉 하나의 프로세스 안에서 영역을 나눌수 없었다.
segmentation은 프로세스의 데이터를 데이터, 힙 스텍 코드 영역을 나누고 코드영역을 함께 나눠서 사용할수 있도록 하기 위해서 하나의 페이지 안에서 데이터 종류에 따라 세그먼트 단위를 할당하는 방식을 의미한다.
즉, 페이징은 프로세스 별로 메모리를 할당하는것이고, 세그멘테이션은 할당된 프로세스를 좀더 잘게 나누는 방법이다.
Segment라는 서로 다른 길이를 가질수 있는 블럭을 구성해주기 때문에 비연속 할당또한 하기 때문에 페이징과 다르게 내부단편화가 없다. 하지만 외부단편화가 발생한다.
세그먼트들은 코드 데이터 스택 힙 으로 나뉘고, 프로세스를 이러한 세그먼트들로 나누느 과정은 컴파일러 링커 로더 os등에 의해서 이루어 진다.
운영체제 에서는 이처럼 세그먼트를 할당하고, 반환 해주는 역할을 하게 된다.
즉 세그멘테이션은 하나의 프로세스 메모리 공간에서 코드영역, 데이터영역, 힙, 스택을 나누고 그것의 크기를 확인하여 하나의 물리주소에 대입하는 것을 한다.
그렇기 때문에 외부단편화가 발생하는 것이다.
이게 무슨소리지? 하면, 페이징의 경우에는 물리메모리를 나눠서 할당하게 되지만, 세그멘테이션의 경우에는 물리메모리를 나누지 않고 프로세스를 나누기 때문에 나누는 주체가 다르다. 하지만 이렇게 나누지 않기 때문에 내부단편화가 아닌 외부 단편화가 생긴다.
segmentation을 하기 위한 필요
- 하드웨어 지원 : STBR(segment table base register)
- MMU : 논리주소를 물리주소로 매핑
- 세그먼트 테이블
- 운영체제의 지원 : 세그먼트 테이블 관리
- 컴파일러 링커 로더의 지원
그래서 위의 전체 메모리 allocate방법은 반듯이 물리적 메모리에 실행되고 있는 프로세스의 코드들이 전체가 올라가있어야 하는 방식이다.
이러한 방식은 가장 쉽고, 하지만 다이나믹 로딩을 통해서 프로그래머가 메모리를 내려주고 올려주는 조절해줘야한다. 하지만 역시나, 프로세스의 크기가 물리적 메모리의 크기로 제한된다는 단점이 있었다.
이를 해결하기 위해서 생긴 것이 virtual memory, 즉 가상메모리이다.
Uploaded by N2T