{{위키데이터 속성 추적}}
[[파일:Virtual memory.svg|섬네일|가상 메모리는 활성 [[랜덤 액세스 메모리|RAM]]과 [[직접 접근 기억 장치|DASD]] 상의 비활성 메모리로 결합되어 있다.]]
'''가상 메모리''' 또는 '''가상 기억 장치'''({{문화어|가상기억기}}, virtual memory, virtual storage)는 [[메모리 관리]] 기법의 하나로, [[컴퓨터]] 시스템에 실제로 이용 가능한 기억 자원을 이상적으로 추상화하여<ref>{{서적 인용|last1=Bhattacharjee|first1=Abhishek|last2=Lustig|first2=Daniel|title=Architectural and Operating System Support for Virtual Memory|date=2017|publisher=Morgan & Claypool Publishers|isbn=9781627056021|page=1|url=https://books.google.com/books?id=roM4DwAAQBAJ|accessdate=October 16, 2017}}</ref> 사용자들에게 매우 큰 (주) 메모리로 보이게 만드는 것을 말한다.<ref>{{서적 인용|last1=Haldar|first1=Sibsankar|last2=Aravind|first2=Alex Alagarsamy|title=Operating Systems|date=2010|publisher=Pearson Education India|isbn=978-8131730225|page=269|url=https://books.google.com/books?id=orZ0CLxEMXEC&pg=PA269|accessdate=October 16, 2017}}</ref> 각 프로그램에 실제 메모리 주소가 아닌 가상의 메모리 주소를 주는 방식이다.

이러한 방식은 [[멀티태스킹]] 운영 체제에서 흔히 사용되며, 실제 [[주기억장치]]보다 큰 메모리 영역을 제공하는 방법으로도 사용된다.

가상적으로 주어진 주소를 [[가상 주소]](virtual address) 또는 논리 주소(logical address) 라고 하며, 실제 메모리 상에서 유효한 주소를 [[물리 주소]](physical address) 또는 실주소(real address)라고 한다. 가상 주소의 범위를 가상 주소 공간, 물리 주소의 범위를 물리 주소 공간이라고 한다.

가상 주소 공간은 [[메모리 관리 장치]](MMU)에 의해서 물리 주소로 변환된다. 이 덕분에 프로그래머는 가상 주소 공간상에서 프로그램을 짜게 되어 프로그램이나 데이터가 주메모리상에 어떻게 존재하는지를 의식할 필요가 없어진다. 대부분의 현대적 아키텍처와 운영 체제는 가상 메모리 기능을 제공하며, 각 응용 프로그램에 더 적합한 메모리 관리를 위해 [[어도비 포토샵]]과 같은 일부 응용 프로그램은 스스로 가상 메모리를 관리하기도 한다.

가상 메모리의 개념은 1957년에 발표되었다. 실제 적용된 것은 [[맨체스터 대학교]]가 Atlas용으로 [[1961년]]에 개발한 것이 최초이다. 1965년에 [[MIT]]가 개발한 [[멀틱스]] 시스템 이후 본격적으로 채용되기 시작했다.

가상 메모리는 크게 나누어 세그먼트(segment) 방식과 페이징 방식의 2종류가 있다. 예를 들어 [[MC68000]] 시스템에서는 68451(세그먼트(segment) 방식)과 68851(페이징 방식) 두 가지의 MMU가 준비되어 있었다.

== 역사 ==
1940년대와 1950년대에 모든 대형 프로그램들은 [[오버레이 (프로그래밍)|오버레이]]와 같은, 1차, 2차 기억 장치를 위한 로직을 포함해야 했다. 1차 메모리의 확장을 위해서만이 아니라, 프로그래머들이 쉽게 사용할 수 있도록 확장하기 위해서 가상 메모리가 도입되었다.<ref name="denning">{{저널 인용|authorlink=Peter J. Denning|last=Denning|first=Peter|title=Before Memory Was Virtual|journal=In the Beginning: Recollections of Software Pioneers|year=1997|url=http://denninginstitute.com/pjd/PUBS/bvm.pdf|format=PDF}}</ref> [[멀티프로그래밍]]과 [[멀티태스킹]]을 허용하기 위해, 수많은 초기의 시스템들은 가상 메모리 없이 여러 프로그램들 사이에 메모리를 나누었으며, [[프로세서 레지스터|레지스터]]를 경유하는 [[PDP-10]] 초기 모델을 예로 들 수 있다.

가상 메모리의 개념은 1956년 [[베를린 공과대학교]]에서 독일의 [[물리학자]] 프리츠 루돌프(Fritz-Rudolf Güntsch)가 처음 개발하였으며, 《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차 드럼 메모리 간에 블록을 자동으로 이동하는 하드웨어를 갖춘 머신을 기술하였다.<ref>{{저널 인용|first=Elke|last=Jessen|title=Origin of the Virtual Memory Concept|work=[[IEEE Annals of the History of Computing]]|volume=26|issue=4|year=2004|pages=71–72}}</ref><ref name=springer>{{저널 인용 | last1 = Jessen | first1 = E.| title = Die Entwicklung des virtuellen Speichers| doi = 10.1007/s002870050034 | journal = Informatik-Spektrum| publisher   = Springer Berlin / Heidelberg| issn = 0170-6012| volume = 19 | issue = 4 | pages = 216–219 | year = 1996|language=독일어| pmid =  | pmc = }}</ref>
[[페이징]]은 160,000 워드의 1차 [[자기 코어 메모리|코어 메모리]]를 추가적인 96,000 워드의 2차 [[드럼 메모리]]와 병합함으로써 [[아틀라스 컴퓨터]]의 작업 메모리를 확장하는 방법의 하나로 [[맨체스터 대학교]]에서 최초로 구현되었다. 최초의 아틀라스는 1962년에 도입되었지만 작업 중인 페이징 견본은 1959년에 개발되었다.<ref name="denning"/>{{rp|page=2}}<ref>R. J. Creasy, "[http://pages.cs.wisc.edu/~stjones/proj/vm_reading/ibmrd2505M.pdf The origin of the VM/370 time-sharing system]", ''IBM Journal of Research & Development'', Vol. 25, No. 5 (September 1981), ''p.'' 486</ref><ref>{{웹 인용 |url=http://www.computer50.org/kgill/atlas/atlas.html |제목=Atlas design includes virtual memory |확인날짜=2010년 9월 21일 |보존url=https://web.archive.org/web/20120728105352/http://www.computer50.org/kgill/atlas/atlas.html |보존날짜=2012년 7월 28일 |url-status=dead }}</ref> 1961년, [[버로프]]사는 페이징 대신 [[메모리 세그멘테이션|세그멘테이션]]을 지원하는 [[B5000]]이라는 독자적으로 가상 메모리를 갖춘 최초의 상용 컴퓨터를 출시하였다.<ref>{{웹 인용 |url=http://ianjoyner.name/Burroughs.html |제목=Ian Joyner on Burroughs B5000 |확인날짜=2016-11-04 |archive-date=2017-05-10 |archive-url=https://web.archive.org/web/20170510101556/http://ianjoyner.name/Burroughs.html |url-status= }}</ref><ref>{{서적 인용|first=Harvey G.|last=Cragon|title=Memory Systems and Pipelined Processors|publisher=Jones and Bartlett Publishers|page=113|year=1996|url=https://books.google.com/?id=q2w3JSFD7l4C|isbn=0-86720-474-5}}</ref>

== 인위적 연속성 ==
'''인위적 연속성'''(artificial continuity)이란 가상기억장치의 개념에서 가상공간의 연속적 주소가 실제 물리적인 공간상에서 연속일 필요가 없다는 것을 뜻하는 말이다. [[사상 표]]를 통해서 가상기억장치의 주소로부터 실기억장치의 주소를 알 수 있다.

== 같이 보기 ==
{{위키공용분류}}
* [[메모리|물리 메모리]], [[물리 주소]]
* [[메모리 주소]]
** [[주소 공간]]
** [[가상 주소 공간]]
* [[CPU 설계]]
* [[페이징]]
* [[메모리 관리]]
* [[동적 메모리 할당|메모리 할당]]
* [[보호 모드]]

== 각주 ==
{{각주}}

{{메모리 관리}}
{{전거 통제}}

[[분류:가상 메모리| ]]
[[분류:컴퓨터 시스템]]