가상 메모리 / 페이징 기능을 통해 커널은 메모리를 사용자 공간 프로세스에 "가상화"할 수 있습니다. 커널은 실제 메모리에서 페이지를 가져와 페이징을 통해 정렬하여 사용자 공간 프로세스에 연속적으로 표시되도록 할 수 있습니다.
사용자 공간 프로세스의 메모리에 제한을 설정할 수 있으며 프로세스가 메모리 공간을 넘어 서면 "페이지 오류"가 발생하여 CPU 예외가 커널로 되돌아옵니다. 이것은 사용자 공간 프로그램이 커널의 허가없이 커널이나 다른 프로그램에 할당 된 메모리를 망칠 수 없도록합니다.
일반적으로 사용자 공간 프로그램은 잘 정의 된 인터페이스 ( 예 : C 함수 malloc()
등) free()
를 통해 커널에이 제한을 확장하도록 요청합니다 . 커널은 프로그램이 얼마나 많은 메모리를 할당했는지 추적 할 책임이 있습니다.
커널이 메모리를 오버 프로비저닝 할 수 있고 (Windows와 Linux가이를 지원하는 경우) 스왑이라고하는 이유는이 "페이지 결함"메커니즘을 통해 프로세스가 디스크에서 하나의 페이지로 액세스하려고 시도한 페이지를 커널이 스왑 할 수 있습니다. 메모리 액세스가 실제로 유효하지 않은 경우 (즉, 프로세스가 먼저 메모리에 액세스하려고하지 않은 경우) SIGSEGV로 프로세스가 종료됩니다.
따라서 "스와핑"은 가상 메모리 / 페이징에 의존하는 추가 기능 (Linux에서는 원하는 경우 완전히 비활성화 할 수 있음)이지만 CPU에 가상 메모리 / 페이징이 있기 때문에 필요하지 않습니다. 개념은 동일하지 않지만 스와핑은 존재하는 페이징 / 가상 메모리에 따라 다릅니다.
또한 귀하의 질문을 더 자세히 읽은 후 "페이징"은 때때로 "스와핑"에 대한 동의어로 사용되지만 "스와핑"에 대해 들어 본 적이 없습니다. 스왑 아웃되었습니다.
그렇다면 왜 리눅스에 스왑 파티션이 필요한가? 실제 메모리가 가득 찬 경우 일부 프로세스가 하드 드라이브로 아웃소싱되고 새 프로세스가 가상 메모리에서 실제 메모리로 매핑됩니다.
"가상 메모리" 는 물리적 메모리이며 "매핑"입니다. MMU 하드웨어는 저장 장치에 직접 매핑 할 수 없습니다. MMU는 커널에게 프로세스가 가지고 있지 않은 메모리에 액세스하려고 시도했음을 알리는 결함을 발생시킬 수 있습니다. 커널은이 메커니즘을 사용하여 프로세스가 디스크에서 무언가가 메모리에 있다고 생각한 것을 확인한 다음 " 교환". 요점은 페이지를 디스크에 저장하여 하드웨어가 아닌 다른 프로세스에 해당 페이지를 사용할 수 있도록 결정하는 운영 체제입니다.