메모리 보호

프로세스에 속하는 메모리는 프라이빗 가상 주소 공간으로 암시적으로 보호됩니다. 또한 Windows는 가상 메모리 하드웨어를 사용하여 메모리 보호를 제공합니다. 이 보호의 구현은 프로세서에 따라 다릅니다. 예를 들어 프로세스의 주소 공간에 있는 코드 페이지는 읽기 전용으로 표시되고 사용자 모드 스레드에 의한 수정으로부터 보호될 수 있습니다.

특성의 전체 목록은 메모리 보호 상수를 참조하세요.

Copy-on-Write Protection

쓰기 중 복사 보호는 여러 프로세스가 가상 주소 공간을 매핑하여 프로세스 중 하나가 페이지를 수정할 때까지 실제 페이지를 공유할 수 있도록 하는 최적화입니다. 이는 지연 평가라는 기술의 일부로, 시스템이 절대적으로 필요할 때까지 작업을 수행하지 않음으로써 물리적 메모리와 시간을 절약할 수 있습니다.

예를 들어 두 프로세스가 동일한 DLL의 페이지를 가상 메모리 공간으로 로드한다고 가정합니다. 이러한 가상 메모리 페이지는 두 프로세스 모두에 대해 동일한 실제 메모리 페이지에 매핑됩니다. 두 프로세스 모두 이러한 페이지에 기록하지 않으면 다음 다이어그램과 같이 동일한 실제 페이지에 매핑하고 공유할 수 있습니다.

동일한 실제 메모리에 매핑된 프로세스 1 및 2 페이지의 상자 및 화살표

프로세스 1이 이러한 페이지 중 하나에 쓰는 경우 실제 페이지의 내용이 다른 실제 페이지에 복사되고 프로세스 1에 대한 가상 메모리 맵이 업데이트됩니다. 이제 두 프로세스 모두 실제 메모리에 페이지의 고유한 instance 있습니다. 따라서 한 프로세스가 공유 물리적 페이지에 쓰고 다른 프로세스에서 변경 내용을 볼 수 없습니다.

프로세스 및 실제 메모리 다시 매핑의 상자 및 화살표

애플리케이션 및 DLL 로드

동일한 Windows 기반 애플리케이션의 여러 인스턴스가 로드되면 각 instance 자체 보호된 가상 주소 공간에서 실행됩니다. 그러나 해당 instance 핸들(hInstance)은 일반적으로 동일한 값을 갖습니다. 이 값은 가상 주소 공간에서 애플리케이션의 기본 주소를 나타냅니다. 각 instance 기본 기본 주소로 로드할 수 있는 경우 쓰기 중 복사 보호를 사용하여 동일한 물리적 페이지를 다른 인스턴스에 매핑하고 공유할 수 있습니다. 시스템에서는 이러한 인스턴스 중 하나가 페이지를 수정할 때까지 동일한 실제 페이지를 공유할 수 있습니다. 어떤 이유로 이러한 인스턴스 중 하나를 원하는 기본 주소에 로드할 수 없는 경우 자체 물리적 페이지를 받습니다.

DLL은 기본 기본 주소로 만들어집니다. DLL을 사용하는 모든 프로세스는 DLL의 기본 가상 주소에 있는 자체 주소 공간 내에 DLL을 로드하려고 시도합니다. 여러 애플리케이션이 기본 가상 주소에서 DLL을 로드할 수 있는 경우 DLL에 대해 동일한 실제 페이지를 공유할 수 있습니다. 어떤 이유로 인해 프로세스가 기본 주소에서 DLL을 로드할 수 없는 경우 DLL을 다른 곳에 로드합니다. 점프 지침에 대한 수정 사항이 DLL의 페이지 내에 작성되고 이 프로세스에 따라 다르기 때문에 쓰기 시 복사 보호 기능으로 인해 DLL 페이지 중 일부가 이 프로세스의 다른 실제 페이지로 복사됩니다. 코드 섹션에 데이터 섹션에 대한 많은 참조가 포함된 경우 전체 코드 섹션이 새 실제 페이지에 복사될 수 있습니다.