가상 메모리
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
가상 메모리는 컴퓨터의 주 메모리(RAM)를 확장하여 프로그램이 더 많은 메모리를 사용할 수 있게 해주는 기술이다. 1940년대와 50년대에 오버레이와 같은 기술의 한계를 극복하기 위해 도입되었으며, 멀티프로그래밍과 멀티태스킹을 가능하게 했다. 가상 메모리는 1956년 프리츠 루돌프 귄츠에 의해 처음 개념이 제시되었으나, 최초의 진정한 가상 메모리 시스템은 1960년대 초 맨체스터 대학교의 아틀라스 컴퓨터에 구현되었다. 이후 인텔 80286 프로세서와 x86 아키텍처에 도입되었으며, 페이지 테이블, MMU, TLB와 같은 구성 요소들을 통해 구현된다. 가상 메모리는 페이징, 세그먼트, 스와핑 등의 구현 방식을 가지며, 스래싱, 단편화와 같은 문제점도 존재한다.
더 읽어볼만한 페이지
- 가상 메모리 - 메모리 관리 장치
메모리 관리 장치(MMU)는 가상 주소를 물리 주소로 변환하여 메모리 접근을 관리하고 보호하는 하드웨어 장치로서, 가상 메모리 시스템에서 독립적인 가상 주소 공간을 제공하고 불법적인 메모리 접근을 차단하며, 페이지 테이블을 통해 외부 단편화 문제를 완화하고 트랜슬레이션 룩어사이드 버퍼(TLB)로 주소 변환 속도를 향상시킨다. - 가상 메모리 - 가상 주소 공간
가상 주소 공간은 운영 체제가 프로세스에 제공하는 논리적인 메모리 공간으로, 실제 물리 메모리 주소와 독립적으로 관리되며, 프로세스는 이 공간을 통해 실행 파일, DLL 파일, 페이지 파일 등을 매핑하고 메모리를 할당받는다. - 컴퓨터 시스템 - 마이크로프로세서
마이크로프로세서는 CPU 기능을 단일 IC에 통합한 것으로, 무어의 법칙에 따라 성능이 향상되어 왔으며 다양한 아키텍처와 기술 발전을 거쳐 현재 광범위한 분야에서 사용된다. - 컴퓨터 시스템 - 아두이노
아두이노는 Atmel AVR 마이크로컨트롤러 기반의 오픈 소스 하드웨어 플랫폼으로, C 언어와 유사한 스케치를 통해 프로그래밍이 가능하며, 다양한 플러그인 쉴드를 이용해 기능을 확장할 수 있어 교육, 시제품 제작, IoT 개발 등에 활용된다.
가상 메모리 | |
---|---|
일반 정보 | |
유형 | 메모리 관리 기술 |
구현 | 하드웨어 및 운영 체제 |
사용 | 대부분의 현대적인 운영 체제 |
작동 원리 | |
핵심 아이디어 | 실제 물리적 메모리보다 더 큰 주소 공간 제공 |
방법 | 페이징 세그멘테이션 |
지원 요소 | 메모리 관리 장치 (MMU) 페이지 테이블 스와핑 |
장점 | |
주소 공간 확장 | 각 프로세스가 사용 가능한 물리적 메모리 양보다 큰 주소 공간을 가질 수 있음 |
메모리 공유 | 여러 프로세스가 메모리를 공유 가능 |
메모리 보호 | 각 프로세스가 다른 프로세스의 메모리에 접근하는 것을 방지 |
단점 | |
성능 저하 | 페이지 폴트 발생 시 스와핑으로 인한 성능 저하 가능 |
복잡성 증가 | 메모리 관리의 복잡성 증가 |
역사 | |
개발 시기 | 1960년대 |
초기 시스템 | 아틀라스 IBM 시스템/360 모델 67 |
관련 용어 | |
관련 기술 | 오버레이 메모리 관리 페이징 세그멘테이션 |
관련 하드웨어 | 메모리 관리 장치 (MMU) |
2. 역사
가상 메모리 기술이 개발되기 전인 1940년대부터 1950년대의 프로그래머들은 주 기억 장치(RAM)와 보조 기억 장치(자기 디스크 장치 또는 자기 드럼 메모리)를 직접 관리해야 했으며, 대규모 프로그램에서는 오버레이 같은 기술을 사용해야 했다.[48] 가상 메모리는 주 기억 장치를 확장할 뿐만 아니라, 프로그래머가 이러한 확장을 쉽게 다룰 수 있도록 도입되었다.[48]
1960년대와 70년대 초반에 컴퓨터 메모리는 매우 비쌌기 때문에, 가상 메모리의 도입은 실제 메모리가 적은 컴퓨터에서도 큰 메모리를 요구하는 소프트웨어를 실행할 수 있게 해주는 획기적인 발전이었다. 이는 비용 절감 효과를 가져와 모든 시스템에 가상 메모리를 도입하는 강력한 동기가 되었다. 또한 가상 주소 공간을 제공함으로써 보안 및 신뢰성을 향상시켜 시장에서 가상 메모리의 매력을 더욱 높였다.
1969년, 데이비드 세이어가 이끄는 IBM 연구팀은 가상 메모리 시스템이 수동 제어 시스템보다 더 낫다는 것을 증명하면서 상용 컴퓨터에서 가상 메모리에 대한 논쟁을 종식시켰다.[22] 1970년대에 IBM 370 시리즈는 가상 저장소를 기반으로 하는 운영 체제를 실행하여 기업 사용자가 여러 개의 구형 시스템을 더 적은 수의 강력한 메인프레임으로 이전할 수 있도록 지원했다.
하지만, 가상 메모리가 주류 운영 체제에 구현되기 전에는 여러 문제들이 있었다. 동적 주소 변환에는 특수한 하드웨어가 필요했고, 초기 구현에서는 메모리 접근 속도가 느려졌다.[8] 또한 보조 저장소를 활용하는 새로운 시스템 전체 알고리즘이 기존의 애플리케이션별 알고리즘보다 덜 효과적일 것이라는 우려도 있었다.
가상 메모리를 지원하는 대부분의 최신 운영 체제는 각 프로세스를 자체 전용 주소 공간에서 실행하여 각 프로그램이 가상 메모리에 단독으로 접근하는 것처럼 보이게 한다. 그러나 OS/VS1, OS/VS2 SVS 등 일부 구형 운영 체제와 IBM i 등 최신 운영 체제는 가상화된 메모리로 구성된 단일 주소 공간에서 모든 프로세스를 실행하는 단일 주소 공간 운영 체제이다.
임베디드 시스템과 같이 매우 빠르거나 일관된 응답 시간을 요구하는 특수 목적 컴퓨터 시스템은 결정성 감소 때문에 가상 메모리를 사용하지 않을 수 있다. 가상 메모리 시스템은 예측할 수 없는 트랩을 발생시켜 입력에 대한 지연을 유발할 수 있으며, 특히 데이터를 보조 메모리에서 주 메모리로 읽어 와야 하는 경우 더욱 그렇다. 또한 가상 주소를 물리적 주소로 변환하는 하드웨어는 구현에 상당한 칩 영역이 필요하며, 모든 임베디드 시스템 칩이 이 하드웨어를 포함하는 것은 아니기 때문에 일부 시스템에서는 가상 메모리를 사용하지 않는다.
2. 1. 초기 개념 및 발전
1940년대와 1950년대에는 모든 대형 프로그램들이 오버레이와 같은, 1차 및 2차 기억 장치를 위한 로직을 포함해야 했다.[79] 가상 메모리는 주 메모리를 확장할 뿐만 아니라, 프로그래머가 이러한 확장을 쉽게 사용할 수 있도록 하기 위해 도입되었다.[79] 멀티프로그래밍과 멀티태스킹을 허용하기 위해, 많은 초기 시스템들은 가상 메모리 없이 여러 프로그램들 사이에 메모리를 나누었으며, PDP-10 초기 모델이 레지스터를 경유하여 메모리를 나누는 방식을 예로 들 수 있다.가상 메모리의 개념은 1956년 베를린 공과대학교에서 독일의 물리학자 프리츠 루돌프(Fritz-Rudolf Güntsch)가 처음 개발하였다.[80][81] 그는 《Logical Design of a Digital Computer with Multiple Asynchronous Rotating Drums and Automatic High Speed Memory Operation》이라는 박사 논문에서 6개의 100 워드 블록의 1차 코어 메모리 및 1,000개의 100 워드 블록의 주소 공간, 1차 메모리와 2차 드럼 메모리 간에 블록을 자동으로 이동하는 하드웨어를 갖춘 머신을 기술하였다.[80][81]
페이징은 160,000 워드의 1차 코어 메모리를 추가적인 96,000 워드의 2차 드럼 메모리와 병합함으로써 아틀라스 컴퓨터의 작업 메모리를 확장하는 방법의 하나로 맨체스터 대학교에서 최초로 구현되었다. 최초의 아틀라스는 1962년에 도입되었지만 작업 중인 페이징 견본은 1959년에 개발되었다.[79][82][83] 1961년, 버로프사는 페이징 대신 세그멘테이션을 지원하는 B5000이라는 독자적으로 가상 메모리를 갖춘 최초의 상용 컴퓨터를 출시하였다.[84][85]
1960년대와 70년대 초반에 컴퓨터 메모리는 매우 비쌌다. 가상 메모리의 도입은 큰 메모리 요구 사항이 있는 소프트웨어 시스템이 실제 메모리가 적은 컴퓨터에서 실행될 수 있는 기능을 제공했다. 이로 인한 절감 효과는 모든 시스템에 가상 메모리로 전환하는 강력한 인센티브를 제공했다. 가상 주소 공간을 제공하는 추가 기능은 보안과 신뢰성의 또 다른 수준을 추가하여 가상 메모리를 시장에서 더욱 매력적으로 만들었다.
가상 메모리를 지원하는 대부분의 최신 운영 체제는 각 프로세스를 자체 전용 주소 공간에서 실행한다. 따라서 각 프로그램은 가상 메모리에 대한 단독 액세스 권한을 갖는 것처럼 보인다. 그러나 일부 구형 운영 체제(예: OS/VS1 및 OS/VS2 SVS)와 최신 운영 체제(예: IBM i)는 가상화된 메모리로 구성된 단일 주소 공간에서 모든 프로세스를 실행하는 단일 주소 공간 운영 체제이다.
매우 빠르고/또는 매우 일관된 응답 시간을 요구하는 임베디드 시스템 및 기타 특수 목적 컴퓨터 시스템은 감소된 결정성으로 인해 가상 메모리를 사용하지 않도록 선택할 수 있다. 가상 메모리 시스템은 예측할 수 없는 트랩을 트리거하여 입력에 대한 원치 않고 예측할 수 없는 지연을 생성할 수 있으며, 특히 트랩에서 데이터를 보조 메모리에서 주 메모리로 읽어 와야 하는 경우 더욱 그렇다. 가상 주소를 물리적 주소로 변환하는 하드웨어는 일반적으로 구현하는 데 상당한 칩 영역이 필요하며, 임베디드 시스템에 사용되는 모든 칩이 해당 하드웨어를 포함하는 것은 아니며, 이는 이러한 시스템 중 일부가 가상 메모리를 사용하지 않는 또 다른 이유이다.
1960년대 메인프레임 컴퓨터와 1980년대 초중반의 개인용 컴퓨터(예: DOS)와 같은 구형 운영 체제는 일반적으로 가상 메모리 기능이 없었지만, 1960년대 메인프레임의 주목할 만한 예외는 다음과 같다.
- Atlas용 Atlas Supervisor
- Electrologica X8용 THE multiprogramming system (하드웨어 지원 없는 소프트웨어 기반 가상 메모리)
- Burroughs B5000용 MCP
- IBM System/360 Model 67용 MTS, TSS/360 및 CP/CMS
- GE 645용 Multics
- RCA Spectra 70/46용 Time Sharing Operating System
2. 2. 상용화 및 확산
가상 메모리는 1950년대 후반부터 여러 연구자들에 의해 개발되기 시작했다. 1956년 독일의 물리학자 프리츠-루돌프 귄치는 베를린 공과대학교에서 쓴 박사 학위 논문에서 가상 메모리의 개념을 제안했다. 하지만 귄치의 제안은 실제 구현으로 이어지지 않았고, 주소 매핑 방식이 아닌 캐시 메모리 형태에 가까웠다.최초의 진정한 가상 메모리 시스템은 맨체스터 대학교에서 아틀라스 컴퓨터를 위해 개발되었다. 이 시스템은 페이징 기법을 사용하여 16,384 단어의 1차 코어 메모리와 98,304 단어의 2차 드럼 메모리를 결합하여 프로그래머에게 더 큰 가상 주소 공간을 제공했다.[13] 첫 번째 아틀라스는 1962년에 가동되었지만, 페이징의 작동 프로토타입은 1959년에 이미 개발되었다.[8][15][16]
1961년, 버로스는 세그멘테이션을 사용하는 최초의 상용 가상 메모리 컴퓨터인 B5000을 출시했다.[84][85] 1965년에는 MIT가 개발한 Multics를 통해 가상 메모리가 본격적으로 채택되기 시작했다.
1970년, IBM은 System/370 시리즈의 OS인 DOS/VS, OS/VS1, OS/VS2 (후의 MVS)에서 가상 메모리를 지원했다. 이후 각 회사 메인 프레임에서 가상 메모리가 일반화되었다.
미니컴퓨터에서 처음으로 가상 메모리를 도입한 것은 노르웨이의 NORD-1이다(1969년). 1976년, DEC의 미니 컴퓨터 VAX 시리즈의 OS인 VMS에서 가상 메모리를 지원했다.
x86 아키텍처에서 가상 메모리가 도입된 것은 인텔 80286의 프로텍트 모드가 최초이지만, 세그먼트 단위 스와핑은 세그먼트가 커지면 성능이 저하되는 문제가 있었다. 인텔 80386에서는 기존 세그먼트 방식 아래에 페이징 방식을 구현하여 페이지 폴트에 의한 페이징이 가능해졌다. 그러나 세그먼트 디스크립터 로드는 시간이 걸리는 처리여서 OS 설계자는 세그먼트를 사용하지 않고 페이징만 사용하게 되었다. 가상 메모리가 도입된 것은 OS/2(1987년), Microsoft Windows 3.0(1990년), Macintosh의 System 7(1991년), 리눅스 커널 0.11+VM (1991년) 등이 최초이다.
3. 구현 방식
가상 메모리 구현 방식에는 크게 세그먼트 방식과 페이징 방식 두 가지가 있다. 일반적으로 페이징 방식이 더 많이 사용된다.
68000 시스템에서는 68451(세그먼트 방식)과 68851(페이징 방식)의 메모리 관리 유닛(MMU)이 제공되었다.
일부 운영 체제는 페이징 및 세분화 기능 외에도 전체 주소 공간을 스와핑하는 기능을 제공한다. 이 경우 운영 체제(OS)는 현재 실제 메모리에 있는 페이지와 세그먼트를 스왑 파일에 기록한다. 스왑인 시 OS는 스왑 파일에서 데이터를 다시 읽어 오지만, 스왑 아웃 작업 당시 페이징된 페이지를 자동으로 다시 읽어 오지는 않는다.[44]
OS/VS2 릴리스 2부터 z/OS까지의 IBM MVS는 주소 공간을 스왑할 수 없도록 표시하는 기능을 제공한다. 주소 공간 속성의 특정 변경[42]은 OS가 SYSEVENT TRANSWAP를 사용하여 이를 스왑 아웃한 다음 다시 스왑 인해야 한다.[43]
여러 작업이 동일한 저장 영역에서 스왑인 및 스왑아웃되는 경우처럼, 스와핑은 반드시 메모리 관리 하드웨어를 필요로 하지 않는다.
Windows 계열 OS 중 NT 계열에서는 페이징 방식의 가상 메모리를 채택하고 있으며, 시스템 UI 상에서는 "가상 메모리"라는 이름의 설정 항목이 있지만, 이 설정 항목은 페이징 파일(스토리지로의 메모리 스왑)에 관한 것이다.
3. 1. 페이징 방식
페이징은 현재 대부분의 가상 메모리 구현에서 사용되는 방식이다. 가상 주소 공간을 페이지라고 불리는 연속된 블록으로 나누며, 각 페이지는 일반적으로 최소 4킬로바이트 크기를 가진다. 가상 주소 범위나 실제 메모리 용량이 큰 시스템은 더 큰 페이지 크기를 사용하기도 한다.[24]페이지 테이블은 응용 프로그램에서 사용하는 가상 주소를 실제 물리 주소로 변환하는 데 사용된다.[25] 이 변환을 처리하는 하드웨어를 메모리 관리 장치라고 부른다. 페이지 테이블의 각 항목에는 해당 페이지가 실제 메모리에 있는지 여부를 나타내는 플래그가 있다. 실제 메모리에 있다면, 페이지 테이블 항목은 페이지가 저장된 실제 메모리 주소를 포함한다. 페이지 참조 시 해당 페이지 테이블 항목이 실제 메모리에 없으면, 하드웨어는 페이지 폴트 예외를 발생시켜 운영 체제의 페이징 슈퍼바이저를 호출한다.
시스템은 전체 시스템에 대한 하나의 페이지 테이블, 각 주소 공간/프로세스에 대한 별도 페이지 테이블, 각 세그먼트에 대한 별도 페이지 테이블 등을 가질 수 있다. 페이지 테이블이 하나만 있으면 여러 애플리케이션이 동시에 실행될 때 단일 가상 주소 범위의 다른 부분을 사용한다. 여러 페이지/세그먼트 테이블이 있으면 여러 가상 주소 공간과 별도 페이지 테이블을 가진 동시 애플리케이션이 다른 실제 주소로 리디렉션된다.
SDS 940처럼 실제 메모리가 작은 이전 시스템에서는 페이지 테이블 대신 ''페이지 주소 레지스터''를 사용하여 주소 변환을 했다.
운영 체제는 페이지 테이블과 사용 가능한 페이지 프레임 목록을 관리한다. 페이지 폴트를 빠르게 해결하기 위해 충분한 사용 가능한 페이지 프레임이 있는지 확인하기 위해, 페이지 교체 알고리즘 (예: 최근 사용 알고리즘)을 사용하여 할당된 페이지 프레임을 주기적으로 뺏을 수 있다. 수정된 뺏긴 페이지 프레임은 보조 저장 장치에 다시 기록된 후 사용 가능한 큐에 추가된다.
일반적으로 해결할 수 없는 페이지 폴트는 응용 프로그램의 비정상적인 종료를 유발한다. 그러나 일부 시스템에서는 응용 프로그램이 이러한 오류에 대한 예외 처리기를 가질 수 있다. 페이징 슈퍼바이저는 페이지 폴트 예외를 다음과 같이 처리할 수 있다.
- 가상 주소가 유효하지 않으면 오류로 처리한다.
- 페이지가 유효하고 페이지 정보가 MMU에 로드되지 않았으면 페이지 레지스터 중 하나에 저장한다.
- 페이지가 초기화되지 않았으면 새 페이지 프레임을 할당하고 지울 수 있다.
- 원하는 페이지를 포함하는 뺏긴 페이지 프레임이 있으면 해당 페이지 프레임을 재사용한다.
- 쓰기 시도가 읽기 보호된 페이지에 이루어져 폴트가 발생했고, copy-on-write 페이지이면 사용 가능한 페이지 프레임을 할당하고 이전 페이지의 내용을 복사한다. 그렇지 않으면 오류로 처리한다.
- 가상 주소가 메모리 맵 파일 또는 페이징 파일의 유효한 페이지이면 사용 가능한 페이지 프레임을 할당하고 해당 페이지를 읽어 들인다.
대부분의 경우 페이지 테이블이 업데이트된 후 변환 색인 버퍼를 비우고 예외를 발생시킨 명령을 다시 시작한다. 사용 가능한 페이지 프레임 큐가 비어 있으면, 페이징 슈퍼바이저는 페이지 뺏기에 동일한 페이지 교체 알고리즘을 사용하여 페이지 프레임을 해제해야 한다.
페이징 방식에서는 가상 주소를 나타내는 비트 열의 하위 부분은 그대로 물리 주소의 하위 부분으로 사용된다. 상위 비트 열 부분은 주소 변환 테이블의 키로 사용되어 실제 물리 주소의 상위 비트 부분을 얻는다. 크기가 2의 거듭제곱인 가상 주소 공간의 연속적인 주소 범위는 대응하는 연속적인 물리 주소 범위로 변환된다. 이러한 범위를 '''페이지'''라고 부른다. 페이지 크기는 512바이트에서 8192바이트가 일반적이며, 4096바이트가 가장 많이 사용된다. 특수한 경우 4MB 이상의 페이지도 사용될 수 있다.
운영 체제는 페이지 테이블에 가상 페이지 번호와 물리 페이지 번호의 매핑 정보를 저장한다. 페이지를 사용할 수 없는 경우(물리 메모리에 대응하지 않거나 스왑 영역에 내용이 있는 경우), CPU가 해당 페이지 내의 메모리 위치를 참조하려 할 때 하드웨어는 운영 체제에 페이지 폴트 예외를 통지한다. 그러면 실행 컨텍스트는 운영 체제 내의 예외 처리 루틴으로 점프한다. 페이지가 스왑 영역에 있다면, "페이지 스왑" 처리를 통해 필요한 페이지의 내용을 물리 메모리로 읽어들인다.
페이지 스왑은 다음 단계를 거친다.
1. 메모리상의 페이지를 선택한다. (최근에 접근되지 않았고, 변경되지 않은 페이지 등)
2. 해당 페이지가 변경되었다면 스왑 영역에 내용을 기록한다.
3. 필요한 페이지의 정보를 읽어들인다.
4. 페이지 읽기가 완료되면 가상 주소-물리 주소 변환 테이블을 갱신한다.
5. 예외 처리를 완료하고 원래 프로그램 실행을 재개한다.
가상 페이지에 아무것도 할당되지 않아 사용 불가 상태일 수도 있다. 이 경우, 미사용 또는 스왑 아웃된 물리 페이지를 할당하고, OS에 따라 내용을 제로 클리어한다. 페이지 테이블은 이에 대응하여 갱신되고, 프로그램이 재개된다.
Windows 계열 OS 중 #Windows NT 계열에서는 페이징 방식의 가상 메모리를 채택하고 있으며, 시스템 UI 상에서는 "가상 메모리"라는 이름의 설정 항목이 있지만, 이 설정 항목은 페이징 파일(스토리지로의 메모리 스왑)에 관한 것이다.
3. 2. 세그먼트 방식
버로스 B5000[52] 등의 시스템은 페이징 방식이 아닌 세그먼트 방식을 사용하여 가상 주소 공간을 가변 길이 세그먼트로 분할한다. 이 경우, 가상 주소는 세그먼트 번호와 세그먼트 내 오프셋으로 구성된다. 인텔 80286의 보호 모드에도 그러한 세그먼트 방식이 있었지만, 거의 사용되지 않았다. 세그먼트와 페이지는 세그먼트를 페이지로 분할하는 형태로 동시에 사용할 수 있다. 그러한 메모리 구성의 시스템으로 Multics나 System/38이 있다. 이 경우의 기본은 페이징이며, 세그먼트는 메모리 보호에 사용된다.[53][54][55]인텔 80386과 그 이후의 IA-32 프로세서에서는 세그먼트를 페이지화된 32비트의 리니어 주소 공간에 배치한다. 세그먼트에 의한 관리와 페이지 단위에 의한 관리, 2단계 시스템이 된다. 그러나, 복수의 세그먼트를 활용하고 있는 OS는 적고, 단순하게 베이스 주소를 전부 0으로 하고 범위만을 지정한 최소한 필요한 만큼의 세그먼트와 페이징만을 사용하고 있는 경우가 많다.
벌로스 B5500,[30] 그리고 현재의 유니시스(Unisys) MCP 시스템[31]은 페이징 대신 세분화를 사용하여 가상 주소 공간을 가변 길이 세그먼트로 나눈다. 세분화를 사용하면 할당된 메모리 블록을 컴퓨터의 물리적 관점이 아닌 프로그램의 논리적 요구 사항 및 요청과 일치시킬 수 있지만, 페이지 자체는 메모리의 인위적인 구분이다. B5000의 설계자들은 페이지의 인위적인 크기가 프로크루스테스의 침대와 같다고 생각했을 것이며, 이는 나중에 B1000의 정확한 데이터 크기에 사용하게 될 이야기이다.[32]
벌로스와 유니시스 시스템에서 각 메모리 세그먼트는 마스터 디스크립터로 설명되는데, 이는 다른 상대적(복사) 디스크립터에 의해 참조될 수 있는 단일 절대 디스크립터이며, 프로세스 내 또는 프로세스 간에 공유를 수행한다. 디스크립터는 MCP 시스템에서 가상 메모리 작동의 핵심이다. 디스크립터는 세그먼트의 주소뿐만 아니라 세그먼트 길이와 ‘p-비트’ 또는 ‘존재 비트’로 표시되는 가상 메모리의 상태를 포함하며, 이는 주소가 주 메모리의 세그먼트인지 보조 스토리지 블록인지를 나타낸다. 비거주 세그먼트(p-비트가 꺼짐)에 접근하면 주어진 주소에서 보조 스토리지로부터 세그먼트를 로드하기 위해 인터럽트가 발생하거나, 주소 자체가 0인 경우 새 블록을 할당한다. 후자의 경우 디스크립터의 길이 필드를 사용하여 해당 길이의 세그먼트를 할당한다.
세분화 방식을 사용할 때 스래싱의 또 다른 문제는 체커보딩[33]인데, 이는 모든 사용 가능한 세그먼트가 새 세그먼트 요청을 충족하기에는 너무 작아지는 경우이다. 해결책은 메모리 압축을 수행하여 사용된 모든 세그먼트를 함께 묶고 더 많은 세그먼트를 할당할 수 있는 큰 사용 가능한 블록을 만드는 것이다. 각 세그먼트에 대해 단일 마스터 디스크립터가 있으므로, 모든 사본이 마스터 디스크립터를 참조하므로 새 블록 주소는 단일 디스크립터에서만 업데이트하면 된다.
페이징은 단편화로부터 자유롭지 않으며, 단편화는 페이지 내에서 발생한다(내부 단편화). 요청된 블록이 페이지보다 작으면 페이지의 일부 공간이 낭비된다. 블록이 페이지보다 크면 다른 페이지에 작은 영역이 필요하므로 많은 공간이 낭비된다. 따라서 단편화는 특정 페이지 크기에 맞게 프로그램을 왜곡할 수 있는 프로그래머에게 전달되는 문제가 된다. 세분화를 사용하면 단편화는 세그먼트 외부에 있으며(외부 단편화) 따라서 시스템 문제이며, 이는 가상 메모리의 최초 목표인 프로그래머가 이러한 메모리 고려 사항에서 벗어나도록 하는 것이었다. 다중 처리 시스템에서 시스템의 최적 작동은 언제든지 독립적인 프로세스의 혼합에 따라 달라진다. 세분화와 페이징의 하이브리드 방식을 사용할 수 있다.
인텔 80286은 유사한 세분화 방식을 옵션으로 지원하지만, 거의 사용되지 않는다.
인텔 80386 및 이후의 IA-32 프로세서에서 세그먼트는 32비트 선형, 페이징된 주소 공간에 있으며, 세그먼트는 해당 공간 안팎으로 이동할 수 있고 페이지는 주 메모리 안팎으로 "페이징"할 수 있다. 이는 두 가지 수준의 가상 메모리를 제공한다. 운영 체제는 페이징만 사용한다. 초기 하드웨어 지원이 없는 x86 가상화 솔루션은 페이징과 세분화를 결합했는데, x86 페이징은 두 개의 보호 도메인만 제공하는 반면, VMM, 게스트 OS 또는 게스트 애플리케이션 스택은 세 개가 필요하기 때문이다.[37] 페이징 및 세분화 시스템 간의 차이점은 메모리 분할에만 있는 것이 아니다. 세분화는 메모리 모델 의미론의 일부로서 사용자 프로세스에 표시된다. 따라서 단일 큰 공간처럼 보이는 메모리 대신 여러 공간으로 구성된다.
이러한 차이는 중요한 결과를 가져온다. 세그먼트는 가변 길이의 페이지 또는 주소 공간을 늘리는 간단한 방법이 아니다. 프로세스 메모리와 파일 시스템 간의 차이가 없는 단일 레벨 메모리 모델을 제공할 수 있는 세분화는 프로세스의 잠재적 주소 공간에 매핑된 세그먼트(파일) 목록으로 구성된다.[38]
이는 mmap 및 Win32의 MapViewOfFile과 같은 호출에서 제공하는 메커니즘과 동일하지 않다. 왜냐하면 파일을 반 임의적인 위치에 매핑할 때 파일 간 포인터가 작동하지 않기 때문이다. Multics에서 파일(또는 다중 세그먼트 파일의 세그먼트)은 주소 공간의 세그먼트로 매핑되므로 파일은 항상 세그먼트 경계에서 매핑된다. 파일의 연결 섹션에는 포인터가 포함될 수 있으며, 레지스터에 포인터를 로드하거나 이를 통해 간접 참조를 수행하려고 하면 트랩이 발생한다. 해결되지 않은 포인터는 포인터가 참조하는 세그먼트의 이름과 세그먼트 내의 오프셋을 나타낸다. 트랩의 처리기는 세그먼트를 주소 공간에 매핑하고, 세그먼트 번호를 포인터에 넣고, 포인터의 태그 필드를 변경하여 더 이상 트랩이 발생하지 않도록 하고, 트랩이 발생한 코드로 돌아가 트랩을 발생시킨 명령을 다시 실행한다.[39] 이로 인해 링커가 완전히 필요 없어지고[8], 서로 다른 프로세스가 동일한 파일을 개인 주소 공간의 다른 위치에 매핑할 때 작동한다.[40]
3. 3. 스와핑 (Swapping)
일부 운영 체제는 페이징 및 세분화 기능 외에도 전체 주소 공간을 스와핑하는 기능을 제공한다. 이 경우 OS는 현재 실제 메모리에 있는 페이지와 세그먼트를 스왑 파일에 기록한다. 스왑인 시 OS는 스왑 파일에서 데이터를 다시 읽어 오지만, 스왑 아웃 작업 당시 페이징된 페이지를 자동으로 다시 읽어 오지는 않는다.[44]OS/VS2 릴리스 2부터 z/OS까지의 IBM의 MVS는 주소 공간을 스왑할 수 없도록 표시하는 기능을 제공한다. 그렇게 하더라도 주소 공간의 페이지가 고정되지 않는다. 이는 적격한[41] 메인 프로그램의 이름을 스왑 불가능 플래그와 함께 프로그램 속성 테이블에 입력하여 작업 기간 동안 수행할 수 있다. 또한 권한 있는 코드는 SYSEVENT 감독자 호출 명령어 (SVC)를 사용하여 주소 공간을 일시적으로 스왑할 수 없도록 만들 수 있다. 주소 공간 속성의 특정 변경[42]은 OS가 SYSEVENT TRANSWAP를 사용하여 이를 스왑 아웃한 다음 다시 스왑 인해야 한다.[43]
예를 들어 여러 작업이 동일한 저장 영역에서 스왑인 및 스왑아웃되는 경우 스와핑은 반드시 메모리 관리 하드웨어를 필요로 하지 않는다.
페이징 방식에서는 메모리 스와핑(또는 익명 메모리 페이징)과 가상 메모리가 연결된다. 메모리 스와핑이란, 1차 기억 장치 내의 메모리 페이지를 보조 기억 장치 (의 스왑 파일 또는 스왑 파티션이라고 불리는 곳)에 기록하여, 더 빠른 1차 기억 장치를 다른 프로세스가 사용할 수 있도록 해제하는 것이다.
Windows 계열 OS 중 NT 계열에서는 페이징 방식의 가상 메모리를 채택하고 있으며, 시스템 UI 상에서는 "가상 메모리"라는 이름의 설정 항목이 준비되어 있지만, 이 시스템 설정 항목은 페이징 파일(스토리지로의 메모리 스왑)에 관한 것이다.
4. 구성 요소
가상 메모리는 현대 컴퓨터 아키텍처의 필수 요소이며, 일반적으로 CPU에 내장된 메모리 관리 장치(MMU) 형태의 하드웨어 지원이 필요하다.[6] 1960년대의 메인프레임 컴퓨터와 1980년대 초중반의 개인용 컴퓨터(예: DOS)와 같은 구형 운영 체제는[7] 가상 메모리 기능이 없는 경우가 많았지만, 1960년대 메인프레임에서는 예외적으로 다음과 같은 가상 메모리 시스템이 존재했다.
- Atlas용 Atlas Supervisor
- Electrologica X8용 THE multiprogramming system (하드웨어 지원 없는 소프트웨어 기반 가상 메모리)
- Burroughs B5000용 MCP
- IBM System/360 Model 67용 MTS, TSS/360 및 CP/CMS
- GE 645용 Multics
- RCA Spectra 70/46용 Time Sharing Operating System
1960년대와 70년대 초반에는 컴퓨터 메모리가 매우 비쌌기 때문에, 가상 메모리 도입은 큰 메모리 요구 사항을 가진 소프트웨어가 실제 메모리가 적은 컴퓨터에서 실행될 수 있게 해주는 획기적인 기술이었다. 또한 가상 주소 공간은 보안 및 신뢰성을 높여 가상 메모리 시스템을 더욱 매력적으로 만들었다.
대부분의 최신 운영 체제는 각 프로세스를 자체 전용 주소 공간에서 실행하여 각 프로그램이 가상 메모리에 단독으로 접근하는 것처럼 보이게 한다. 그러나 OS/VS1, OS/VS2 SVS와 같은 일부 구형 운영 체제와 IBM i와 같은 최신 운영 체제는 단일 주소 공간 운영 체제로, 모든 프로세스를 가상화된 메모리로 구성된 단일 주소 공간에서 실행한다.
임베디드 시스템과 같이 매우 빠르고 일관된 응답 시간을 요구하는 특수 목적 컴퓨터 시스템은 결정성 감소 때문에 가상 메모리를 사용하지 않을 수 있다. 가상 메모리 시스템은 예측할 수 없는 트랩을 발생시켜 입력에 대한 지연을 유발할 수 있으며, 특히 데이터를 보조 메모리에서 주 메모리로 읽어 와야 하는 경우 더욱 그렇다. 가상 주소를 물리 주소로 변환하는 하드웨어는 구현에 상당한 칩 영역이 필요하며, 임베디드 시스템에 사용되는 모든 칩이 이 하드웨어를 포함하는 것은 아니기 때문에 가상 메모리를 사용하지 않는 경우도 있다.
페이징 및 페이지 스틸링이 사용될 때, 컴퓨터가 백업 저장 장치로 페이지를 전송하는 데 많은 시간을 소비하여 유용한 작업을 느리게 하는 스래싱[27] 문제가 발생할 수 있다. 워킹 집합은 유용한 진행을 위해 메모리에 있어야 하는 최소 페이지 집합이다. 스래싱은 활성 프로그램의 워킹 집합을 저장할 수 있는 충분한 메모리가 없을 때 발생한다. 실제 메모리를 추가하는 것이 가장 간단한 해결책이지만, 애플리케이션 설계, 스케줄링 및 메모리 사용을 개선하는 것도 도움이 된다. 또 다른 해결책은 시스템에서 활성 태스크 수를 줄이는 것이다.
시스템 스래싱은 종종 소수의 실행 중인 프로그램에서 페이지 요구가 갑자기 급증하여 발생한다. 스왑 토큰[28]은 가볍고 동적인 스래싱 방지 메커니즘이다. 스래싱이 발생할 때 페이지 폴트가 있는 프로세스에 무작위로 제공되는 토큰을 시스템에 설정하고, 토큰을 가진 프로세스에게는 워킹 집합을 구축하기 위해 더 많은 물리적 메모리 페이지를 할당할 수 있는 권한을 준다. 타임 스탬프를 사용하여 토큰을 하나씩 넘겨준다. 스왑 토큰의 첫 번째 버전은 Linux 2.6에 구현되었으며,[29] 두 번째 버전은 선점 스왑 토큰이라고 하며, Linux 2.6에도 있다.[29]
4. 1. 메모리 관리 장치 (MMU)
가상 메모리는 CPU에 내장된 메모리 관리 장치 형태의 하드웨어 지원을 받는 것이 일반적이다.[6] 1960년대의 메인프레임 컴퓨터와 1980년대 초중반의 개인용 컴퓨터(예: DOS)와 같은 구형 운영 체제는[7] 일반적으로 가상 메모리 기능이 없었다.가상 주소를 물리 주소로 변환하는 하드웨어는 일반적으로 구현하는 데 상당한 칩 영역이 필요하며, 임베디드 시스템에 사용되는 모든 칩이 해당 하드웨어를 포함하는 것은 아니다.
페이지 테이블은 응용 프로그램에서 보이는 가상 주소를 명령을 처리하기 위해 컴퓨터 하드웨어에서 사용하는 물리 주소로 변환하는 데 사용된다.[25] 이러한 특정 변환을 처리하는 하드웨어를 메모리 관리 장치라고 한다. 페이지 테이블의 각 항목은 해당 페이지가 실제 메모리에 있는지 여부를 나타내는 플래그를 가지고 있다. 실제 메모리에 있는 경우, 페이지 테이블 항목에는 페이지가 저장된 실제 메모리 주소가 포함된다. 하드웨어가 페이지를 참조할 때, 해당 페이지에 대한 페이지 테이블 항목이 현재 실제 메모리에 없음을 나타내면, 하드웨어는 페이지 폴트 예외를 발생시켜 운영 체제의 페이징 슈퍼바이저 구성 요소를 호출한다.
가상 메모리 구현 방식에는 크게 세그먼트 방식과 페이징 방식의 두 종류가 있다. 68000 시스템에서는 68451(세그먼트 방식)과 68851(페이징 방식)의 메모리 관리 유닛(MMU)이 준비되어 있었다.
Windows 계열 OS 중 #Windows NT 계열에서는 페이징 방식의 가상 메모리를 채택하고 있다.
가상 메모리를 적절하게 구현하려면, CPU (또는 이에 부속되는 장치)가 OS에 가상 메모리를 물리 메모리에 매핑(대응)하는 수단을 제공하고, 주 기억 장치(물리 메모리)에 대응하지 않는 가상 주소에 접근한 것을 감지하는 수단을 제공하여 필요한 데이터를 스왑인할 수 있도록 해야 한다. CPU의 지원 없이 가상 메모리를 제공하는 것도 가능하지만, 그 경우에는 상기 기능을 제공하는 CPU를 에뮬레이트할 뿐이며, 본질적으로는 같다.
thumb
가상 주소에서 물리 주소로의 변환은 메모리 관리 유닛(MMU)이라는 하드웨어 장치에 의해 구현된다. 이는 CPU에 내장된 모듈인 경우도 있고, 외장형으로 CPU에 밀결합된 별도의 칩인 경우도 있다. 이것을 '''동적 주소 변환 기구''' ('''DAT''': Dynamic Address Translation)라고 부른다.
OS는 프로그램의 가상 주소 공간의 어느 부분을 물리 메모리에 보관할지를 결정한다. OS는 MMU가 사용하는 가상 주소에서 물리 주소로의 변환 테이블도 관리한다. 또한 가상 메모리 예외가 발생하면 OS는 이를 해결하기 위해 물리 메모리 영역을 확보하고, 필요하다면 원래의 내용을 디스크로 내보낸 후 새롭게 필요한 정보를 디스크에서 가져와 변환 테이블을 갱신하고, 예외가 발생한 소프트웨어의 실행을 재개한다.
대부분의 컴퓨터에서는 이 변환 테이블이 물리 메모리에 저장되어 있다. 따라서 가상 메모리를 참조하면, 원래의 참조 외에 변환 테이블의 참조가 (변환 테이블의 구성에 따라 여러 번) 발생한다. 이러한 주소 변환으로 인한 성능 저하를 줄이기 위해 대부분의 MMU는 자주 사용되는 가상 페이지에 빠르게 액세스할 수 있도록, 최근 사용된 가상 주소와 이에 대응하는 물리 주소를 보관하는 테이블을 가지고 있다. 이를 변환 색인 버퍼 (TLB: Translation Lookaside Buffer)라고 부른다. 참조 주소가 TLB 내에 저장된 변환 테이블로 커버되면, 추가적인 변환 테이블 참조 없이 빠르게 변환을 수행할 수 있다. 하지만 TLB는 고가의 장치이므로 테이블의 크기가 제한되어 있으며, 목표 가상 주소를 찾을 수 없는 경우에는 물리 메모리상의 변환 테이블을 참조하여 주소 변환이 수행된다.
프로세서에 따라서는, 이 일련의 처리가 하드웨어 내에서 수행된다. MMU는 물리 메모리상의 변환 테이블에서 필요한 변환 내용을 가져오므로, 소프트웨어 측에서는 추가적인 처리를 필요로 하지 않는다. 다른 종류의 프로세서에서는 운영 체제의 개입이 필수적이다. TLB에 필요한 변환 내용이 없는 경우, 예외가 발생하고, 운영 체제가 TLB 내의 하나의 항목을 필요한 변환 테이블의 내용으로 대체하며, 최초의 메모리 참조를 수행한 명령으로부터 실행이 재개되어, 다시 TLB를 참조하여 변환을 수행한다.
가상 기억을 지원하는 하드웨어의 대부분은 메모리 보호도 지원한다. MMU는 메모리 참조의 종류(읽기, 쓰기, 실행) 또는 메모리 참조 시의 CPU 모드에 따라 취급을 변경하는 기능을 가지고 있기도 하다.
4. 2. 변환 색인 버퍼 (TLB)
메모리 관리 유닛(MMU)은 가상 주소를 물리 주소로 변환하는 하드웨어 장치이다. CPU에 내장된 모듈 형태이거나, CPU와 밀접하게 연결된 별도의 칩 형태로 존재한다. 이를 '''동적 주소 변환 기구''' ('''DAT''': Dynamic Address Translation)라고 부른다.대부분의 컴퓨터에서 이 변환 테이블은 물리 메모리에 저장되어 있다. 따라서 가상 메모리 참조 시, 원래의 참조 외에 변환 테이블 참조가 (변환 테이블 구성에 따라 여러 번) 발생한다. 이러한 주소 변환으로 인한 성능 저하를 줄이기 위해, 대부분의 MMU는 최근 사용된 가상 주소와 그에 대응하는 물리 주소를 저장하는 테이블을 가지고 있다. 이를 '''변환 색인 버퍼''' (TLB: Translation Lookaside Buffer)라고 부른다.
TLB에 참조 주소가 있으면 추가적인 변환 테이블 참조 없이 빠르게 변환이 가능하다. 그러나 TLB는 고가이므로 테이블 크기가 제한되어, 필요한 가상 주소를 찾을 수 없는 경우에는 물리 메모리 상의 변환 테이블을 참조하여 주소 변환이 이루어진다.
일부 프로세서는 이 과정을 하드웨어 내에서 처리한다. MMU는 물리 메모리 상의 변환 테이블에서 필요한 변환 정보를 가져오므로, 소프트웨어 측에서는 추가적인 처리가 필요 없다. 다른 종류의 프로세서에서는 운영 체제의 개입이 필요하다. TLB에 필요한 변환 정보가 없는 경우, 예외가 발생하고 운영 체제가 TLB 내의 한 항목을 필요한 변환 테이블 내용으로 교체한다. 그 후, 최초 메모리 참조를 수행한 명령부터 실행이 재개되어 다시 TLB를 참조하여 변환을 수행한다.
4. 3. 페이지 테이블 (Page Table)
페이지 테이블은 응용 프로그램에서 사용하는 가상 주소를 실제 컴퓨터 하드웨어에서 사용하는 물리 주소로 변환하는 데 사용되는 자료 구조이다.[25] 이러한 변환을 담당하는 하드웨어를 메모리 관리 장치(MMU)라고 부른다. 페이지 테이블의 각 항목에는 해당 페이지가 실제 메모리에 있는지 여부를 나타내는 플래그가 있다. 실제 메모리에 있다면, 페이지 테이블 항목은 페이지가 저장된 실제 메모리 주소를 포함한다.페이지 테이블은 시스템 전체에 하나만 존재할 수도 있고, 각 프로세스나 주소 공간마다 별도로 존재할 수도 있다. 페이지 테이블이 하나만 있는 경우, 여러 응용 프로그램이 동시에 실행될 때 동일한 가상 주소 공간의 다른 부분을 사용한다. 여러 페이지 테이블이 있는 경우, 여러 가상 주소 공간이 존재하며, 동시 실행되는 응용 프로그램들은 별도의 페이지 테이블을 통해 서로 다른 실제 주소로 연결된다.
SDS 940과 같이 실제 메모리 크기가 작은 이전 시스템에서는 메모리의 페이지 테이블 대신 ''페이지 주소 레지스터''를 사용하여 주소 변환을 수행하기도 했다.
운영 체제는 페이지 테이블과 사용 가능한 페이지 프레임 목록을 생성하고 관리한다. 페이지 폴트를 빠르게 처리하기 위해 충분한 사용 가능한 페이지 프레임이 있는지 확인하고, 페이지 교체 알고리즘(예: 최근 사용 알고리즘(LRU))을 사용하여 할당된 페이지 프레임을 주기적으로 회수한다. 수정된 페이지 프레임은 사용 가능한 큐에 추가되기 전에 보조 저장 장치에 다시 기록된다.
일반적으로 해결할 수 없는 페이지 폴트는 응용 프로그램의 비정상적인 종료를 초래한다. 그러나 일부 시스템에서는 응용 프로그램이 이러한 오류에 대한 예외 처리기를 가질 수 있다. 페이지 폴트가 발생하면 운영 체제는 다음과 같은 방식으로 처리한다.
- 가상 주소가 유효하지 않으면 오류로 처리한다.
- 페이지가 유효하고 페이지 정보가 MMU에 로드되지 않았으면 페이지 레지스터 중 하나에 저장한다.
- 페이지가 초기화되지 않았으면 새 페이지 프레임을 할당하고 초기화한다.
- 원하는 페이지를 포함하는 회수된 페이지 프레임이 있으면 해당 페이지 프레임을 재사용한다.
- 쓰기 시도가 읽기 전용 페이지에서 발생한 경우, copy-on-write 페이지라면 새 페이지 프레임을 할당하고 이전 페이지의 내용을 복사한다. 그렇지 않으면 오류로 처리한다.
- 가상 주소가 메모리 맵 파일 또는 페이징 파일의 유효한 페이지인 경우, 새 페이지 프레임을 할당하고 해당 페이지를 읽어 들인다.
대부분의 경우 페이지 테이블이 업데이트된 후 변환 색인 버퍼(TLB)를 비우고 시스템은 예외를 발생시킨 명령을 다시 시작한다.
Windows 계열 OS 중 Windows NT 계열에서는 페이징 방식의 가상 메모리를 채택하고 있으며, 시스템 UI 상에서는 "가상 메모리"라는 이름의 설정 항목이 있지만, 이 시스템 설정 항목은 페이징 파일(스토리지로의 메모리 스왑)에 관한 것이다.
4. 4. 페이지 교체 알고리즘 (Page Replacement Algorithm)
운영 체제의 페이지 교체 알고리즘(최근 사용 알고리즘 (LRU) 등)은 페이지 폴트를 해결하기 위해 사용 가능한 페이지 프레임을 관리한다. 수정된 페이지 프레임은 사용 가능한 큐에 추가되기 전에 보조 저장 장치에 다시 기록된다.해결할 수 없는 페이지 폴트는 응용 프로그램의 비정상적인 종료를 초래하지만, 일부 시스템에서는 예외 처리기를 통해 처리될 수 있다. 페이지 폴트 발생 시, 페이징 슈퍼바이저는 다음과 같이 처리한다.
- 가상 주소가 유효하지 않으면 오류로 처리한다.
- 페이지가 유효하고 페이지 정보가 MMU에 로드되지 않았으면 페이지 레지스터에 저장한다.
- 페이지가 초기화되지 않았으면 새 페이지 프레임을 할당하고 지운다.
- 뺏긴 페이지 프레임이 있으면 재사용한다.
- 쓰기 시도가 읽기 보호된 페이지에 발생하면, copy-on-write 페이지인 경우 새 페이지 프레임을 할당하고 내용을 복사한다. 그렇지 않으면 오류로 처리한다.
- 가상 주소가 메모리 맵 파일 또는 페이징 파일의 유효한 페이지인 경우, 페이지 프레임을 할당하고 읽어 들인다.
페이지 테이블이 업데이트된 후 변환 색인 버퍼(TLB)를 비우고 예외를 발생시킨 명령을 다시 시작한다. 사용 가능한 페이지 프레임 큐가 비어 있으면, 페이지 뺏기에 동일한 페이지 교체 알고리즘을 사용하여 페이지 프레임을 해제해야 한다.
5. 메모리 보호
가상 메모리를 지원하는 하드웨어는 대부분 메모리 보호도 지원한다. 메모리 관리 유닛(MMU)은 메모리 참조 종류(읽기, 쓰기, 실행)나 메모리 참조 시 CPU 모드에 따라 처리 방식을 변경하는 기능을 갖추고 있다. 이를 통해 운영 체제는 자체 코드와 데이터(예: 주소 변환 테이블)를 문제 있는 애플리케이션 프로그램의 잘못된 메모리 접근으로부터 보호하고, 애플리케이션끼리 서로 보호하며, 애플리케이션 자체의 잘못된 동작(예: 자신의 코드 영역에 쓰기)으로부터 보호한다.
6. 단일 레벨 저장 (Single-Level Store)
이것은 mmap이나 Win32의 MapViewOfFile과 같은 기구와는 다르다. mmap 등에서는 파일이 임의의 위치에 매핑될 수 있으므로 파일 간의 포인터를 사용할 수 없기 때문이다. Multics에서는 파일(복수 세그먼트 파일의 경우 세그먼트)은 세그먼트 기구를 통해 주소 공간에 매핑된다. 따라서 파일은 항상 세그먼트 경계에 매핑된다. 파일의 링크 부분에는 포인터가 나열되어 있으며, 해당 포인터를 레지스터에 로드하거나 간접 참조하면 트랩이 발생한다. 미해결 포인터에는 세그먼트 이름을 나타내는 값과 세그먼트 내 오프셋이 있다. 트랩 핸들러는 해당 세그먼트를 주소 공간에 매핑하고, 포인터의 세그먼트 식별자 부분을 세그먼트 번호로 재작성하므로, 두 번째 이후에는 해당 포인터에 접근해도 트랩이 발생하지 않는다[56]. 이 방식에서는 링커가 필요 없으며[48], 동일한 파일을 여러 프로세스가 다른 위치에 매핑해도 문제없이 기능한다[57].
7. 가상 메모리와 관련된 문제점
가상 메모리는 CPU에 내장된 메모리 관리 장치 형태의 하드웨어 지원이 필요한, 현대 컴퓨터 아키텍처의 필수적인 부분이다. 구형 운영 체제는 일반적으로 가상 메모리 기능이 없었지만, 1960년대 메인프레임의 예외적인 사례로는 Atlas용 Atlas Supervisor, Burroughs B5000용 MCP, IBM System/360 Model 67용 MTS, TSS/360 및 CP/CMS 등이 있다.
1960년대와 70년대 초반에는 컴퓨터 메모리가 매우 비쌌기 때문에, 가상 메모리 도입은 큰 메모리 요구 사항을 가진 소프트웨어 시스템이 실제 메모리가 적은 컴퓨터에서 실행될 수 있게 했다. 이는 가상 메모리로 전환하는 강력한 동기가 되었다. 또한 가상 주소 공간을 제공하는 추가 기능은 보안과 신뢰성을 높여 가상 메모리를 더욱 매력적으로 만들었다.
대부분의 최신 운영 체제는 각 프로세스를 자체 전용 주소 공간에서 실행하여 각 프로그램이 가상 메모리에 단독으로 접근하는 것처럼 보이게 한다. 그러나 일부 구형 운영 체제(예: OS/VS1, OS/VS2 SVS)와 최신 운영 체제(예: IBM i)는 단일 주소 공간 운영 체제로, 모든 프로세스를 가상화된 메모리로 구성된 단일 주소 공간에서 실행한다.
임베디드 시스템과 같이 매우 빠르거나 일관된 응답 시간을 요구하는 특수 목적 컴퓨터 시스템은 결정성 감소 때문에 가상 메모리를 사용하지 않을 수 있다. 가상 메모리 시스템은 예측할 수 없는 트랩을 발생시켜 입력에 대한 지연을 유발할 수 있으며, 특히 데이터를 보조 메모리에서 주 메모리로 읽어 와야 하는 경우 더욱 그렇다. 가상 주소를 물리적 주소로 변환하는 하드웨어는 구현에 상당한 칩 영역이 필요하며, 임베디드 시스템에 사용되는 모든 칩이 해당 하드웨어를 포함하는 것은 아니므로, 일부 시스템에서는 가상 메모리를 사용하지 않는다.
가상 메모리 구현에는 크게 세그먼트 방식과 페이징 방식의 두 가지가 있다. 68000 시스템에서는 68451(세그먼트 방식)과 68851(페이징 방식)의 메모리 관리 유닛(MMU)이 제공되었다.
일반적으로 페이징 방식이 더 많이 사용되며, '''메모리 스와핑'''(''익명 메모리 페이징'')과 가상 메모리가 연결된다. 메모리 스와핑은 1차 기억 장치 내의 메모리 페이지를 보조 기억 장치 (의 '''스왑 파일''' 또는 '''스왑 파티션''')에 기록하여 더 빠른 1차 기억 장치를 다른 프로세스가 사용할 수 있도록 해제하는 것이다.[44]
Windows NT 계열에서는 페이징 방식의 가상 메모리를 채택하고 있으며, 시스템 UI 상에서는 "가상 메모리" 설정 항목이 있지만, 이는 페이징 파일(스토리지로의 메모리 스왑)에 관한 것이다. 애플리케이션 및 많은 시스템 프로세스는 항상 가상 주소를 사용하여 메모리를 참조하며, OS 커널의 코어 부분만이 주소 가상화를 우회하여 실제 주소를 직접 사용할 수 있다. 가동 중인 모든 프로세스에서 요구하는 메모리가 시스템에 설치된 RAM 용량을 초과하지 않더라도 가상 메모리는 항상 사용되고 있다.[45]
유닉스 계열 시스템에서도 스왑 파일이나 스왑 파티션 없이 가상 메모리를 사용할 수 있다. 주 기억 장치 이상의 큰 기억 영역을 가상으로 사용할 수 있게 하는 것은 가상 메모리의 주요 목적이지만, 본질은 아니다. 본질은 불연속적인 물리 메모리 영역을 연속적인 가상 메모리 영역에 매핑하고, 여러 프로세스가 각각 고유한 연속적인 가상 메모리 영역을 할당받을 수 있다는 점이다. 이를 통해 다른 프로세스의 영향을 받지 않고 동작할 수 있는 환경이 제공된다. 가상 머신이 게스트 OS에게 제공하는 것과 가상 메모리가 사용자 프로세스에게 제공하는 것은 이러한 의미에서 동일하다. 가상 메모리는 물리 메모리의 단편화를 숨김으로써 애플리케이션 프로그래밍을 용이하게 하며, 커널에 기억 계층 관리를 위임하여 프로그램이 명시적인 오버레이 제어를 할 필요성을 없앤다.
기술적으로 가상 메모리를 사용하면 소프트웨어가 동작하는 메모리 주소 공간의 크기와 주소 범위가 컴퓨터의 물리 메모리 영역에 반드시 묶이지 않는다. 가상 메모리를 구현하려면 CPU (또는 부속 장치)가 OS에 가상 메모리를 물리 메모리에 매핑하는 수단을 제공하고, 주 기억 장치(물리 메모리)에 대응하지 않는 가상 주소에 접근한 것을 감지하여 필요한 데이터를 스왑인할 수 있도록 해야 한다. CPU 지원 없이 가상 메모리를 제공하는 것도 가능하지만, 이 경우 상기 기능을 제공하는 CPU를 에뮬레이트할 뿐이며 본질적으로는 같다. 어도비의 일부 애플리케이션처럼 애플리케이션 프로그램이 자체적으로 가상 메모리 기구를 갖는 예도 있다.[46][47]
소프트웨어로 가상 메모리를 구현하는 것은 하드웨어로 구현할 수 있는 기능을 소프트웨어로 하려는 것이므로 비효율적으로 보일 수 있다. 그러나 페이지 방식이나 세그먼트 방식에서는 가상 주소 공간 확장이 수평 방향으로만 이루어지는 반면, 이미지 조작과 같은 경우 면적인 확장을 갖는다. 소프트웨어로 가상 메모리를 구현하면 면적인 확장을 메모리 참조의 국소성으로 간주하여 단순한 가상 메모리보다 성능 향상을 기대할 수 있다.
7. 1. 스래싱 (Thrashing)
페이징 및 페이지 스틸링이 사용될 때, 컴퓨터가 백업 저장 장치로 페이지를 전송하는 데 너무 많은 시간을 소비하여 유용한 작업을 느리게 하는 현상을 "스래싱"[27]이라고 한다. 태스크의 워킹 집합은 유용한 작업을 수행하기 위해 메모리에 있어야 하는 최소 페이지 집합이다. 스래싱은 활성 프로그램의 워킹 집합을 저장할 수 있는 충분한 메모리가 없을 때 발생한다.실제 메모리를 추가하는 것이 가장 간단한 해결책이지만, 애플리케이션 설계, 스케줄링 및 메모리 사용을 개선하는 것도 도움이 될 수 있다. 또 다른 해결책은 시스템에서 활성 태스크 수를 줄이는 것이다. 이는 하나 이상의 프로세스의 전체 워킹 집합을 스와핑하여 실제 메모리에 대한 요구를 줄이는 방식으로 이루어진다.
시스템 스래싱은 종종 소수의 실행 중인 프로그램에서 페이지 요구가 갑자기 급증하여 발생한다. 스왑 토큰[28]은 가볍고 동적인 스래싱 방지 메커니즘이다. 스래싱이 발생할 때 페이지 폴트가 있는 프로세스에 무작위로 토큰을 제공하는 것이 기본 아이디어이다. 토큰을 가진 프로세스는 워킹 집합을 구축하기 위해 더 많은 물리적 메모리 페이지를 할당받을 수 있으며, 이를 통해 빠르게 실행을 완료하고 메모리 페이지를 다른 프로세스에 해제할 수 있다. 타임 스탬프를 사용하여 토큰을 순차적으로 전달한다.
스왑 토큰의 첫 번째 버전은 Linux 2.6에 구현되었다.[29] 두 번째 버전은 선점 스왑 토큰이라고 하며, 역시 Linux 2.6에 구현되었다.[29] 이 업데이트된 스왑 토큰 구현에서는 각 프로세스에 스왑 아웃된 페이지 수를 추적하기 위한 우선 순위 카운터가 설정된다. 토큰은 항상 높은 우선 순위를 가진, 즉 스왑 아웃된 페이지 수가 많은 프로세스에 주어진다. 타임 스탬프의 길이는 상수 값이 아니라 우선 순위에 따라 결정된다. 즉, 프로세스의 스왑 아웃된 페이지 수가 많을수록 해당 프로세스의 타임 스탬프가 길어진다.
7. 2. 단편화 (Fragmentation)
페이징은 단편화로부터 자유롭지 않으며, 페이지 내에서 발생하는 단편화를 '''내부 단편화'''라고 부른다. 요청된 블록이 페이지보다 작으면 페이지의 일부 공간이 낭비된다. 블록이 페이지보다 크면 다른 페이지에 작은 영역이 필요하므로 많은 공간이 낭비된다.[33] 따라서 단편화는 특정 페이지 크기에 맞게 프로그램을 왜곡할 수 있는 프로그래머에게 전달되는 문제가 된다. 세분화를 사용하면 단편화는 세그먼트 외부에 있으며(외부 단편화) 시스템 문제이며, 이는 가상 메모리의 최초 목표인 프로그래머가 이러한 메모리 고려 사항에서 벗어나도록 하는 것이었다.유닉스 계열 시스템에서는 단편화 문제를 회피하고 성능을 유지하기 위해 파티션 사용이 권장된다. 스왑 파티션을 사용하면 스왑 영역을 디스크 내에서 가장 빠르게 접근 가능한 위치에 배치할 수 있다.
NT 계열 Windows에서는 점진적으로 확장된 페이지 파일의 경우, 단편화가 발생하여 성능에 악영향을 미칠 수 있다.[70] 페이지 파일 확장에 의한 단편화는 일시적인 것이다. 확장된 영역이 사용되지 않게 되면 (늦어도 다음 재시작 시점에는), 추가로 확보된 디스크 영역은 해제되고, 페이지 파일은 원래 상태로 되돌아간다. 물리 메모리 이상의 메모리를 항상 사용하는 경우, 페이지 파일의 조각 모음을 하면 성능이 개선될 가능성도 있다.
참조
[1]
서적
System/360 Model 67 Time Sharing System Preliminary Technical Summary
http://bitsavers.org[...]
IBM
[2]
서적
z/OS Version 2 Release 4 z/OS Introduction and Release Guide
https://www-01.ibm.c[...]
IBM
2020-09-22
[3]
서적
Architectural and Operating System Support for Virtual Memory
https://books.google[...]
Morgan & Claypool Publishers
2017-10-16
[4]
서적
Operating Systems
https://books.google[...]
Pearson Education India
2017-10-16
[5]
학술지
Direct address translation for virtual memory in energy-efficient embedded systems
https://dl.acm.org/d[...]
2008-12-01
[6]
웹사이트
AMD-V™ Nested Paging
http://developer.amd[...]
AMD
2015-04-28
[7]
웹사이트
Windows Version History
http://support.micro[...]
Microsoft
2015-03-09
[8]
학술지
Before Memory Was Virtual
http://denninginstit[...]
[9]
학술지
Origin of the Virtual Memory Concept
[10]
학술지
Die Entwicklung des virtuellen Speichers
[11]
간행물
Structural Aspects of the System/360 Model 85 – The Cache
[12]
간행물
One-level Storage System
[13]
웹사이트
Ferranti Atlas 1 & 2 – Systems Architecture
https://www.ourcompu[...]
2009-11-12
[14]
백과사전
John Wiley and Sons
2023-01-10
[15]
학술지
The origin of the VM/370 time-sharing system
http://pages.cs.wisc[...]
1981-09
[16]
웹사이트
The Atlas
http://www.computer5[...]
[17]
웹사이트
Stories About the B5000 and People Who Were There
https://archive.comp[...]
[18]
웹사이트
IEEE Computer August 1977 David Bulman's Letter to the Editor
https://www.computer[...]
[19]
서적
Memory Systems and Pipelined Processors
https://books.google[...]
Jones and Bartlett Publishers
[20]
컨퍼런스
System/370 integrated emulation under OS and DOS
https://www.computer[...]
AFIPS Press
2022-06-12
[21]
서적
z/VM built on IBM Virtualization Technology General Information Version 4 Release 3.0
http://www.vm.ibm.co[...]
2002-04-12
[22]
학술지
Is automatic "folding" of programs efficient enough to displace manual?
[23]
웹사이트
Difference Between Paging and Segmentation
https://unstop.com/b[...]
2024-12-14
[24]
서적
IBM Power Systems Performance Guide: Implementing and Optimizing
https://books.google[...]
IBM Corporation
2017-07-18
[25]
서적
Foundation of Operating Systems
https://books.google[...]
Excel Books India
2017-07-18
[26]
서적
z/Architecture - Principles of Operation
http://publibfp.dhe.[...]
IBM
2023-01-18
[27]
웹사이트
Thrashing
https://public.suppo[...]
[28]
학술지
Token-ordered LRU: an effective page replacement policy and its implementation in Linux systems
[29]
웹사이트
Swap Token effectively minimizes system thrasing effects and is adopted in OS kernels
https://web.cse.ohio[...]
[30]
서적
Burroughs B5500 Information Processing System Reference Manual
http://bitsavers.org[...]
Burroughs Corporation
2013-11-28
[31]
웹사이트
Unisys MCP Virtual Memory
https://public.suppo[...]
[32]
서적
Proceedings of the December 5-7, 1972, fall joint computer conference, Part I on - AFIPS '72 (Fall, part I)
1972
[33]
웹사이트
Checkerboarding
https://public.suppo[...]
[34]
서적
GE-645 System Manual
http://www.bitsavers[...]
2022-02-25
[35]
웹사이트
Introduction and Overview of the Multics System
http://www.multician[...]
2007-11-13
[36]
웹사이트
System Design of a Computer for Time Sharing Applications
http://www.multician[...]
[37]
웹사이트
"Virtual Machines: Architectures, Implementations and Applications", HOTCHIPS 17, Tutorial 1, part 2
https://old.hotchips[...]
2005-08-14
[38]
간행물
The Multics Virtual Memory: Concepts and Design
http://www.multician[...]
1972-05
[39]
웹사이트
Multics Execution Environment
http://www.multician[...]
2016-10-09
[40]
서적
The Multics System: An Examination of Its Structure
https://archive.org/[...]
MIT Press
[41]
문서
The most important requirement is that the program be APF authorized.
[42]
문서
e.g., requesting use of preferred memory
[43]
웹사이트
Control swapping (DONTSWAP, OKSWAP, TRANSWAP)
http://pic.dhe.ibm.c[...]
2016-10-09
[44]
웹사이트
スワップとは - 意味をわかりやすく - IT用語辞典 e-Words
https://e-words.jp/w[...]
[45]
웹사이트
Virtual memory in 32-bit version of Windows - Windows Server | Microsoft Learn
https://learn.micros[...]
[46]
웹사이트
Photoshop で仮想記憶ディスクを設定する
https://helpx.adobe.[...]
[47]
웹사이트
Windows および macOS 上での Illustrator のパフォーマンスの改善
https://helpx.adobe.[...]
[48]
간행물
Before Memory Was Virtual
http://cs.gmu.edu/cn[...]
[49]
뉴스
The origin of the VM/370 time-sharing system
http://pages.cs.wisc[...]
IBM Journal of Research & Development
1981-09
[50]
웹사이트
Atlas design includes virtual memory
http://www.computer5[...]
[51]
서적
Memory Systems and Pipelined Processors
https://books.google[...]
Jones and Bartlett Publishers
[52]
간행물
Burroughs B5500 Information Processing System Reference Manual
[53]
서적
GE-645 System Manual
[54]
웹사이트
Introduction and Overview of the Multics System
http://www.multician[...]
2007-11-13
[55]
웹사이트
System Design of a Computer for Time Sharing Applications
http://www.multician[...]
2012-10-13
[56]
웹사이트
Multics Execution Environment
http://www.multician[...]
2012-10-13
[57]
서적
The Multics System: An Examination of Its Structure
MIT Press
[58]
웹사이트
The virtual storage address space
https://www.ibm.com/[...]
2020-12-11
[59]
웹사이트
単一アドレス空間におけるプロセス生成とデータ共有
https://cir.nii.ac.j[...]
2020-12-11
[60]
서적
Information Processing 1962
Spartan
[61]
웹사이트
The Atlas
http://www.computer5[...]
Department of Computer Science
2012-10-14
[62]
웹사이트
Atlas Architecture
http://www.chilton-c[...]
Atlas Computer Laboratory
2012-10-14
[63]
서적
Computers - Key to Total Systems Control
Macmillan
[64]
간행물
One-Level Storage System
Institute of Radio Engineers
[65]
웹사이트
Crash Dump Analysis
http://blogs.msdn.co[...]
MSDN Blogs
2008-07-22
[66]
웹사이트
Windows Server 2008 / 2008 R2 / 2012/ 2012 R2 大容量メモリダンプファイル 設計ガイド
http://jp.fujitsu.co[...]
2014-11-02
[67]
웹사이트
Your system is low on virtual memory - Office | Microsoft Learn
https://learn.micros[...]
[68]
웹사이트
How to change virtual memory size on Windows 10 | Windows Central
https://www.windowsc[...]
[69]
웹사이트
Virtual memory in 32-bit version of Windows - Windows Server | Microsoft Learn
https://learn.micros[...]
[70]
웹사이트
Windows Sysinternals PageDefrag
http://technet.micro[...]
Microsoft
2010-12-20
[71]
웹사이트
64 ビット バージョンの Windows の適切なページ ファイル サイズを確認する方法
http://support.micro[...]
Microsoft
2007-11-07
[72]
웹사이트
"Jesper Juhl": Re: How to send a break? - dump from frozen 64bit linux
http://lkml.org/lkml[...]
LKML
2006-05-29
[73]
웹사이트
Andrew Morton: Re: Swap partition vs swap file
http://lkml.org/lkml[...]
LKML
null
[74]
문서
Chapter 6. Swap Space
http://docs.redhat.c[...]
[75]
웹사이트
Mac OS X 10.1
http://arstechnica.c[...]
Ars Technica
2001-10-15
[76]
웹사이트
OS運用記録
https://web.archive.[...]
[77]
서적
Architectural and Operating System Support for Virtual Memory
https://books.google[...]
Morgan & Claypool Publishers
2017
[78]
서적
Operating Systems
https://books.google[...]
Pearson Education India
2010
[79]
저널
Before Memory Was Virtual
http://denninginstit[...]
[80]
저널
Origin of the Virtual Memory Concept
[81]
저널
Die Entwicklung des virtuellen Speichers
Springer Berlin / Heidelberg
[82]
간행물
The origin of the VM/370 time-sharing system
http://pages.cs.wisc[...]
IBM Journal of Research & Development
1981-09
[83]
웹인용
Atlas design includes virtual memory
http://www.computer5[...]
2010-09-21
[84]
웹인용
Ian Joyner on Burroughs B5000
http://ianjoyner.nam[...]
2016-11-04
[85]
서적
Memory Systems and Pipelined Processors
https://books.google[...]
Jones and Bartlett Publishers
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com