기존에는 프로세스가 실행되는 코드 전체를 메모리에 로드해야했다.
그래서 메모리 용량보다 더 큰 프로그램을 실행시킬 수 없었다.
ex ) 100MB의 메모리 환경에서, 200MB 크기의 프로세스를 수행할 수 있도록 가상 메모리를 사용한다.
프로그램에서 실질적으로는 사용되는 부분은 일부이고, 혹은 프로세스의 특정 순간에서 메모리를 사용하기에, 기존의 방식은 비효율적이었다.
따라서 가상 메모리가 필요하다.
물리 주소와 논리 주소
CPU는 실행하고자 하는 프로그램이 메모리의 어디에 있는지 알 수 없다.
메모리에 저장된 값은 시시각각 변하기 때문이다.
- 새롭게 실행되는 프로그램은 새롭게 메모리에 적재한다.
- 실행이 끝난 프로그램은 메모리에서 삭제한다.
- 같은 프로그램을 실행하더라도, 실행할 때마다 적재되는 주소는 달라진다.
따라서, 물리 주소와 논리 주소를 분리해야한다.
물리 주소
실제로 저장된 하드웨어상의 주소
메모리를 위한 주소다.
실제 프로그램간에 물리 주소는 중복된 값을 가질 수 없다.
논리 주소
CPU와 실행 프로그램을 위한 주소
실행 중인 프로그램마다, 0번지부터 시작하는 주소를 할당한다.
CPU가 알아야하는 주소다.
실제 프로그램간에 논리 주소는 중복된 값을 가질 수 있다.
메모리 보호
논리 주소에서 물리 주소로 변환하는 과정에서, 다른 프로그램으로 침범될 수 있다.
이를 위해서, 기준 레지스터와 한계 레지스터를 둔다.
기준 레지스터는 물리 주소의 시작점을 나타낸다. 논리 주소 + 기준 레지스터 값으로 물리 주소를 계산한다.
한계 레지스터는 논리 주소의 끝지점을 나타낸다.
시작과 끝이 정해져있기 때문에 다른 프로그램으로 주소를 침범할 일이 없어 보호할 수 있다.
MMU ( Memory Management Unit )
CPU가 연산을 하려면 메모리의 값을 참조해야한다.
CPU는 연산할 때 레지스터의 값을 참조한다. 레지스터는 자료를 보관할 수 있는 매우 빠른 기억 장소이지만, 용량이 매우 작다. 그래서 CPU는 레지스터보다는 조금 느리지만, 더 큰 용량을 가진 메모리를 이용한다.
여기서 더 많은 내용을 저장할 때는, 보조 저장 장치를 이용한다. CPU는 메인 메모리까지만 값을 참조할 수 있기 때문에, OS의 도움을 받아서 IO 작업을 통해 보조 저장 장치로부터 필요한 데이터를 불러올 수 있다.
불러온 데이터는 메인메모리로 로드하는데, 이때 물리 주소를 사용한다. 그리고, CPU가 처리할 수 있도록 논리 주소를 생성해야한다.
그래서 CPU가 실제 메모리의 값이 필요하는 등, 다시 메인 메모리로 접근이 필요할 때 논리 주소만 가지고서는 수행할 수 없다.
따라서 물리 주소와 논리 주소간에 변환이 필요한데, MMU라는 하드웨어 장치가 두 주소간 값을 변환한다.
프로그램의 실행
- 보조 저장 장치에 있는 프로그램을 실행하고자한다.
- 보조 저장 장치에 있는 소스 프로그램을 컴파일러와 링커를 통해 실행 파일을 생성한다.
- 실행하기 위해서는 CPU가 참조할 수 있는 메모리인 메인메모리에 로드해 프로세스 형태로 배치시켜야한다.
- 실행시켜, fork() 콜으로 새 프로세스를 생성한다.
- exec() 콜으로 로더를 호출해서, 새로 생성된 프로세스의 주소 공간을 사용해서 지정된 실행 파일을 메모리에 로드한다.
- CPU가 처리할 수 있도록, 이 프로세스를 위한 논리 주소를 생성한다. 이 주소는 주소 바인딩을 통해 물리 주소와 매핑된다.
주소 바인딩
논리 주소와 물리 주소를 매핑하는 주소 바인딩은, 물리 주소가 결정되는 시기에 따라, 3가지의 방식으로 나뉜다.
- 컴파일 타임 바인딩
- 논리적 주소와 물리적 주소가 똑같기 때문에, 한가지 프로세스를 실행시키는 환경이 아니라면 부적합하다.
- 말 그대로 컴파일할 때 물리 주소가 결정되는 주소 바인딩 방식
- 로드 타임 바인딩
- 프로세스가 실행될 때마다 물리 주소를 매핑해주기 때문에, 바꿀 때마다 매핑을 새로 해야하므로, 메모리를 로딩할 때 시간이 오래 걸리는 문제가 발생한다.
- 프로세스의 실행이 시작될 때 물리 주소가 결정되는 바인딩 방식
- 실행 시간 바인딩
- CPU가 주소를 참조할 때마다 해당 데이터가 물리 주소의 어느 위치에 있는지 주소 매핑 테이블을 이용해서 바인딩을 확인한다.
- 바인딩 과정에서 변환에 필요한 계산을 MMU 장치가 수행한다.
- 프로그램이 실행한 후에도 물리 주소가 변경될 수 있는 바인딩 방식
Swap Area
여러개의 프로그램이 프로세스의 형태로 메인 메모리에 로드되면, 메모리의 공간이 부족할 수 있다.
그래서 메모리 공간의 확장 영역으로 Swap 영역을 사용한다.
Backing Store라고도 불리는 Swap 영역은, 외부 저장 장치에 존재하지만, 물리 메모리(메인 메모리)에 대해 확장해서 쓸 수 있는 영역이다.
물리 메모리에 공간이 부족해, 실행 중인 프로세스의 주소 공간을 일시적으로 메모리에서 디스크로 내려 놓는다.
단, 보조 저장 장치의 File System 영역과는 별도로 존재한다.
File System은 비휘발성이며 느린 반면, Swap Area는 휘발성이며 비교적 빠르다.
- Swap Out : 메모리 → Swap Area
- Swap In : Swap Area → 메모리
이때, 외부 저장 장치에 위치해 있기 때문에 OS의 IO 작업을 통해 Swap이 수행된다.
단, File System에 대한 데이터를 불러오는 IO 작업에는 공간 효율성을 고려하는 반면,
Swap Area에 대한 데이터에 대한 IO 작업은 시간 효율성을 고려하기 때문에 비교적 빠른 IO 작업이 일어난다.
가상 메모리
여러개의 프로그램을 실행시키고 싶지만, 메모리의 공간적 제약으로 인해서 Swap 영역과 빈번하게 IO 작업이 일어나면서 원하는 프로그램을 실행시켜야한다.
또, 서론에서 말한 것처럼, 물리 메모리의 크기를 벗어나는 프로세스라면 실행이 불가능하다.
가상 메모리를 사용하면 프로그램이 사용하지 않는 주소 영역은 제외하고, 필요한 내용만 물리 메모리에 로드한다.
프로세스 전체의 내용을 메모리에 올리지 않는다.
장점
- 사용자 프로그램이 물리 메모리의 제약에서 벗어날 수 있다.
- 효율적인 메모리 사용이 가능하다.
- 사용자 프로그램이 물리 메모리보다 크더라도, 필요한 페이지만 메모리에 로드하고 필요 없는 부분은 디스크에 둔다.
- 각 프로그램이 더 작은 메모리를 차지하기 때문에 더 많은 프로그램을 동시수행할 수 있다.
- 더 정확히는 더 많은 프로그램의 페이지를 수용할 수 있다. ( 동시에 수행하는 것은 실제로는 그만큼 빨리 프로세스간 스위칭이 일어난다는 것이다. )
- 프로세스 당 메모리 사용량이 줄어들어, 더 많은 프로세스에 대한 페이지를 메모리에 로드할 수 있다.
- 더 많은 프로세스를 수용할 수 있으므로, 프로세스에 대한 응답 시간이 줄어들고, CPU 이용률과 처리률이 증가한다.
- 프로그램을 메모리에 올리고 Swap 하는 IO 작업이 줄어든다.
- IO 작업이 감소함에 따라, 실행 속도가 증가한다.
요구 페이징 기법 Demand Paging
필요한 페이지만 메모리에 올리는 방법이다.
주소공간을 하나의 단위가 아닌, 여러개의 페이지로 나눈다.
그리고, 지금 당장 필요한 페이지만 메모리에 적재한다.
유-무효 비트
필요한 페이지가 물리 메모리에 로드되어 있는지는 유-무효 비트로 판단한다.
요구 페이징 기법에서, 필요한 페이지만 로드해야하는데, 필요한 페이지가 로드되어 있는지 판단할때 사용한다.
이 페이지의 비트값이 Valid라면, 해당 페이지가 메모리에 있음을 나타낸다.
이 페이지의 비트값이 Invalid라면, 해당 페이지가 메모리에 없음을 나타낸다. 이 경우, 페이지 폴트가 발생했다고 말한다.
만약, ( 요구 페이징 비법을 수행하기 위해서 필요한 페이지가 ) Invalid한 값을 가지고 있다면, 보조 저장 장치에 페이지가 있는지 확인한 후 해당 페이지를 가져온다.
이러한 유-무효 비트와 논리 주소, 물리 주소를 매핑하는 테이블을 페이지 테이블이라고 부른다.
아래 이미지에서 1번째 figure과 같은 논리 주소가 있고, 두번째 figure가 페이징 테이블, 그리고 세번째 figure가 물리 주소를 나타낸다.
레퍼런스
https://www.youtube.com/watch?v=5pEDL6c--_k
https://resilient-923.tistory.com/381
'CS' 카테고리의 다른 글
HashMap과 Red-Black Tree (0) | 2023.09.10 |
---|---|
BASE 속성, CAP 이론 그리고 PACELC 이론 (0) | 2023.09.05 |