개발계발
가상 메모리 본문
가상메모리란?
실행하고자 하는 프로그램을 일부만 물리 메모리에 적재해서 실제 메모리의 크기보다 더 큰(많은) 프로세스를 실행할 수 있는 기술이다.
그럼 가상메모리가 적용되기 전 메모리는 어떻게 사용됐나?
연속 메모리 할당
이전 포스팅에서 설명했듯이 메모리를 운영체제의 영역과 사용자영역으로 나눈 뒤 사용자 영역에 연속적으로 메모리를 할당하는 방식을 이용했다.
예를 들어, 메모리가 0~999번지까지 있다고 가정하고 아래의 그림을 보자.
-> 메모리의 0~299번지는 운영체제 영역이고, 300~999번지는 사용자 영역으로 CPU의 경계 레지스터에 의해 연속적으로 프로세스가 적재되는 방식이다.
언뜻 보면 문제가 없어보이지만, 외부 단편화라는 문제가 발생한다.
메모리에 더 여러가지 프로세스가 적재돼 있는 상황을 보자.
위 그림처럼 4개의 프로세스가 실행되다가 2,4번 프로세스가 종료되면 총 50의 빈 공간이 생긴다.
-> 이후에 40의 영역을 차지하는 프로세스가 적재되려면??
50의 빈공간이 있지만 40의 연속된 공간이 없기 때문에 적재될 수 없다. 이 현상을 외부 단편화라고 한다.
프로세스를 재배치하면 되지 않아??
-> 가능하지만 메모리를 재배치(압축)하는 동안에는 시스템은 하던 일을 중지해야한다.
이를 해결하기 위해 등장한 것이 가상 메모리 기법이다.
페이징 기법
메모리와 프로세스를 일정한 단위로 자르고, 이를 메모리에 불연속적으로 할당하는 방법
논리(가상) 주소 공간을 페이지, 물리 주소 공간을 프레임으로 나눈다.
위 그림처럼 페이지 테이블을 이용해 불연속적으로 배치돼있는 프로세스가 연속적으로 배치돼있는 것처럼 CPU를 속이는 것이다.
-> 이를 이용해 메모리를 불연속적으로 할당할 수 있는 건 알겠는데, 어떻게 실제 물리 메모리의 크기보다 더 많은(큰) 프로세스를 실행시켜주는가?
페이지 교체(스와핑)
보조기억장치에는 스왑 영역이라는 공간이 존재한다. 실행된 프로세스들 중 현재는 실행되지 않는 프로세스를 잠시 물리메모리에서 쫓아내는데 이 때 쫓겨나는(스왑 아웃) 프로세스가 적재되는 곳이다.(반대로 다시 돌아오는 것은 스왑 인)이라고 한다.
이 스와핑이라는 기법을 이용해 물리 메모리 + 보조기억장치의 일부영역 까지 사용해 프로세스를 관리할 수 있기 떄문에 실제 물리 메모리 크기보다 더 많은(큰) 프로세스를 실행할 수 있다.
그럼 이제 어떤 원리로 페이지 교체를 하는 지 페이지 교체 알고리즘에 대해서 알아보자
페이지 교체 알고리즘
메모리에 적재된 페이지들 중 어떤 페이지를 스왑 영역으로 보낼지 결정하는 알고리즘
FIFO 페이지 교체 알고리즘
- 가장 단순한 방식으로 가장 먼저 메모리에 적재된 페이지부터 스왑아웃하는 것(오래 머물렀다면 나가라)
OPT(Optimal Page Replacement) 알고리즘
- 미래에 어떤 페이지가 사용될 지를 알고 있다는 가정 하에, 가장 오랫동안 사용되지 않을 페이지를 스왑 아웃하는 알고리즘
-> 미래를 예측해야하기 때문에 실제 구현이 어렵고, 주로 다른 페이지 교체 알고리즘의 이론 상 성능을 측정하기 위한 목적으로 사용된다.
LRU(Least Recently Used) 페이지 교체 알고리즘
- 최근에 사용되지 않은 페이지는 앞으로도 사용되지 않을 것이라고 가정하고 스왑아웃하는 알고리즘이다.
-> 페이지가 들어온 순서를 기록하고 있어, 페이지의 사용 패턴을 파악할 수 있다.
이보다 좀 더 단순한 알고리즘은 2차 기회 교체 페이지 알고리즘이 있다.
2차 기회 페이지 교체 알고리즘
- access bit(접근 비트)를 통해서 해당 페이지가 사용된 적이 있는 지를 확인하고 사용된 적이 있다면 접근 비트를 0으로 변경하면서 한 번 더 기회를 부여하는 것이다.(다음 번에 검사했을 때도 여전히 0이면 스왑아웃)
접근 비트가 뭐임?
- 페이지 테이블에는 페이지번호와 프레임번호 외에도 플래그 비트가 저장되는데 플래그 비트에는 다음과 같은 정보가 담긴다.
- 유효 비트
해당 페이지가 실제로 메모리에 있는지를 판단하는 것으로, 유효 비트가 0이면 해당 페이지는 스왑영역에 있다는 뜻이다.
- 접근 비트
해당 페이지가 메모리에 적재된 후 사용한 적이 있는지를 나타낸다. 사용한 적이 있다면 1이된다(참조 비트라고도 불림)
- 변경 비트(더티 비트)
해당 페이지가 메모리에 적재된 후 변경이 있었는지를 나타낸다. 변경된 적이 있다면 1이 돼서 해당 프로세스가 종료되기 전에 영구적으로 저장하는 추가작업이 필요하다.
- 접근 권한 비트(r/w/x)
읽기, 쓰기, 실행비트로 각 권한이 없는 프로세스가 해당 작업을 수행하려고 할 때 접근을 차단하는 데 사용한다.