다른 프로세스에서 가상 메모리 주소가 같은 이유는 무엇입니까?
Windows에서 가상 메모리는 2G (커널 용)/2G (사용자 용)를 구분합니다. 그러나 왜 변수의 주소가 계속해서 스택되지 않습니까?
좋아요 0x22ff74,0x22ff78,0x22ff82,0x22ff86? Windows가 사용자 프로세스에서 샌드 박스 메커니즘을 사용한다는 의미입니까?
다른 프로세스에서 가상 메모리 주소가 같은 이유는 무엇입니까?
Windows에서 가상 메모리는 2G (커널 용)/2G (사용자 용)를 구분합니다. 그러나 왜 변수의 주소가 계속해서 스택되지 않습니까?
좋아요 0x22ff74,0x22ff78,0x22ff82,0x22ff86? Windows가 사용자 프로세스에서 샌드 박스 메커니즘을 사용한다는 의미입니까?
정확히 가상 메모리 란 무엇입니까? 운영 체제는 각 프로그램에 고유 한 개인 주소 공간을 제공합니다. 실제로 운영 체제는 응용 프로그램이 알지 못하는 사이에 가상 주소를 다시 실제 주소 공간에 매핑하는 작업을 담당합니다.
두 개의 응용 프로그램이 서로 다른 데이터를 프로그램의 동일한 가상 주소에 둘 수 있다는 것을 알았습니다.
가상 메모리 here에 대해 자세히 알아보십시오.
실제 주소와 가상 주소를 혼동하고 있습니까? 각 프로세스는 자체 가상 메모리 공간을 보게되므로 두 프로세스가 동일한 가상 주소에 액세스하는 것이 좋습니다. 반면에 모든 프로세스는 머신의 동일한 물리적 메모리 공간을 공유하므로 각 프로세스는 동일한 실제 주소를 다른 물리적 주소에 매핑합니다 (공유 메모리가 없다고 가정).
다른 방법으로 설명하겠습니다. 프로세스 X가 시스템 A에서 실행 중이고 동일한 프로그램이 시스템 B에서 프로세스 Y로 실행 중입니다. 프로그램의 일부 전역 변수가 두 시스템에서 동일한 메모리 주소를 사용하는 경우 중요합니까? 그들은 다르다! 같은 방법으로, 전역 변수가 프로세스의 한 인스턴스에 대해 XYZ 위치에 저장되는 경우, 프로세스의 또 다른 인스턴스는 해당 전역 변수에 대해 (XYZ)과 동일한 가상 주소를 가질 수 있습니다.
고맙습니다. 그러나 당신이 제공하는 위키를 읽은 후에 더 많은 질문이 나에게 혼란을줍니다. 각 프로세스가 2G를 완전히 소유하고 있다고 생각한다는 의미입니다 (또는 각 프로세스에 새롭고 비어있는 깨끗한 VAS가 있다고 말했습니까?). 그렇다면 4 가지 프로그램이 동일한 VAS 주소에서 시작하는 이유입니까? 또 다른 질문은 DLL (제 3 자)이 각 프로세스의 VAS에 ".data"및 ".code"를 복사한다는 것입니다. 너무 많은 질문을하는 것에 대해 유감스럽게 생각합니다 <3 – John
@ 존 : 그것은 복잡합니다. 각 프로세스에는 자체 VAS가 있습니다. 시작시 각 DLL (프로세스 실행 파일과 함께)은 프로세스에 매핑 된 메모리입니다. 공유 DLL은 일반적으로 모든 프로세스에서 동일한 주소에서 시작됩니다 (따라서 사용 된 페이지가 공유됩니다). 가상 주소가 접촉 (실행, 읽기 또는 쓰기)되면 메모리 관리는 해당 가상 주소의 내용을 메모리에 복사 (페이지)합니다. –
이전 답변의 추가 정보 : 때때로 DLL 주소가 충돌합니다.이 경우 로더가 DLL을 새 주소로 재배치합니다. 이렇게하면 DLL 페이지가 더 이상 DLL을 사용하는 다른 프로세스와 공유되지 않습니다. –