가상메모리
물리적인 메모리 크기보다 큰 프로세스를 실행할 수 있도록 가상의 메모리 공간을 만드는 메모리 관리 기법
- 프로세스 전체가 메모리에 올라오지 않더라도 실행이 가능하도록 하는 기법이다.
- 실제로 이용 가능한 자원을 추상화하여 균일한 크기의 저장 공간으로 구성된 엄청나게 큰 배열로 추상화 시켜준다.
- 작은 크기의 물리적인 메모리로도 큰 가상 주소 공간을 제공해준다.
- 프로그램에 실제 메모리 주소인 물리 주소를 전달하지 않고 가상의 메모리 주소인 가상 주소(논리 주소)를 전달한다.
- 이후 가상 주소의 공간은 메모리 관리 장치(MMU, Memory Management Unit)에 의해 물리 주소로 변환된다.
- 일반적으로 MMU의 내부에 페이지 테이블이 있으며 이 페이지 테이블을 통해 물리 주소 변환을 수행한다.
가상메모리의 장점
- 메모리 크기의 제약이 자유로워져 물리 메모리보다 프로그램이 커져도 상관없다.
- 각 프로그램이 더 작은 메모리를 차지하므로 많은 프로그램들을 동시에 수행할 수 있지만, 응답시간은 늘어나지 않으면서 CPU 이용률과 처리율은 높아진다.
- 프로그램을 메모리에 올리고 swap 하는데 필요한 입/출력 횟수가 줄어든다. 이를 통해 프로그램들이 더욱 빨리 실행된다.
- 가상메모리 파일의 공유를 쉽게 해주고 공유 메모리 구현을 가능하게 한다.
- 프로세스의 생성을 효율적으로 처리할 수 있는 메커니즘을 제공한다.
가상메모리의 단점
- 구현의 난이도가 높다.
- 페이지 스왑이나 Page Fault가 너무 자주 발생하는 경우 현저한 성능 저하가 발생할 수 있다.
요구 페이징
필요한 프로그램만 메모리에 적재하는 방법
- 가상메모리 시스템에서 많이 사용되며, 프로세스를 페이지 단위로 나누어 실행에 필요한 부분과 필요하지 않은 부분을 나누고 당장 실행에 필요한 페이지만 메모리에 적재하는 방법이다.
- 현재 실행이 필요하지 않은 페이지는 Backing store에 저장하고, 실행이 필요할 때 메모리에 올린다.
요구 페이징의 장점
- 메모리 효율성
- 물리적인 메모리 공간은 최대한 아끼며, 필요한 페이지만 메모리에 적재하기 때문에 메모리 공간 사용이 효율적이다.
- 프로세스 실행 속도
- 필요한 페이지만 적재하므로 한꺼번에 많은 페이지를 메모리에 올리지 않기 때문에 실행 속도가 빠르다.
- 대용량 메모리 지원
- 가상 메모리를 사용하므로 물리적인 메모리보다 큰 용량도 지원이 가능하다.
- 프로세스 독립성
- 각각의 프로세스는 독립된 가상 주소 공간을 가진다. 따라서 서로의 메모리에 영향을 미치지 않기 때문에 안정성과 보안성을 가진다.
- 유연한 메모리 할당
- 페이지 단위로 메모리 할당이 되기 때문에 메모리 공간 할당이 유연하다.
- 높은 처리량
- 필요한 페이지만 메모리에 올리므로 전반적인 데이터 I/O 작업이 줄어들어 처리량이 전반적으로 높아진다.
요구 페이징의 작동 원리
- 프로세스 실행
- 프로세스 실행 시, 운영체제가 해당 프로세스의 가상 주소 공간을 만든다.
- 필요한 페이지들만 물리적인 메모리에 적재하고 그 외의 페이지들은 모두 가상 주소 공간에 존재한다.
- Page Fault 발생 시
- 프로세스는 실행 중이지만 필요한 페이지가 메모리에 없으면 발생하는 오류이다.
- 운영체제는 해당 페이지를 Backing store에서 물리적인 메모리로 적재한다.
- 페이지 교체
- 새로운 페이지를 로드해야 할 때 메모리 공간이 부족하다면 가장 오랫동안 사용되지 않은 페이지를 다시 Backing store로 옮기고 새로운 페이지를 적재하는 방식을 사용한다.
- 페이지 교체 알고리즘
- 페이지 교체를 할 때, 어떤 페이지를 교체할지 결정하는 알고리즘이다.
- 대표적으로 LRU(Least Recently Used) 알고리즘이 있다.
- 페이지 적재 시점
- 페이지가 처음에 메모리에 적재될 때, 페이지 테이블에 해당 페이지가 메모리에 적재되었다는 정보를 저장한다.
- 이후 해당 페이지를 참조할 때 마다 페이지 테이블을 검색하여 메모리 적재 여부를 판단하고 존재하지 않는다면 Page Fault를 발생시킨다.
- 페이지 BackStore 저장
- 메모리에 적재되지 않은 페이지들은 모두 Backing store에 저장된다.
- Backing store에서 Swap File이라는 특수한 형태의 파일에 저장된다.
Page Fault
페이지 부재라고 불리며, 페이지가 메모리에 존재하지 않을 때 발생하는 오류이다.
- 운영체제는 각 프로세스에 대해 하나의 페이지 테이블을 가진다.
- 페이지 테이블에는 해당 가상 페이지를 물리적 메모리의 어느 위치(프레임)에 매핑하는 정보와 valid-invalid bit가 존재한다.
- 이 비트값이 v(valid, 1)이라면 해당 페이지는 물리 메모리에 적재되어 있다는 의미이고, i(invalid, 0)이라면 해당 페이지는 물리 메모리에 존재하지 않는다는 의미이다.
- 즉, 비트값이 i인 경우 Page Fault가 발생했다고 한다.
- Page Fault는 발생 횟수가 많을 수록 시스템의 성능이 저하되므로 페이지 교체 알고리즘을 최적화하여 발생 횟수를 줄이는 것이 중요하다.
Page Fault 과정
- 페이지 테이블을 통해 페이지가 i라면 MMU가 OS에게 요청하여 Page Fault Trap을 발생시킨다.
- Page Fault Trap이 발생하여 OS는 PCB에 존재하는 내부 테이블을 체크하여 참조할 수 없는 곳을 참조하는 부적절한 참조라면 프로세스를 중지시킨다. 그렇지 않고 메모리에만 존재하지 않는 상태라면 Backing store에 페이지가 존재하는지 확인한다.
- 만약 Backing store에 값이 있다면 4번 동작 과정으로 넘어간다.
- Backing store에서 필요한 페이지를 가져와 물리 메모리 공간에 비어있는 프레임으로 저장한다.
- 이때, 만약 물리 메모리 공간의 프레임에 빈 공간이 없다면 페이지 교체 알고리즘을 통해 교체할 페이지를 골라 페이지를 교체한다.
- 페이지 테이블을 리셋하여 i 데이터를 v로 수정한다.
- 프로세스를 재실행한다.
Pure Demand Paging(순수 요구 페이징)
메모리의 페이지를 하나도 가지지 않은 상태로 프로세스를 실행하는 것
- 프로세스 실행 초기에 Page Fault가 계속 발생하게 된다.
Thrashing 현상
너무 많은 Page Fault가 발생하여 시스템 성능 저하가 심각해지는 것
세그멘테이션
물리적인 고정 크기로 분할하는 페이징과 다르게 프로그램을 논리적인 내용 단위로 프로세스의 메모리 공간을 분리하는 기법
- 논리적인 내용 단위는 대표적으로 method, function, object, stack 등 함수 단위 혹은 코드, 전역 변수, 힙 등으로도 구분지어 나눌 수 있다.
- 일반적으로 논리 내용 단위로 자르기 때문에 크기가 같지 않다.
- 세그멘테이션으로 분리된 단위들은 세그먼트라고 한다.
- 각각의 세그먼트별 크기가 다르기 때문에 외부 단편화 문제가 발생할 가능성이 있다.
외부 단편화
세그멘테이션은 논리적인 단위로 나뉘기 때문에 세그먼트의 크기가 다양하고, 이로 인해 다양한 크기의 hole이 발생한다.
- 다양한 크기의 hole이 발생하지만, hole에 완벽하게 세그먼트들을 할당하는 최적화 알고리즘이 존재하지 않기 때문에 메모리 낭비가 크게 발생하는 현상이다.
세그먼트 테이블
세그먼트의 번호와 시작 주소, 크기를 갖는 테이블
- 세그먼트가 일정한 크기를 갖지 않기 때문에 크기에 대한 데이터가 있는 형태를 갖는다.
- CPU는 해당 세그먼트의 크기를 넘어서는 주소가 들어오면 인터럽트를 발생시켜 프로세스를 강제 종료한다.
- 논리적인 주소값으로 s(세그먼트 번호), d(오프셋)에 해당하는 값을 입력받고 d와 limit[s]을 비교하여 전자가 더 클 때 인터럽트를 발생시킨다.
- ex) 논리 주소 (1, 500) / base[1]: 6300 limit[1]: 400
- ⇒ 500 > 400, 인터럽트 발생
- base[s] + d는 물리 주소를 의미한다.