공유 메모리 매핑 파일과 공유 메모리 영역은 서로 기반으로 구현되어 있나요? 다음 두 문장은 이런 말을 하는 것 같고, 제가 보기엔 닭이냐 달걀이냐에 대한 질문인 것 같습니다.
다음 운영 체제 개념은 공유 메모리 매핑 파일을 소개합니다. 여러 프로세스가 파일 내용을 보관하는 동일한 물리적 메모리 영역을 공유하여 동일한 파일을 공유합니까?
여러 프로세스가 동시에 동일한 파일을 매핑할 수 있습니다., 데이터 공유를 허용합니다. 모든 프로세스의 쓰기는 가상 메모리의 데이터를 수정하며 파일의 동일한 부분을 매핑하는 다른 모든 프로세스에서 볼 수 있습니다. 가상 메모리에 대한 이전 논의를 고려하면 메모리 매핑된 부분의 공유를 구현하는 방법이 명확해졌습니다. 각 공유 프로세스의 가상 메모리 맵은 동일한 물리적 메모리 페이지, 즉 디스크 블록의 복사본을 보유하는 페이지를 가리킵니다.이 메모리 공유는 그림 9.22에 나와 있습니다.
아래에서는 공유 메모리에 대해서도 소개합니다.
여러 프로세스가 메모리 매핑 파일을 공유하여 메모리 영역을 공유합니까?
"메모리 매핑 파일"이 디스크나 주 메모리에 있습니까? 디스크에 있는 줄 알았는데, "메모리 매핑 파일은 통신 프로세스 간의 공유 메모리 영역 역할을 한다"는 것은 메인 메모리에 상주한다는 뜻인 것 같습니다.
대부분의 경우,공유 메모리는 실제로 메모리 매핑 파일을 통해 구현됩니다.. 이 경우 프로세스는 통신 프로세스 메모리가 동일한 파일을 가상 주소 공간에 매핑하도록 하여 공유 메모리를 사용하여 통신할 수 있습니다. 메모리 매핑된 파일은 통신 프로세스 간의 공유 메모리 영역 역할을 합니다(그림 9.23).
감사해요.
답변1
공유 메모리 매핑 파일과 공유 메모리 영역은 서로 기반으로 구현되어 있나요?
결국 그것은 거의 /dev/shm
가상 디스크일 뿐입니다.
"메모리 매핑 파일"이 디스크나 주 메모리에 있습니까?
예!
액세스되는 파일 부분은 (스위치에 의해) 버퍼, 즉 RAM에 복사됩니다.
이 메모리에 대한 모든 쓰기는 파일에 즉시 표시되지만 버퍼가 동기화되거나 플러시될 때까지 실제 디스크에 기록되지 않습니다.
답변2
공유 메모리는 일반 파일, 블록 장치 또는 스왑을 통해 백업될 수 있습니다. 메모리 영역이 어떻게 생성되는지에 따라 다릅니다.
여러 프로세스가 동일한 공유 메모리 영역을 사용하는 경우 해당 가상 주소는 동일한 물리적 주소를 가리킵니다. 한 프로세스의 쓰기는 메모리에 연결된 디스크 파일(있는 경우)을 통하지 않고 다른 프로세스에서 직접 볼 수 있습니다.
공유 메모리 뒤에 파일이 있는 경우 커널은 때때로 RAM에서 변경된 페이지를 파일로 동기화합니다. 메모리를 사용하는 프로세스는 일반적으로 이러한 일이 언제 발생하는지 알 필요가 없지만 필요한 경우 msync
더 빠르게 발생하도록 호출할 수 있습니다.
공유 메모리 뒤에 파일이 없으면 비공유 프로세스 메모리와 마찬가지로 일부 RAM을 확보해야 할 때 커널이 스왑 페이지를 이동할 수 있습니다. 다시 교체되면 공유 메모리를 매핑하는 모든 프로세스에서 즉시 사용할 수 있는 새로운 물리적 주소를 얻습니다.
처음 봤을 때 나를 혼란스럽게 했던 또 하나의 사실은 맵 파일을 사용하는 경우 프로세스가 하나만 포함되어 있어도 mmap
변경 사항을 적용하고 파일에 다시 저장하려면 맵 파일을 사용해야 한다는 것입니다 . MAP_SHARED
처음에는 MAP_SHARED
이 함수의 이름이 잘못되었다고 생각했지만 나중에 생각해보면 를 read
사용하거나 나중에 제공될 파일에 액세스하는 다른 프로세스와 수정 사항을 "공유" 하고 있다는 것입니다 mmap
. 그래서 그것은 의미가 있습니다.