공유 메모리에 대한 나의 이해에 따르면 이는 둘 이상의 프로세스 간에 공유되는 메모리 세그먼트입니다. 공유 메모리는 다음을 shmget()
사용하여 구현할 수 있습니다. 그러나 어떤 프로세스도 주소 공간에 포함되지 않은 메모리 세그먼트에 액세스할 수 없으므로 이 공유 메모리를 프로세스의 주소 공간에 연결해야 합니다. 제가 이해한 연결 단어에 따르면 연결이란 생성된 메모리 세그먼트를 두 프로세스의 주소 공간에 포함한다는 의미입니다. 그러나 이 공유 메모리의 시작 주소(함수 shmat()
)를 인쇄하면 모든 주소가 각 프로세스마다 다릅니다. 이것은 나를 혼란스럽게 합니다. 공유 메모리가 두 프로세스 간에 공유되는 메모리의 단일 "컨테이너"이고 두 개의 다른 시작 주소가 있는 경우에는 어떻게 될까요? 이는 첫 번째 프로세스의 공유 메모리 내용이 다른 프로세스의 새 메모리 세그먼트에 복사된다는 의미입니까?
답변1
반환되는 주소는 shmat()
포인터로 직접 사용할 수 있는 모든 주소와 마찬가지로 가상 주소입니다. 가상 주소는 간접적입니다. 즉, 주소 변환 테이블을 효과적으로 가리킵니다(페이지 테이블) 해당 메모리가 실제로 매핑되었는지 여부와 이를 물리 메모리에서 찾을 수 있는 위치를 CPU에 알려줍니다. 프로세스가 서로를 보호하는 대부분의 Unix 스타일 멀티태스킹 시스템에서 각 프로세스는 자체 가상 주소 공간을 갖습니다.
공유 메모리는 여러 프로세스의 가상 주소 공간에 매핑된 물리적 페이지 집합입니다. 각 프로세스는 가상 주소 공간을 다르게 사용할 수 있으므로 동일한 공유 메모리가 이를 공유하는 각 프로세스 내의 다른 가상 주소에 나타날 가능성이 높습니다. 그렇지 않으면 필요한 주소에 이미 무언가를 할당한 프로세스가 해당 공유 메모리에 액세스할 수 없습니다.
(일부 시스템에는 프로세스 간에 동일한 가상 주소 공간이 있습니다.단일 주소 공간 운영 체제더 알아보기. )