GDB를 사용하여 디버깅하기 위해 두 프로세스를 모두 열었을 때 /proc/PID/maps가 두 프로세스 모두 동일한 주소 영역을 가지고 있음을 나타냈습니다.
cat /proc/4170/maps
555555554000-555555555000 r--p 00000000 08:01 655807 /home/user/1
555555555000-555555556000 r-xp 00001000 08:01 655807 /home/user/1
555555556000-555555557000 r--p 00002000 08:01 655807 /home/user/1
555555557000-555555558000 r--p 00002000 08:01 655807 /home/user/1
555555558000-555555559000 rw-p 00003000 08:01 655807 /home/user/1
cat /proc/4177/maps
555555554000-555555555000 r--p 00000000 08:01 664427 /home/user/2
555555555000-555555556000 r-xp 00001000 08:01 664427 /home/user/2
555555556000-555555557000 r--p 00002000 08:01 664427 /home/user/2
555555557000-555555558000 r--p 00002000 08:01 664427 /home/user/2
555555558000-555555559000 rw-p 00003000 08:01 664427 /home/user/2
이것이 어떻게 처리되는지 이해가 되지 않습니다. 각 프로세스에는 자체 페이지 테이블이 있어야 한다고 생각했습니다.
답변1
이것이 어떻게 처리되는지 이해가 되지 않습니다. 각 프로세스에는 자체 페이지 테이블이 있어야 한다고 생각했습니다.
이것이 바로 여기서 일어나고 있는 일입니다. 의 주소는 /proc/.../maps
물리적 주소가 아닌 가상 주소입니다. 각 프로세스의 페이지 테이블을 통해 해석되므로 프로세스는 물리적 메모리에서 개별 페이지를 가져옵니다(공유 페이지 제외).
따라서 두 프로세스 모두 가상 주소 555555558000-555555559000에서 사용할 수 있는 쓰기 가능한 메모리를 가지고 있지만 각 프로세스는 해당 메모리에 대해 서로 다른 페이지 테이블을 가지며 궁극적으로 서로 다른 물리적 주소를 가리킵니다.
(몇 가지 추가 세부 사항을 포함하여 조금 단순화했습니다.예를 들어쓰기 시 복사 등이 있지만 여기서는 이를 무시할 수 있습니다. )