가상 메모리를 이해하기 위한 배경지식을 알아보고 가상 메모리를 알아보자.
배경지식 4가지
- 컴퓨터 구조
- 프로그램이 실행되는 것이란?
- 주소 바인딩
- 스왑 영역
1. 컴퓨터 구조
- CPU : 메모리 연산
- RAM까지의 값만 참조할 수 있기 때문에, 보조 기억 장치(외부 저장 장치, DISK)의 값을 참조하려면 OS의 도움을 받아 입출력 작업을 진행한다.
2. 프로그램이 실행되는 것
- 프로그램이 실행된다는 것은, CPU가 일을 하는 것이다.
- 위에서 말했듯이 CPU는 메인 메모리의 값만 참조 가능하다.
fork()
요청으로 새 프로세스를 생성하고,
exec()
요청으로 로더를 호출한다.
로더 : 새로 생성된 프로세스의 주소 공간을 사용하여 지정된 실행 파일을 메모리에 올림
- 프로그램을 실행하면 디스크에 존재하던 실행파일이 메모리에 올라오고 CPU가 해당 정보를 참조할 수 있게 되는 것이다.
3. 주소 바인딩
논리 주소와 물리 주소
- CPU는 실행 파일을 실행하면 0번부터 시작하는 프로세스마다 독자적인 주소 공간을 생성한다.
- 그리고 이 주소를 바라보는데 이것을
논리주소
라고 한다.
- CPU가 일을 하기 위해서는 논리 주소가 메인 메모리에 올라와 있어야 한다.
논리 주소(logical address, 가상 주소)
: 각 프로세스에게 CPU가 할당하는 주소
물리 주소(physical address)
: 메모리가 취급하는 주소
- 논리 주소가 물리적 메모리의 특정 위치로 맵핑 되는데 이 작업을
주소 바인딩
이라고 한다.
바인딩 방식
-
바인딩 방식 (물리적 메모리 주소가 결정되는 시기에 따라)
- 컴파일 타임 바인딩
- 로드 타임 바인딩
- 실행 시간 바인딩
-
가상 메모리를 사용하기 위해서는 실행 시간 바인딩
이 지원되어야 한다.
-
이 기법을 사용하면, 논리 주소와 물리 주소의 값이 달라지게 된다.
-
실행 시간 바인딩을 위해선 하드웨어적인 지원이 필요하다.
-
CPU가 메모리에 접근을 할 때 주소값 기반으로 참조를 하게 되는데, 이때 매번 주소 매핑 테이블을 이용해 바인딩을 점검한다.
-
그러기 위해서는 기준 레지스터
, 한계 레지스터
를 포함하여 MMU라는 하드웨어의 지원이 필요하다.
MMU : CPU가 메모리에 접근을 관리하는 하드웨어 부품(논리 주소를 물리 주소로 맵핑해주는 하드웨어 장치)
MMU 기법
- 기준 레지스터에는 현재 프로세스의 물리적 메모리의 시작 주소가 저장되어 있어
논리 주소 + 기준 레지스터 값
으로 물리적 주소의 위치를 찾는다.
- 프로세스는 자기 자신만의 고유한 주소 공간을 가지기 때문에, 동일한 논리주소 값이라도 각 프로세스마다 서로 다른 내용을 담고 있다.
시분할 방식
- CPU는 지금까지 설명했던 과정을 통해 프로세스를 실행시킨다.
- CPU를 하나라고 가정했으니 일할 수 있는 자원은 1개
- 그러나 우리는 여러 프로그램을 동시에 실행하는 것처럼 사용
- 이는 사실 동시에 실행하는 것이 아니라 cpu가 짧은 시간 단위로 프로세스를 바꿔가며 사용하는 것
- 이를 시분할 방식이라고 함
4. 스왑 영역
- CPU가 프로세스를 실행하려면 메모리에 올라와 있어야 하는데 여러 프로그램이 메모리에 올라오면 메모리 공간이 부족할 수 있다.
- 그래서 메모리 공간의 확장 영역으로
스왑 영역
을 사용한다.
- 스왑 공간은 외부 저장 장치에 존재하지만 물리 메모리의 확장 개념이다.
- 물리 메모리에 공간이 부족하기 때문에
실행중인 프로세스의 주소 공간
을 일시적으로 메모리에서 디스크로 내려놓는 것
- 스왑 영역은 디스크에 존재하지만 파일 시스템과는 별도로 존재
- 파일 시스템은 비휘발성이지만, 스왑 영역은 메모리 공간의 확장으로 사용하기 때문에 프로세스가 수행중인 동안에만 일시적으로 저장됨
- 메모리에서 스왑 영역으로의 이동을
swap in
, swap out
이라고 함
- 스왑 영역도 외부 저장 장치에 존재하기 때문에 OS에 의해 I/O 작업이 일어남
그래서 가상 메모리가 뭔데🤔
- 실행되고 있는 프로세스의 정보는 모두 물리 메모리에 올라와 있어야 한다.
- 여러 프로그램을 실행하는 환경에서는 물리 메모리를 나눠서 사용한다.
- 여러 개를 사용할수록, 각 프로그램에 할당될 수 있는 물리 메모리의 크기가 줄어든다.
- 다른 프로세스를 올려야 해서 공간이 부족해진다면 기존 프로세스를 스왑으로 내쫓고 꼭 필요한 프로세스가 물리 메모리에 올라와야 한다.
- 이렇게 된다면 빈번하게 스왑 영역과 I/O가 발생할 것이다.
- 물리 메모리의 크기를 벗어나는 프로세스라면 실행조차 불가능하다.
-> 이런 불편함 때문에 가상 메모리의 개념이 필요하다.
- 가상 메모리는 실제의 물리 메모리 기능과 개발자의 논리 메모리 개념을 분리
- 가상 메모리를 사용하면, 프로세스 전체의 내용을 메모리에 올릴 필요 없이 필요한 부분만 메모리에 올려 실행할 수 있다.
- 어떻게 필요한 정보만 올려둘까? -> 요구 페이징 기법을 통해서~
페이징 기법
- 프로세스마다 페이지 테이블 존재
페이지 단위 크기
== 프레임 단위 크기
- 페이지 테이블 : 프레임과 페이지의 맵핑 정보를 가지고 있음
요구 페이징 기법
- 필요한 페이지만 RAM에 적재하는 방법
- 유무효비트를 사용하여 특정 페이지가 물리 메모리에 올라와 있는지 아닌지를 알 수 있다.
valid
: 해당 페이지가 메모리에 올라와 있음
invalid
: 해당 페이지가 메모리에 없음
Page Fault
Page Fault : 메모리에 없는 페이지를 참조할 때 발생.
MMU가 trap을 발생하여 운영체제에게 알리고, 운영 체제는 CPU의 동작을 잠시 멈춘다.
참조하려는 페이지의 valid bit가 0일 때
- 물리 주소가 RAM이 아닌
하드 디스크의 swap 영역에 존재
하는 것
- RAM의 빈 공간을 찾아(없으면 page replacement 알고리즘) 해당
물리 주소를 swap in
하고 페이지 테이블에 정보를 업데이트 한다.
- CPU 다시 실행
이렇게 필요한 페이지만 물리 메모리에 사용하는 기법을 요구 페이징 기법
이라고 한다.
상대적으로 큰 저장 공간인 swap 영역
을 활용하여 프로세스마다 가상의 주소 공간을 확보하고, 필요한 페이지만 물리 메모리에 올려 사용함으로써 더 효과적으로 물리 메모리를 사용할 수 있게 된다.
정리
가상 메모리 : 메모리 관리 기법 중 하나로, 프로세스 전체가 메모리 내에 올라오지 않더라도 실행이 가능하도록 하는 기법
가상 메모리의 장점
1. 사용자 프로그램이 물리 메모리의 제약에서 벗어난다.
- 사용자 프로그램이 물리 메모리보다 커져도 된다.
- 프로그래머는 물리 메모리 크기를 신경쓰지 않아도 되기 때문에 실제 해결하고자 하는 문제에 집중할 수 있다.
2. 각 프로그램이 더 작은 메모리를 차지하기 때문에 더 많은 프로그램을 동시에 수행 가능하다.
- 프로세스 당 메모리 사용량이 감소하고, 더 많은 프로세스를 수용할 수 있다.
- 응답시간(response time, around time)은 늘지 않으면서 CPU 이용률과 처리률이 높아진다.
3. 프로그램을 메모리에 올리고 swap 하는데 필요한 IO 횟수가 줄어든다.
- IO가 적게 일어나므로 더 빨리 실행이 가능하다.
참고
https://www.youtube.com/watch?v=5pEDL6c--_k
https://www.youtube.com/watch?v=_SyFgWccEs8