[CS] 운영체제 - 가상메모리

이상혁·2023년 9월 24일
0

Computer science

목록 보기
14/15
혼자 공부하는 컴퓨터 구조 + 운영체제를 읽고 공부한 내용입니다.

연속 메모리 할당

연속 메모리 할당은 프로세스에 연속적인 메모리 공간을 할당하는 방식이다.

스와핑

메모리에 적재가 되어 있는 메모리 중에 오래동안 실행이 되지 않는 프로새스가 있다.
이를 임시로 보조기억 장치로 내보내고 새로 생긴 메모리 공간에 새로운 프로세스를 적재하여 실행하는 방식을 스와핑이라고 한다.

프로스세스들이 임시로 보조기억장치에 저장되는 영역을 스왑영역이라고 한다.
그래서 스왑영역으로 옮겨지는 것을 스왑 아웃이라고 한다.
반대로, 스왑영역에서 메모리로 옮겨지는 것을 스왑 인이라고 한다.

메모리 할당

메모리를 연속적을 할당하는 방법에는 최초 적합, 최적 적합, 최악 적합이 있다.

최초 적합은 운영체제가 메모리 내에 빈 공간을 순서대로 검색을 하다가 먼저 발견한 빈 공간에 프로세스를 적재하는 방식이다.
이 방식은 발견 즉시 적재를 하기 때문에 검색을 최소화하고 빠른 적재가 가능하다.

최적 적합은 운영체제가 빈 공간을 검색한 후 프로세스가 적재될 수 있는 겅간 중 가장 작은 메모리 공간에 프로세스를 적재하는 방식이다.

최악 적합은 마찬가지로 운영체제가 빈 공간을 검색한 후에 프로세스를 적재할 수 있는 가장 큰 메모리 공간에 배치하는 방식이다.

외부 단편화 문제

연속 메모리 할당은 외부 단편화 문제를 가지고 있다.

예시를 통해서 알아 보자.
메모리에 적재가 될 수 있는 영역이 200MB라고 해보자.
프로세스 A가 100MB이고 먼저 적재가 되었다.
그리고 프로세스 b가 30MB이고 2번,
프로세스 C가 50MB가 이고,
프로세스 D가 20MB가 이고
A-B-C-D 순으로 연속적으로 할당이 되었다.

여기서 프로세스 B, D가 종료되어 메모리에서 나갔을 때 B, D의 자리에 빈 공간이 생기고 총 50MB라는 공간이 생겼다.
하지만 50MB 크기의 프로세스E를 메모리에 적재하지 못 한다.
총합이 50MB이지 빈 공간은 30MB, 20MB이기 때문이다.

이렇게 빈 메모리 공간이 있음에도 공간의 크기가 작아서 다른 프로세스를 적재하지 못하고 낭비가 되는 현상을 외부 단편화 문제이다.

이 외부 단편화 문제를 해결하기 위한 방법으로 압축이 있다.
압축은 여기저기 흩어져 있는 공간을 하나로 모으는 방법을 말한다.

하지만 이 공간을 모으는데 시스템은 하던 일을 멈추어야 하고
메모리에 있는 내용을 옮기는 작업이 많아지면 오버헤드가 발생할 수 있다.

페이징을 통한 가상 메모리 관리

연속 메모리 할당은 외부 단편화 문제와 프로그램의 크기가 물리 메모리의 크기보다 크면 적재할 수 없는 문제를 가지고 있다.
가상 메모리는 살행하고자 하는 프로그램의 일부만 메모리에 적재를 해서 실행할 수 있게 해주는 기술이다.
이 가상메모리 기법을 가능하게 하는 것이 페이징이다.

페이징이란

페이징 기법이란 프로세스의 논리주소를 페이지 단위로 자르고 메모리 물리 주소 공간을 프레임 단위, 즉 페이지와 동일한 크기로 자른 뒤 페이지를 프레임에 할당하는 기법이다.

페이징에서도 스와핑이 가능하다.
페이징을 사용하면 페이지 단위로 스와핑이 된다.
그래서 스왑 아웃, 스왑 인이 페이지 아웃, 페이지 인이라고 부른다.

페이지 테이블

이 페이지 기법의 문제는 불연속정으로 저장이 되기 떄문에 다음에 실행할 명령어를 찾을 수 없다는 것이다.
이를 해결하기 위해서 논리 주소에는 연속적으로 배치가 되도록 페이지 테이블을 이용한다.

페이지 테이블은 페이지 번호와 프레임 번호를 이어주는 표이다.
CPU로 하여금 번호만 보고 해당 페이지가 적재된 프레임을 찾을 수 있게 하는 것이다.
즉, 페이지 테이블은 현재 어떤 페이지가 어떤 프레임에 할당되어 있는 지 알려주는 표이다.
그리고 프로세스마다 각자의 페이지 테이블이 있다.
이 페이지 테이블은 메모리에 적재가 되고 CPU내의 페이지 테이블 베이스레지스터에 페이지 테이블이 저장되어 있는 메모리 주소가 가르키고 있다.

그런데 이 방법은 문제가 있다.
메모리에 두 번 접근을 해야하는 것이다.
메모리에 있는 페이지 테이블을 보기 위해서,
테이블 페이지에 있는 프레임에 접근하기 위해서 총 두 번 접근을 한다.

이 문제를 해결하기 위해서 CPU의 TLB를 사용한다.
TLB는 페이지 테이블의 캐시 메모리이다.
패이지 테이블의 일부 내용만에 저장이 된다.

페이지의 주소가 TLB에 있을 경우 TLB히트라고 한다.
없을 경우는 TLB 미스라고 한다.

페이징에서의 주소 변환

페이징에서 특정 주소에 접근하기 위해서는 두 가지 정보가 필요하다.
어떠 페이지, 프레임에 접근을 하고 싶은지,
접근하려는 주소가 페이지,프레임으로 부터 얼마나 떨어져 있는지를 알아야 한다.

논리 주소는 페이지 번호와 변위로 구성이 되어 있다.
페이지 번호는 말 그대로 페이지 번호이고 변위는 접근하려는 주소가 프레임의 시작 번지로부터 얼마큼 떨어져 있는지 알기 위한 정보이다.

정리를 하면 논리주소에 페이지, 변위가 물리주소의 프레임, 변위로 변경되어 찾아진다.

페이지 테이블 엔트리

페이지 테이블의 각 행을 페이지 테이블 엔트리라고 한다.
이 엔트리에는 페이지번호, 프레임 번호만 있는 것이 아니라 다양한 정보가 있다.
유효 비트, 보호 비트, 참조 비트, 수정 비트이다.

유효 비트는 해당 페이지에 접근 가능한지 여부를 알려줍니다.
즉, 이 페이지가 메모리에 적재되어 있는지, 스왑 영역에 있는지 알려준다.

보호 비트는 페이지 보호 기능을 위해 존재하는 비트이다.
보호 비트는 해당 페이지를 읽기만 가능한 지, 일고 쓰기가 가는한 페이지인지 나타낼 수 있다.

참조 비트는 CPU가 이 페이지의 접근을 한 적이 있는지 여부를 나타낸다.

수정비트는 해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정여부를 알려준다. 더티 비트라고도 한다.
이 수정 비트를 통해서 보조기억장치에 쓰기 작업을 해야 하는지, 할 필요가 없는지를 판단할 수 있다.
만약, 수정이 되어 있지 않다면 굳이 쓰기 작업을 하지 않아도 된다.
만약 수정이 되어 있다면 쓰기 작업을 통해서 저장을 해준다.

페이지 교체와 프레임 할당

요구 페이징

프로세스를 메모리에 적재할 때 모든 페이지를 적재하지 않고 필요한 페이지만 적재하는 방법을 요구 페이징이라고 한다.

요구 페이징의 과정은
CPU가 특정 페이지에 접근을 하는 명령어를 실행한다.
해당 페이지가 메모리에 있을 경우 페이지가 적재된 프레임에 접근을 한다.
해당 페이지가 현재 메모리에 없을 경우 페이지폴트가 발생을 한다.
페이지 폴트 처리 루틴에 따라 페이지를 적재하고 유효 비트를 1로 변경한다.
그리고 다시 접근명령어를 실행한다.

아무런 페이지도 메모리에 적재하지 않고 실행을 하는 경우도 있는데
이 때 처음부터 페이지폴트가 발생을 하고 실행에 필요한 페이지가 어느 정도 적재가 되면 페이지폴트 발생빈도가 줄어든다.
이를 순수 요구 페이징이라고 한다.

요구 페이지로 다시 돌아와서 요구 페이징이 안정적으로 실행이 되기 위해서 페이지 교체프레임 할당을 해결해야 한다.
페이지 교체는 프로세스가 실행이 되는 동안 많은 페이지들이 메모리에 적재가 되고 다른 페이지를 실행하기 위해선 페이지를 바꾸어햐 한다.
이렇게 스왑 영역으로 페이지를 보내고 필요한 페이지를 메모리에 적재하는 것을 페이지 교체라고 한다.

페이지 교체 알고리즘

페이지 교체 알고리즘은 어떤 페이지를 스왑영역으로 보낼지 결정하는 알고리즘이다.
페이지 교체 알고리즘중 좋은 알고리즘은 페이지 폴트를 적게 발생하는 알고리즘이다.

이 페이지 알고리즘을 이해하기 위해서는 페이지 폴트 횟수페이지 참조열을 알아야 한다.

2 2 2 3 5 5 5 3 3 7을
연속되 페이지를 제거하면
2 3 5 3 7이 된다.

연속된 페이지를 제거하는 이유는 연속이 되면 페이지 폴트가 발생하지 않는 것이다.

FIFO 페이지 교체 알고리즘은 메모리에 가장 먼저 올라온 페이지부터 내쫒는 방식이다.

7이 먼저 들어왔고 그래서 교체가 필요할 때 가장 오랜된 7이 교체가 된다.
하지만 이 알고리즘의 단점은 7이 만약 실행이 되는 내내 사용이 된다면 이는 효율적이지 않다.

최적 페이지 교체 알고리즘은 사용빈도가 낮은 페이지를 교체하는 알고리즘이다.

장점은 가장 낮은 페이지 폴트를 발생시키는 이상적인 알고리즘이다.
하지만 실제 구현은 어렵다.
프로세스가 어떤 페이지를 참조할 지 알아야 하느네 이는 현재적으로 불가능하다.

LRU 페이지 교체 알고리즘은 오랫동안 사용하지 않는 페이지를 교체하는 알고리즘이다.

최근에 사용되지 않은 페이지가 앞으로도 사용이 되지 않을 것이하는 생각을 바탕으로 만들어진 것이다.

스래싱과 프레임 할당

프로세스가 실제 실행이 되는 시간보다 페이지 폴트에 더 많은 시간이 들어가는 것을 스래싱이라고 한다.
스래싱이 발생하는 근본적인 원인은 각 프로세스가 필요한 최소한의 프레임 수를 보장하지 않아서이다.

프레임 할당 방식에는 균등 할당, 비례 할당,이 있다.

균등 할당은 나눌 수 있는 프레임의 수를 모든 프로세스들이 똑같이 나누어 같는 것을 말한다.

비례 할당은 프로세스의 크기별로 비례해서 프레임의 수를 나누어 가진다.
하지만 필요한 프레임의 수는 크기와 상관이 없다.
크기 작아도 필요한 프레임의 수가 많을 수도 있다.

작업 집합모델을 사용하거나 페이지 폴트 빈도를 사용할 수 있다.

작업 집합모델은 프로세스가 일정 기간 동안 참조한 페이지 집합을 기역하여 빈번한 페이지 교체를 방지하는 것이다.

페이지 폴트 빈도는 페이지 폴트율을 그래프로 그려서 상한선과 하한선을 정하고 이 범위안에서 프레임을 할당하는 방식이다.

profile
개발 공부 하기 위해 만든 블로그

0개의 댓글