[OSTEP] Segmentation, Free Space Management

Soeng_dev·2022년 4월 5일
0

정의

세그먼트란 특정 길이의 연속적인 주소공간을 의미

MMU에 한쌍의 베이스/바운드 가 존재하는것이 아닌 Segment 갯수 만큼의 베이스와 바운드 레지스터가 존재

기존의 한쌍의 베이스/바운드로는 internal fragmentation문제와 주소공간이 물리 메모리 보다 큰 경우 실행이 매우 어려우며, 이를 해결하기 위해 segmentation방식 사용

운영체제는 각 세그멘트를 물리메모리의 각기 다른곳에 배치할 수 있으며, 이를 통해 사용되지 않는 가상주소공간이 메모리를 차지하는것을 방지

• 세그멘트의 하드웨어 표기지원


세그먼트의 종류, 베이스 레지스터, 크기(바운드 레지스터), 세그먼트가 확장하는 방향(힙과 스택은 세그먼트가 커지는 방향이 반대), 메모리의 읽기/쓰기/실행 가능을 표시하는 protection bit 로 구성된다

» protection bit 예외처리

프로세스가 읽기전용 세그먼트에 쓰거나, 실행불가 세그먼트에서 실행하려고 하면 하드웨어는 예외를 발생, 운영체제가 위반프로세스를 처리하게 함

프로세스에서 참조하는 세그멘트의 명시법

• 최상위 비트를 이용

하드웨어에게 프로그램의 가상주소가 어느 세그먼트를 참조하는지, 오프셋표기와 함께 최상위 비트 일부를 사용해서 어느 세그먼트를 참조하는지 나타낼 수 있다.
예를 들어 전체 16KB의 주소공간를 최상위 비트 2개를 사용해서 나누면
총 4개의 4KB의 세그먼트로 나눌 수 있다.

» 단점

메모리 낭비
코드, 힙, 스택 세그먼트로 나누는것을 예로 들면
최상위 2비트를 세그먼트 표기로 사용해 메모리공간을 4개의 세그먼트로 분리하지만
사용하는 세그먼트는 3개밖에 되지 않으므로 1개의

세그먼트 크기의 제한
각 세그먼트는 최대크기 이상 확장하기가 힘듦, 위의 예시에선 4KB가 최대임

• 묵시적(implicit) 접근법

주소가 어떻게 형성되었는지 관찰해 세그먼트를 결정
주소가 프로그램카운터(PC)로 부터 생성되면 코드세그먼트에 속하는 주소
스택 또는 베이스포인터(함수 호출스택에 쌓여있는 함수의 위치를 가리키는 포인터)에서 생성되었다면 스택 세그먼트에 속하는 주소
나머지는 힙에 속하는 주소

공유지원

메모리 절약을 위해 주소 공간들 간에 특정 메모리 세그먼트를 공유하는 것이 유용하며, 특히 코드공유가 일반적으로 쓰임
코드 세그먼트의 protection bit를 읽기 전용으로 설정하면, 여러 프로세스가 주소 공간의 일부를 공유할 수 있다.(fork함수 얘기하는듯)

대단위 / 소단위 세그멘테이션

• Coarse-grained (대단위)

코드, 스택, 힙 세그멘트등의 큰 세그멘트만 지원하는 시스템

• Fine-grained (소단위)

많은 수의 세그멘트를 지원하는 시스템

이를 위해서는 여러 세그멘트 정보를 저장할 수 있는 세그멘트 테이블 같은 하드웨어가 필요

운영체제의 역할

• 문맥교환

문맥교환시 세그먼트 레지스터의 저장과 복원

• 세그멘트 크기 변환

예를 들어 malloc등으로 동적할당시 남아있는 힙메모리 중 할당가능한 메모리가 없다면 힙 세그멘트 확장을 위해 힙 세그먼트의 크기 레지스터 값을 더 증가시켜야 한다.
이를 위한 라이브러리가 호출되고 라이브러리 내부 함수가 시스템 콜을 호출할 것이다.

• 미사용 중인 메모리 관리

크기가 서로다른 많은 세그먼트를 가질 수 있으며, 이때 일반적으로 메모리가 빠르게 작은 크기의 빈공간으로 채워지는 외부단편화 문제가 발생함

해결책

» 메모리 압축 (compact)

실행중인 프로세스를 잠깐 중단한 뒤 현재 주소공간의 데이터를 하나의 연속된 메모리공간에 보가하고 세그멘트 레지스터를 갱신해 작업할 큰 빈공간을 확보 할 수 있다.

하지만 메모리 부하가 크고, 상당량의 cpu시간을 사용하므로 비용이 많이 든다.

» 빈공간 리스트 관리 알고리즘

최적 적합, 최악 적합, 최초 적합 및 버디 알고리즘 등의 알고리즘이 대표적

외부단편화를 줄이기 위한 알고리즘들이다.

profile
Software Engineer

0개의 댓글