2022. 8. 6. 13:12ㆍCS/운영체제(OS)
- 주소(address) : 서로 다른 위치를 구분하기 위해 사용하는 일련의 숫자
- 컴퓨터 시스템은 오늘날 32비트 혹은 64비트의 주소 체계를 가진다.
1. 주소 바인딩
- 주소 공간 : 프로그램이 실행을 위해 메모리에 적재되면 그 프로세스를 위한 독자적인 주소 공간, 이 주소를 논리적 주소 또는 가상 주소라 한다.
- 논리적 주소는 각 프로세스마다 독립적으로 할당되는데 반해 물리적 주소는 물리적 메모리에 실제 올라가는 위치를 말한다.
- 보통 물리적 메모리의 낮은 주소 영역에 OS가, 높은 주소 영역에 사용자 프로세스가 올라간다.
- CPU가 기계어 명령을 수행하기 위해 논리적 주소를 통해 메모리 참조를 하게 되면, 물리적 메모리의 어느 위치에 매핑되는지 알아야 한다. 주소 바인딩은 프로세스의 논리적 주소를 물리적 주소로 매핑시키는 작업이다.
※ 주소 바인딩 방식
▷ 컴파일 타임 바인딩 (compile time binding)
- 컴파일 시점에 해당 프로그램이 물리적 메모리의 어느 위치에 존재할 것인지 결정, 프로그램이 절대주소로 적재된다는 뜻에서 이러한 주소 바인딩 방식을 절대코드(absolute code)를 생성하는 바인드 방식이라고도 한다.
- 이 바인딩 방식은 물리적 메모리의 위치를 변경하고 싶다면 컴파일을 다시 해야하는 수고를 요한다. 이는 현대의 시분할 컴퓨팅 환경에서는 잘 사용하지 않는다.
▷ 로드 타임 바인딩 (load time binding)
- 실행이 시작될 때 물리적 메모리 주소가 결정, 이는 로더(loader, 사용자 프로그램을 메모리에 적재시키는 프로그램)의 책임 하에 물리적 메모리 주소가 부여된다.
- 프로그램이 종료될 때까지 물리적 메모리 주소가 변경되지 않으며, 컴파일러가 재배치 가능 코드를 생성했을 때 가능한 방식이다.
▷ 실행시간 바인딩(execution time binding, run time binding)
- CPU가 주소를 참조할 때마다 해당 데이터가 물리적 메모리의 어느 위치에 존재하는지 주소 매핑 테이블 (address mapping table)을 이용해 바인딩을 점검해야한다.
- 이를 가능하기 위해서는 기준 레지스터(base register)와 한계 레지스터(limit register)를 포함해 MMU(Memory Management Unit, 메모리 관리 유닛)가 필요하다. 이는 논리적 주소를 물리적 주소로 매핑해주는 하드웨어 장치이다.
※ MMU 기법
- CPU가 특정 프로세스의 논리적 주소를 참조하고자 할 때 MMU 기법은 그 주소값에 기준 레지스터의 값을 더해 물리적 주소값을 얻는다. 이 때 기준 레지스터는 재배치 레지스터(relocation register)라고도 부르며 그 프로세스의 물리적 메모리 시작 주소를 가지고 있다. (MMU 기법은 프로그램의 주소 공간이 물리적 메모리의 한 장소에 연속적으로 적재된다고 가정하기 때문)
- 만일 CPU에서 논리적 주소 100번지를 참조한다고 가정했을 때, 이 100번지가 가리키는 내용은 CPU에서 수행중인 프로세스가 무엇인지에 따라 물리적 주소가 달라진다. 재배치 레지스터의 값은 문맥교환으로 수행 중인 프로세스가 바뀜에 따라 각 프로세스에 해당되는 값으로 재설정한다.
- 메모리 보안 : 다중 프로그래밍 환경에서 여러 프로세스가 동시에 메모리에 올라가 있는 상황을 가정했을 때, CPU가 요청한 논리적 주소와 재배치 레지스터 값을 더한 것이 해당 프로세스의 주소공간을 초과하는 경우 이 메모리 보안이 이루어지지 않았다고 할 수 있다.
▷ 한계 레지스터
- 다른 프로그램 영역, 최악의 경우 OS를 침범해 심각한 오류가 발생하는 것을 방지하기 위함
- 프로세스가 자신의 주소 공간을 넘어서는 메모리 참조를 하려고 하는지 체크하는 용도로 사용됨. CPU에서 수행중인 프로세스의 논리적 주소 최댓값, 즉 그 프로세스의 크기를 담고 있다.
- CPU가 요청한 논리적 주소값이 한계 레지스터 내에 저장된 프로세스의 크기보다 작은지 확인, 작다면 해당 물리적 메모리 위치에 접근하도록 허락하고, 크다면 다른 프로세스의 주소 영역에 침범하려는 시도이므로 트랩을 발생시켜 해당 프로세스를 강제 종료시킨다.
2. 메모리 관리와 관련된 용어
※ 동적로딩(Dynamic Loading)
- 여러 프로그램이 동시에 메모리에 올라가 수행되는 다중 프로그래밍 환경에서 메모리 사용의 효율을 높이기 위해 사용되는 기법
- 모든 함수가 다 사용되는 것은 아니고(오류 처리), 모든 데이터가 다 사용되는 것이 아니며(배열), 모든 클래스가 다 사용되는 것이 아니다(자바).
- 프로세스가 시작될 때 그 프로세스 주소 공간 전체가 아닌 실행에 필요한 부분만을 메모리에 적재하는 방식으로 메모리 효율을 높인다.
- OS의 특별한 지원 없이 프로그램 자체에서 구현이 가능하며 OS에서 라이브러리를 제공할 수도 있다.
※ 동적연결(Dynamic Linking)
- 연결(linking) : 프로그래머가 작성한 소스 코드를 컴파일하여 생성된 목적 파일(object file)과 이미 컴파일된 라이브러리 파일들을 묶어 하나의 실행파일을 생성하는 과정
- 동적연결 : 컴파일을 통해 생성된 목적 파일과 라이브러리 파일 사이의 연결을 프로그램 실행 시점까지 지연시킴
- 실행파일에 라이브러리 코드가 포함되지 않으며, 프로그램이 실행되면서 라이브러리 함수를 호출할 시점이 되어서야 라이브러리에 대한 연결이 이루어진다.
- 스텁(stub) : 실행파일의 라이브러리 호출 부분에 해당 라이브러리 위치를 찾기 위한 작은 코드, 스텁을 통해 메모리를 먼저 찾아보고 있다면 메모리 위치에서 직접 참조하고 그게 아니라면 디스크에서 찾아와 메모리에 적재한다.
- 다수의 프로그램의 공통 라이브러리를 메모리에 한 번만 적재하기 때문에 효율성을 높일 수 있고 OS 지원이 필요하다.
※ 중첩(Overlays)
- 프로세스의 주소 공간을 분할해 실제 필요한 부분만 메모리에 적재하는 기법
- 동적로딩과 비슷해 보이지만 목적은 서로 다름. 동적 로딩은 메모리에 더 많은 프로세스를 동시에 올려두고 사용하기 위함인 반면 중첩은 단일 프로세스만을 메모리에 올려두고 사용하는 환경에서 메모리 용량보다 큰 프로세스를 실행하기 위한 용도이다.
※ 스와핑(Swapping)
- 메모리에 올라온 프로세스의 주소 공간 전체를 디스크의 스왑 영역(swap area)에 일시적으로 내려놓는 기법 → 스왑 영역을 백킹스토어(backing store)라고도 함, 디스크 내의 파일 시스템과는 별도로 존재하는 영역
- 다수의 사용자 프로세스를 담을 수 있을 정도로 충분히 큰 저장공간이어야 하고 접근 속도도 어느 정도 보장돼야 한다.
- 스왑 인(swap in) : 디스크에서 메모리로 올리는 작업 // 스왑 아웃(swap out) : 메모리에서 디스크로 내리는 작업
▷ 스와핑이 일어나는 과정
- 스와퍼라고 불리는 중기 스케줄러에 의해 스왑 아웃될 프로세스가 선정됨
- 스왑 아웃 대상으로 선정된 프로세스는 메모리에 올라가 있는 주소 공간 통째로 스왑 영역으로 스왑 아웃된다.
- 너무 많은 프로그램이 메모리에 올라오면 프로세스 당 할당되는 메모리의 양이 적어져 시스템 성능이 크게 저하된다.
- 이 문제를 해결하기 위해 몇몇 프로세스를 스왑 아웃시켜서 시스템 성능의 저하를 막고, 메모리의 프로그램이 충분히 실행되고 나면 이 프로그램을 메모리에서 내쫓고 그 자리에 스왑 아웃되었던 프로세스를 다시 올린다.
- 위에서 언급했던 컴파일 타임 바인딩 방식이나 로드 타임 바인딩 방식의 경우에는 스왑 아웃됐던 프로세스가 다시 스왑 인이 될 때 원래 존재하던 메모리 위치로 다시 올라가야 하지만, 실행 시간 바인딩 방식은 빈 메모리 아무 곳에나 프로세스를 올릴 수 있다.
- 스와핑에서 디스크 내의 스왑 영역에 주소 공간이 순차적으로 저장되므로, 디스크 탐색 시간(seek time)이나 회전지연시간(rotational latency)보다는 디스크 섹터에서 실제 데이터를 읽고 쓰는 시간인 전송 시간(transfer time)이 대부분을 차지한다.
3. 물리적 메모리의 할당 방식
- 물리적 메모리는 운영체제 상주 영역과 사용자 프로세스 영역으로 나뉘는데
- 운영체제 상주 영역 : 인터럽트 벡터와 함께 물리적 메모리의 낮은 주소 영역을 사용, OS 커널이 여기에 위치함
- 사용자 프로세스 영역 : 물리적 메모리의 높은 주소 영역 사용, 여러 사용자 프로세스들이 적재됨
※ 사용자 프로세스 영역의 관리 방법
① 연속할당 방식
- 연속할당 방식은 프로세스를 메모리에 올릴 때 그 주소 공간을 여러 개로 분할하는 것이 아닌 물리적 메모리의 한 곳에 연속적으로 적재하는 방식이다.
- 물리적 메모리를 고정된 크기의 분할로 미리 나누어놓는지 아닌지에 따라 고정분할 방식과 가변분할 방식으로 나뉜다.
- 고정이나 가변분할 방식 모두 하나의 분할에는 하나의 프로그램만을 적재할 수 있다.
▷ 고정분할 방식
- 물리적 메모리를 주어진 개수만큼 영구적 분할로 미리 나누고 각 분할에 하나의 프로세스를 적재해 실행
- 동시에 메모리에 올릴 수 있는 프로그램의 수가 고정되어 있으며 수행 가능한 프로그램 최대 크기 또한 제한된다. (융통성이 떨어지는 방식)
- 외부 단편화(external fragmentation) : 프로그램의 크기보다 분할의 크기가 작을 경우 해당 분할이 비어있음에도 프로그램을 메모리에 올리지 못하기 때문에 발생하는 메모리 공간, 빈 공간임에도 현재 상황에서 사용할 수 없는 작은 조각을 뜻함
- 내부 단편화(internal fragmentation) : 프로그램의 크기보다 분할의 크기가 큰 경우 해당 분할에 프로그램을 적재하고 남는 메모리 공간. 이는 프로그램에 이미 배당된 공간임으로 이 조각에 수용될 수 있는 작은 크기의 프로그램이 있다고 해도 활용할 수 없기 때문에 메모리가 낭비된다.
▷ 가변분할 방식
- 메모리에 적재되는 프로그램의 크기에 따라 분할의 크기, 개수가 동적으로 변하는 방식
- 분할의 크기를 프로그램의 크기보다 일부러 더 크게 하지는 않기 때문에 내부 단편화는 발생하지 않는다.
- 메모리에 존재하는 프로그램이 종료될 경우 중간에 빈 공간이 생기고, 이 빈 공간이 새롭게 시작하려는 프로그램의 크기보다 작을 때 외부 단편화가 발생한다.
- 동적 메모리 할당 문제 : 주소 공간의 크기가 n인 프로세스를 메모리에 올릴 때 물리적 메모리 내 가용 공간 중 어떤 위치에 올릴 것인가?
- 운영체제는 이렇게 흩어진 가용 공간들을 효율적으로 관리하기 위해 이미 사용 중인 메모리 공간과 사용하지 않는 가용 공간에 대한 정보를 각각 유지한다.
㉮ 최초적합(first-fit)
- 크기가 n 이상의 가용 공간 중 가장 먼저 찾아지는 곳에 프로세스 할당
- 가용 공간을 모두 탐색하지 않기 때문에 시간상으로 효율적이다.
㉯ 최적적합(best-fit)
- 크기가 n 이상인 가장 작은 가용 공간을 찾아 프로세스를 할당
- 모든 가용 공간 리스트를 탐색해야 하므로 시간적 오버헤드가 발생하고 매우 작은 가용 공간들이 다수 생길 수 있으나 공간적인 측면에서 효율적이다.
㉰ 최악적합(worst-fit)
- 가용공간 중에서 가장 크기가 큰 곳에 프로세스를 할당
- 모든 가용 공간 리스트를 탐색하는 시간적 오버헤드 발생, 상대적으로 큰 프로그램을 담을 수 있는 가용 공간을 빨리 소진해버린다는 문제점
- 최초적합과 최적적합 방식이 최악적합 방식에 비해 속도와 공간 이용률 측면에서 효과적임이 알려져 있다.
컴팩션(compaction)
- 가변분할 방식에서 외부조각 문제를 해결하기 위한 방법, 물리적 메모리 중 프로세스에 의해 사용 중인 메모리 영역을 한쪽으로 몰고 가용 공간은 다른 한쪽으로 모아 하나의 큰 가용 공간을 만드는 방법이다.
- 현재 수행 중인 프로세스의 메모리상 위치를 상당 부분 이동시켜야 하므로 비용이 큰 작업이다.
② 불연속할당 방식
- 하나의 프로세스가 물리적 메모리의 여러 위치에 분산되어 올라갈 수 있는 메모리 할당 기법
- 프로세스를 동일한 크기로 나누어 메모리로 올리는 페이징 기법과, 크기는 일정하지 않으나 의미 단위로 나누어 메모리로 올리는 세그먼테이션 기법, 그리고 세그먼테이션을 기준으로 하되 이를 다시 동일 크기 페이지로 나누어 올리는 페이지드 세그먼테이션 기법 등이 있다.
4. 페이징 기법 (Paging)
- 페이징 기법 : 프로세스의 주소 공간을 동일한 크기의 페이지 단위로 나누어 물리적 메모리의 서로 다른 위치에 페이지를 저장하는 기법을 말한다.
- 페이징 기법에서는 물리적 메모리를 페이지와 동일한 크기인 프레임(frame)으로 미리 나눈다. 이는 페이지 단위로 메모리에 올라오기 때문에 프레임의 크기를 페이지에 맞춘다면 페이지가 임의의 빈 프레임에 얼마든지 들어갈 수 있기 때문이다. (동적 메모리 할당 문제 발생 X)
- 주소 변환 절차가 까다롭다. 같은 프로세스라 하더라도 페이지에 따라 서로 다른 물리적 주소 위치에 있으므로 논리적 주소에서 물리적 주소로 변환 과정이 필요한데 모든 프로세스는 이 때문에 각각의 주소 변환을 위한 페이지 테이블을 가진다.
- 페이지 테이블은 프로세스가 가질 수 있는 페이지의 개수만큼 주소 변환 엔트리를 가진다.
- 프로그램의 크기가 항상 페이지 크기의 배수가 된다는 보장이 없기 때문에 프로세스의 주소 공간 중 가장 마지막에 위치한 페이지는 내부 단편화가 발생할 수 있다.
① 주소 변환 기법
- 페이징 기법에서는 CPU가 사용하는 논리적 주소를 페이지 번호 p와 페이지 오프셋 d로 나누어 주소 변환에 사용한다.
- 페이지 번호 p는 페이지 테이블 접근 시에 인덱스로써 사용되고, 해당 인덱스의 항목에는 그 페이지의 물리적 메모리 상 기준 주소(base address), 즉 시작 위치 f가 저장된다.
- 페이지 오프셋은 하나의 페이지 내에서 변위를 알려주므로, 기준 주소값에 변위를 더함으로써 요청된 논리적 주소에 대응되는 물리적 주소를 얻을 수 있다.
② 페이지 테이블의 구현
- 페이지 테이블 : 페이징 기법에서 주소 변환을 하기 위한 자료구조, 물리적 메모리에 위치한다.
- 현재 CPU에서 실행 중인 프로세스의 페이지 테이블에 접근하기 위해 운영체제는 두 가지 레지스터를 사용하는데, 하나가 페이지 테이블 기준 레지스터(page-table base register, 메모리 내에서 페이지 테이블 시작 위치 가리킴)이고, 다른 하나가 페이지 테이블 길이 레지스터(page-table length register, 페이지 테이블의 크기)이다.
- 페이징 기법에서 메모리 접근 연산은 항상 두 번의 메모리 접근, 주소 변환을 위한 페이지 테이블 접근과 변환된 주소로 실제 데이터를 접근하는 것을 필요로 한다. (매번 메모리에 두 번 접근해야 하는 오버헤드 뒤따름)
▷ TLB(Translation Look-aside Buffer)
- 고속의 주소 변환용 하드웨어 캐시, 페이지 테이블 접근 오버헤드를 줄이고 메모리 접근 속도를 향상시키기 위함이다.
- TLB로 사용되는 하드웨어는 메모리에 비해 가격이 비싸므로 빈번히 참조되는 페이지에 대한 주소 변환 정보만을 담는다. 요청되는 페이지의 정보가 TLB에 있을수도, 없을수도 있고, TLB에 존재하지 않는 경우는 메인 메모리의 page table에 접근하여 프레임 번호를 알아와야 한다.
- 컨텍스트 스위칭이 일어날 시, 프로세스마다 주소 변환 정보는 모두 다르기 때문에 TLB 내용은 모두 지워야 한다.
- 하지만, TLB에 저장되어 있는 정보는 페이지 테이블과 달리 페이지 번호에 따라 순차적으로 프레임 번호가 저장되어 있지 않고, 해당 페이지에 대한 주소 변환 정보가 있는지 없는지도 알 수 없기 때문에 TLB의 모든 항목을 다 찾아봐야 한다는 오버헤드가 발생한다.
- 이러한 오버헤드를 줄이기 위해 TLB의 구현에는 일반적으로 병렬 탐색이 가능한 연관 레지스터를 사용한다. 한 번의 TLB 접근 시간에 TLB 내의 모든 항목을 한꺼번에 조사할 수 있다.
- EAT(Effective Access Time)
③ 계층적 페이징
32비트 주소 체계를 지원하는 컴퓨터는 232byte(=4GB)의 주소 공간을 갖는 프로그램을 지원할 수 있다.
이러한 환경에서 페이지 크기가 4KB라면 4GB/4KB, 즉 1M개의 페이지 테이블 항목(entry)이 필요하게 된다.
테이블 항목의 크기는 각 4byte를 요구한다고 가정하면 페이지 테이블은 4MB의 메모리 공간을 요구한다.
대부분의 프로그램은 4GB의 주소 공간 중 극히 일부를 사용하므로 페이지 테이블을 위한 메모리 사용은 심각한 공간 낭비 → 이를 해결하기 위해 2단계 페이징(two-level paging) 기법을 사용한다.
▷ 2단계 페이징
- 주소 변환을 위한 외부 페이지 테이블과 내부 페이지 테이블, 두 단계의 페이지 테이블을 사용한다.
- 사용되지 않는 주소 공간에 대해서는 외부 페이지 테이블의 항목을 NULL로 설정하고 이에 대응되는 내부 페이지 테이블을 생성하지 않음으로써 메모리의 낭비를 크게 줄일 수 있다.
- 주소 변환을 위해 접근해야 하는 페이지 테이블이 증가했으므로 시간적인 손해가 뒤따른다.
- 2단계 페이징 기법에서는 논리적 주소를 두 종류의 페이지 번호(p1<외부 페이지 테이블의 인덱스>, p2<내부 페이지 테이블의 인덱스>)와 페이지 오프셋(d)로 구분한다.
- 외부 페이지 테이블로부터 p1만큼 떨어진 위치에서 내부 페이지 테이블의 주소를 얻음 → 내부 페이지 테이블로부터 p2 떨어진 위치에서 요청된 페이지가 존재하는 프레임의 위치를 얻음 → 마지막으로 해당 프레임의 d만큼 떨어진 곳에서 원하는 정보에 접근할 수 있다.
32비트의 주소 체계를 갖는 시스템에서 페이지 하나의 크기가 4KB이고 페이지 테이블 항목의 크기가 4byte일 때 32비트의 논리적 주소 중 페이지 번호와 페이지 오프셋을 위해 각각 몇 비트씩을 할당해야 하는가?
페이지의 크기가 4KB(212byte)이므로 하나의 페이지 내에서 바이트 오프셋을 결정하기 위해 12비트가 필요하다. 총 32비트 중 최하위 12비트는 오프셋 d로 사용된다.
내부 페이지 테이블의 경우 이 테이블 자체를 하나의 프레임에 보관한다. 따라서, 4KB의 페이지를 사용하는 상황에서는 내부 테이블의 크기 또한 4KB가 되고 4KB/4byte인 1K개의 항목을 가진다. 이 1K개의 항목을 구분하기 위해서는 총 10bit가 필요하다.
따라서 외부 페이지 테이블 인덱스에는 32-10-12로 총 10비트를 할당한다.
- 프로세스의 주소 공간이 커질수록 페이지 테이블의 크기도 커지므로 3단계, 4단계 페이징을 활용할 수 밖에 없고 이러한 경우는 메모리 접근시간이 크게 늘어난다. 이는 앞에서 언급했던 TLB를 이용하면 효과적으로 평균적인 메모리 접근 시간, EAT를 줄일 수 있다.
④ 역페이지 테이블 (inverted page table)
- 페이지 테이블로 인한 메모리 공간의 낭비가 심한 이유는 모든 프로세스의 모든 페이지에 대해 페이지 테이블 항목을 모두 구성하기 때문이다.
- 이를 해결하기 위해 역페이지 테이블 기법이 사용된다.
- 논리적 주소에 대해 페이지 테이블을 만드는 것이 아닌, 물리적 주소에 대해 페이지 테이블을 만든다. → 각 프로세스마다 테이블을 각각 두는 대신 전체 시스템에 하나의 테이블을 둔다.
- 페이지 테이블의 항목은 어느 프로세스의 어느 페이지가 이 프레임에 저장되었는가의 정보를 보관하고, 이 정보는 프로세스 번호(pid)와 그 프로세스 내의 논리적 페이지 번호(p)를 담고 있다.
- 역페이지 테이블은 요청이 들어올 때 물리적 주소에 그 주소를 담은 페이지가 있는지 여부를 살피는데 오랜 시간이 소요되므로 일반적으로 메모리에 유지하는 것이 아니라 연관 레지스터에 보관해 테이블 전체 항목에 대한 병렬 탐색을 가능하게 한다.
⑤ 공유 페이지
- 공유 코드(shared code) : 메모리 공간의 효율적 사용을 위해 여러 프로세스에 대해 공통적으로 사용되도록 작성된 코드 (재진입 가능 코드, 순수 코드라고도 불림 // 읽기 전용)
- 공유 페이지 : 공유 코드를 담고 있는 페이지
- 공유 페이지는 그 페이지를 공유하는 모든 프로세스의 주소 공간에서 동일한 페이지 번호를 가져야 한다.
⑥ 메모리 보호
- 페이지 테이블의 각 항목은 주소 변환 정보 뿐 아니라 메모리 보호를 위한 보호비트와 유효-무효 비트를 둔다.
▷ 보호비트(protection bit)
- 각 페이지에 대한 접근 권한 내용을 담는다.
- 한 프로세스의 주소 공간은 다른 프로세스에 의해 접근될 수 없으므로 '누구'에 대한 접근 권한은 설정될 필요가 없으며 각 페이지에 대해 '어떠한' 접근을 허용하는지 정보가 보호비트에 저장된다. (읽기-쓰기, 읽기 전용 등의 권한)
▷ 유효-무효 비트(valid-invalid bit)
- 해당 페이지의 내용이 유효한지에 대한 내용을 담는다.
- 유효의 의미는 해당 메모리 프레임에 그 페이지가 존재함을 뜻한다.(접근 허용)
- 무효의 의미는 프로세스가 그 주소 부분을 사용하지 않거나, 해당 페이지가 물리적 메모리에 올라와 있지 않고 백킹스토어에 존재해 유효한 접근 권한이 없다는 의미를 가진다.
5. 세그먼테이션 (Segmentation)
- 프로세스의 주소 공간을 의미 단위의 세그먼트로 나누어 물리적 메모리에 올리는 기법
- 주소 공간 전체가 세그먼트가 될 수도, 코드/데이터/스택 등의 기능 단위가 세그먼트가 될 수도, 프로그램을 구성하는 함수 하나하나가 세그먼트가 될 수 있다. (일반적으로는 코드/데이터/스택)
- 논리적 주소는 <세그먼트 번호, 오프셋>으로 나뉘며 세그먼트 번호는 해당 논리적 주소가 프로세스 주소 공간 내 몇 번째 세그먼트에 속하는지를 나타내고, 오프셋은 그 세그먼트 내에서 얼마만큼 떨어져 있는지를 나타낸다.
- 세그먼트 테이블 : 각 항목은 기준점(base)과 한계점(limit)을 가지며 기준점은 물리적 메모리에서 세그먼트의 시작 위치를 가리키고 한계점은 세그먼트의 길이를 나타낸다.
- 페이징 기법에서 사용한 페이지 테이블 기준 레지스터와 페이지 테이블 길이 레지스터와 마찬가지로 세그먼테이션 기법에서도 세그컨트 테이블 기준 레지스터(현재 CPU에서 실행 중인 프로세스의 세그먼트 테이블이 메모리의 어느 위치에 있는지)와 세그먼트 테이블 길이 레지스터(그 프로세스의 세그먼트 개수)를 가지고 주소 변환을 한다.
① 요청된 세그먼트 번호가 STLR(세그먼트 테이블 길이 레지스터)에 저장된 값보다 작은가?
- 만일 그렇지 않다면 존재하지 않는 세그먼트에 대한 접근이므로 예외 상황을 발생시켜 메모리 접근을 막는다.
② 논리적 주소의 오프셋 값이 그 세그먼트의 길이보다 작은 값인가?
- 세그먼트 길이를 넘어서는 오프셋 값의 접근 또한 예외 상황을 발생시켜 메모리 접근을 막는다.
- 위의 두 사항을 모두 만족했을 때 그제서야 유효한 메모리 접근 요청으로 판단해 주소 변환 작업이 이루어진다.
- 페이징 기법과 마찬가지로 세그먼트 테이블의 각 항목에 보호비트와 유효비트를 둔다.
- 공유나 보안처럼 의미있는 단위에 대해 수행하는 업무에서는 페이징 기법보다 세그먼테이션 기법이 장점을 갖는다.
- 세그먼테이션 기법은 길이가 균일하지 않으므로 물리적 메모리 관점에서 외부 단편화가 발생하고, 세그먼트를 어느 가용 공간에 할당할 것인가를 결정하는 문제에 직면한다. (최초적합, 최적적합 방식 적용)
6. 페이지드 세그먼테이션 (Paged Segmentation)
- 프로그램을 의미 단위의 세그먼트로 나누고, 물리적 메모리에 적재하는 단위는 페이지 단위로 한다.
- 하나의 세그먼트 크기를 페이지 크기의 배수가 되도록 함으로써 세그먼테이션 기법에서 발생하는 외부 단편화 현상을 해결하고, 세그먼트 단위로 프로세스 간의 공유나 프로세스 내의 접근 권한 보호가 이루어지도록 함으로써 페이징 기법의 약점을 해결한다.
- 외부의 세그먼트 테이블과 내부의 페이지 테이블, 두 단계의 테이블을 주소 변환을 위해 사용한다.
※ 논리적 주소<세그먼트 번호, 오프셋>를 물리적 주소로 변환하는 과정
① 먼저, 논리적 주소의 상위 비트인 세그먼트 번호를 통해 세그먼트 테이블의 해당 항목에 접근
② 항목에서 세그먼트 길이, 세그먼트 페이지 테이블 시작 주소를 꺼낼 수 있다. 이 때 세그먼트 길이를 넘어서는 메모리 접근 시도 여부를 체크하기 위해 세그먼트 길이와 오프셋값을 비교하고 트랩을 발생시키거나 다음 단계로 이동한다.
③ 오프셋값을 다시 상위 하위 비트로 나누어 상위 비트는 그 세그먼트 내에서의 페이지 번호로 사용하고 하위 비트는 페이지 내에서의 변위로 사용한다.
④ 세그먼트 테이블로부터 페이지 테이블 시작 주소를 얻고, 그 주소로부터 페이지 번호만큼 떨어진 곳에 페이지 프레임 위치를 얻은 후, 오프셋의 하위 비트값인 페이지 내에서의 변위만큼 이동하여 원하는 물리적 메모리 주소를 얻게 된다.
'CS > 운영체제(OS)' 카테고리의 다른 글
[OS] 운영체제란? (0) | 2022.08.20 |
---|---|
[운영체제] 가상메모리 (0) | 2022.08.07 |
[운영체제] CPU 스케줄링 (0) | 2022.08.05 |
[운영체제] 프로세스 관리 (0) | 2022.08.05 |
[운영체제] 프로그램의 구조와 실행 (0) | 2022.08.05 |