가상 메모리의 개념은 RAM의 실제 주소와 일치하지 않는 가상 주소 공간을 만드는 것입니다. 시스템은 디스크에 메모리의 정식 복사본을 저장하고 가장 자주 사용되는 데이터만 RAM에 캐시합니다. 이를 실현 가능하게 만들기 위해 가상 메모리를 다음과 같은 것으로 나눕니다.페이지;일반적인 페이지 크기는 4KB입니다. 우리는 또한 RAM을 다음과 같이 나눕니다.페이지 프레임, 각각은 페이지와 동일한 크기이며 가상 메모리의 모든 페이지를 수용할 준비가 되어 있습니다.
Linux 시스템을 실행하고 있는데 메인 메모리에 충분한 공간이 있기 때문에 스왑 영역이 비어 있습니다. 즉, 페이지가 있는 가상 메모리가 여전히 존재하며 프로세스는 주 메모리에 있는 해당 세그먼트의 물리적 주소가 아닌 가상 주소를 계속 갖게 됩니까?
디스크에 스왑 영역이 없으면 시스템에도 가상 메모리가 있나요?
즉, Linux 시스템에서는 가상 메모리를 항상 사용할 수 있습니까? 프로세스에는 항상 가상 주소가 있습니까?
답변1
가상 메모리(페이징)는 CPU 수준에서 활성화됩니다. 이는 CPU가 MMU를 사용하여 가상 주소(애플리케이션에 표시된 대로)를 물리적 주소로 변환한다는 의미입니다. 메모리는 페이지로 나누어집니다. 페이지는 메모리에 로드되거나 디스크에 로드될 수 있습니다. 페이지가 디스크에 있는 경우 페이지에 액세스하면 운영 체제에서 처리하는 페이지 오류가 발생합니다(운영 체제는 디스크에서 페이지를 로드함).
따라서 스왑 없이도 여전히 가상 메모리가 있고 CPU는 여전히 MMU를 사용하고 메모리를 페이지로 분할하지만 OS는 해당 페이지를 디스크로 이동할 수 없습니다.
답변2
아니요.
user996142가 언급했듯이 가상 주소 공간이라는 두 가지가 있습니다. 그러나 귀하의 질문에 표시된 정의는 스왑 공간을 더 구체적으로 설명합니다. 그럼에도 불구하고, 나는 두 진술 모두 매우 수수께끼라고 생각합니다.
CPU 수준에서 가상 메모리 주소를 가지려면 MMU가 필요합니다. 다른 사용자가 언급했듯이 컴퓨터는 주어진 물리적 주소에 물리적 메모리를 가지고 있습니다. 대부분의 경우 실제 메모리는 0에서 시작하여 보유한 총 메모리 양까지 점차 증가합니다. 일부 아키텍처는 마지막에도 메모리를 갖고 싶어합니다(주소 -1, -2, -3...). 모든 CPU에는 MMU 칩이 없습니다. 특히 임베디드 시스템에서는 더욱 그렇습니다. 이러한 시스템 중 일부는 실제로 MMU를 사용할 수 없는 상태에서 여전히 8비트 CPU를 사용합니다(이러한 시스템은 어쨌거나 주소 지정 가능한 메모리가 64Kb로 제한됩니다).
시스템 수준에서 가상 메모리는 언급한 스왑 영역입니다. 다시 말하지만, 반드시 사용할 수 있는 것은 아닙니다. 대부분의 Linux 배포판에서는 설치 중에 스왑 영역이 자동으로 생성됩니다. 그러나 일부 시스템은 이 작업을 자동으로 수행하지 않습니다(예: DigitalOcean에서 제공하는 Ubuntu 시스템은 기본적으로 스왑 공간을 제공하지 않습니다...). 대부분의 경우 스왑 공간을 확보하는 것은 프로세스가 복원되는 것을 방지하는 데 좋습니다. 운영 체제별 RAM(그래서 방금 무슨 일이 일어났는지 전혀 알 수 없습니다).
커널은 이 모든 것을 관리하는 역할을 담당합니다.
MMU 부분은 매우 낮은 수준입니다. 대부분의 구현에서는 프로세스가 Linux에서 실행되어야 합니다. 해당 기능이 없으면 어디에서나 실행할 수 있는 프로세스가 필요하거나(68K 프로세서를 실행하는 구형 Mac에서는 재미있는 일이었으며 메모리의 어느 곳에나 배치할 수 있는 ~64Kb의 코드 청크를 생성하게 됨) 프로세스를 재배치할 수 있는 방법이 필요합니다. ...
노트: 한동안 Linux 커널은 재부팅할 때마다 더 이상 동일한 IP 주소에서 프로세스를 실행하지 않도록 업데이트되었습니다. 자신의 프로세스를 디버깅하려고 하고 이와 같은 고정 IP 주소에 의존하려는 경우 이는 정말 짜증나는 일입니다. 그러나 이것이 더 안전합니다. 그러나 MMU만으로는 프로세스를 실행하는 데 충분하지 않은 것으로 나타났습니다. 해당 시점에 커널이 선택한 IP에 따라 재부팅할 때마다 재배치되어야 합니다.
Exchange는 익스플로잇을 실행할 수 있는 매우 높은 계층입니다.더 많은 메모리디스크에 일부 데이터를 저장하는 것보다 컴퓨터에 더 많은 데이터가 있습니다. 물론 속도면에서 큰 페널티가 있습니다. 대부분의 경우 하나의 프로세스를 실행하는 것이 더 좋으며, 프로세스가 완료되면 다음 프로세스를 실행하는 등의 작업을 계속하여 디스크로의 교체를 방지합니다.
중요한 측면은 프로세스의 코드(Python 및 PHP와 같은 해석된 언어의 어셈블리 코드는 인터프리터 바이너리가 됨)가 변경되지 않으며 디스크에서 읽기 전용 모드로 사용할 수 있다는 것입니다. 즉, 프로세스 코드의 일부를 교환하고 나중에 필요에 따라 RAM의 교환 데이터를 크게 손실하지 않고 다시 로드할 수 있다는 의미입니다. 데이터를 디스크에 기록해야 하는데 속도가 느립니다. 코드를 읽어보세요. 따라서 프로세스 코드의 일부가 실행되지 않으면 나중에 다시 실행될 경우 해당 코드 페이지를 교체하고 매우 빠르게 다시 로드할 수 있습니다. 이 스왑에는 스왑 디스크나 스왑 파일이 필요하지 않습니다. 따라서 스왑 공간이 0Kb이더라도 커널은 실행 중인 프로세스의 코드를 스왑하여 일부 RAM을 절약할 수 있습니다.
답변3
Linux가 메모리 관리 장치(MMU)가 있는 CPU에서 실행되는 경우 가상 메모리가 항상 사용됩니다.
여기서 "가상 메모리"라는 용어는 두 가지 서로 얽힌 의미를 갖습니다. 이는 물리적 메모리에 해당할 수도 있고 그렇지 않을 수도 있는 프로세스 내에서 메모리 주소의 가상 할당을 의미할 수 있습니다. 또한 디스크 블록을 프로세스 가상 메모리에 매핑하여 물리적으로 사용 가능한 RAM 이상으로 메모리 공간을 확장하는 디스크 블록을 참조할 수도 있습니다.
Linux(및 일반적으로 Unix)는 요청 페이징입니다. 즉, 페이지는 요청 시 디스크에서 로드되거나 사용 가능한 메모리 풀에서 할당됩니다.
처리 중인 페이지는 여러 소스에서 여러 상태에 있을 수 있습니다.
- 실행 가능 페이지는 디스크의 프로그램이나 공유 라이브러리와 연관되어 있을 가능성이 높습니다. 디스크에 페이지 복사본이 있고 실제 메모리에 페이지의 (읽기 전용) 복사본이 있을 수도 있습니다. 이러한 페이지는 관련 파일을 사용하는 모든 프로세스에서 공유(읽기 전용)될 수 있습니다.
- 프로세스의 데이터 페이지는 물리적 RAM에 위치할 수 있습니다. 메모리에 있으면 깨끗할 수도 있고 더러울 수도 있습니다. 정리된 데이터 페이지는 스왑 영역에 복사본을 갖고 있습니다(필요한 경우 해제할 수 있음). 더티 페이지에는 스왑에 복사본이 없거나 페이지가 수정되었습니다(그리고 스왑 페이지가 해제되었습니다). 물리적 메모리에 복사본 없이 교체될 수도 있습니다.
- 디스크의 파일은 프로세스의 가상 메모리에 매핑될 수 있습니다. 실행 가능 페이지는 위에서 설명한 대로 읽기 전용으로 매핑됩니다. 그러나 쓰기 가능한 파일을 데이터 페이지로 매핑하고 이를 스왑 영역 대신 파일에 저장할 수도 있습니다. 매핑된 데이터 페이지가 더러워지면 기회에 따라 신속하게 파일에 다시 기록됩니다. 위에서 언급한 대로 매핑된 페이지는 디스크에만 위치할 수 있거나 RAM에 복사(클린 또는 더티)될 수 있습니다.
- 페이지는 가상 메모리에 할당될 수도 있지만 실제 RAM이나 디스크에는 해당 데이터가 없습니다. 이는 프로세스가 더 많은 메모리를 요청했지만 (아직?) 메모리를 사용하지 않을 때 발생합니다. 그러한 페이지를 읽으면 0이 반환됩니다. 쓰기로 인해 물리적 페이지가 0이 되고 프로세스에 할당된 다음 쓰기가 완료됩니다. (또는 이것이 가능하지 않으면 메모리 부족 오류로 인해 프로세스가 종료됩니다.)
따라서 스와핑 없이도 초기화되지 않은 빈 페이지, 실행 가능한 페이지를 위한 가상(비물리적) 메모리가 여전히 존재하며 매핑된 데이터 페이지도 있을 수 있습니다. 또한 물리적 메모리는 디스크 지원 여부에 관계없이 가상 메모리 내에 포함됩니다.
차이점은 스왑이 없으면 시스템 메모리가 부족할 때 읽기 전용 페이지가 다른 페이지를 로드하기 위해 자주 플러시되고 파일과 연결되지 않는 한(매핑 여부에 관계없이) 더티 페이지는 갈 곳이 없고 물리적으로 존재한다는 것입니다. 잠긴 메모리.
프로세스의 가상 메모리에 할당되지 않은 디스크 파일의 캐시된 페이지도 있지만 가상 메모리 시스템은 여전히 관련되어 있기 때문에 작업이 약간 단순화됩니다. 또한 구현 세부 사항에 따라 위 작업 중 일부의 순서가 다르게 지정될 수 있습니다.
이전 UNIX 시스템에서는 모든 물리적 메모리 페이지를 지원하는 데 충분한 스왑 공간이 필요하므로 스왑 공간은 일반적으로 RAM 크기의 두 배 이상입니다. Linux는 오래 전에 이 전략을 포기했으며 교체가 필요하지 않습니다.