공유 메모리 매핑 파일과 공유 메모리 영역은 서로 기반으로 구현되어 있나요?

공유 메모리 매핑 파일과 공유 메모리 영역은 서로 기반으로 구현되어 있나요?

공유 메모리 매핑 파일과 공유 메모리 영역은 서로 기반으로 구현되어 있나요? 다음 두 문장은 이런 말을 하는 것 같고, 제가 보기엔 닭이냐 달걀이냐에 대한 질문인 것 같습니다.

다음 운영 체제 개념은 공유 메모리 매핑 파일을 소개합니다. 여러 프로세스가 파일 내용을 보관하는 동일한 물리적 메모리 영역을 공유하여 동일한 파일을 공유합니까?

여러 프로세스가 동시에 동일한 파일을 매핑할 수 있습니다., 데이터 공유를 허용합니다. 모든 프로세스의 쓰기는 가상 메모리의 데이터를 수정하며 파일의 동일한 부분을 매핑하는 다른 모든 프로세스에서 볼 수 있습니다. 가상 메모리에 대한 이전 논의를 고려하면 메모리 매핑된 부분의 공유를 구현하는 방법이 명확해졌습니다. 각 공유 프로세스의 가상 메모리 맵은 동일한 물리적 메모리 페이지, 즉 디스크 블록의 복사본을 보유하는 페이지를 가리킵니다.이 메모리 공유는 그림 9.22에 나와 있습니다.

여기에 이미지 설명을 입력하세요.

아래에서는 공유 메모리에 대해서도 소개합니다.

  • 여러 프로세스가 메모리 매핑 파일을 공유하여 메모리 영역을 공유합니까?

  • "메모리 매핑 파일"이 디스크나 주 메모리에 있습니까? 디스크에 있는 줄 알았는데, "메모리 매핑 파일은 통신 프로세스 간의 공유 메모리 영역 역할을 한다"는 것은 메인 메모리에 상주한다는 뜻인 것 같습니다.

대부분의 경우,공유 메모리는 실제로 메모리 매핑 파일을 통해 구현됩니다.. 이 경우 프로세스는 통신 프로세스 메모리가 동일한 파일을 가상 주소 공간에 매핑하도록 하여 공유 메모리를 사용하여 통신할 수 있습니다. 메모리 매핑된 파일은 통신 프로세스 간의 공유 메모리 영역 역할을 합니다(그림 9.23).

여기에 이미지 설명을 입력하세요.

감사해요.

답변1

공유 메모리 매핑 파일과 공유 메모리 영역은 서로 기반으로 구현되어 있나요?

결국 그것은 거의 /dev/shm 가상 디스크일 뿐입니다.

"메모리 매핑 파일"이 디스크나 주 메모리에 있습니까?

예!

액세스되는 파일 부분은 (스위치에 의해) 버퍼, 즉 RAM에 복사됩니다.

이 메모리에 대한 모든 쓰기는 파일에 즉시 표시되지만 버퍼가 동기화되거나 플러시될 때까지 실제 디스크에 기록되지 않습니다.

답변2

공유 메모리는 일반 파일, 블록 장치 또는 스왑을 통해 백업될 수 있습니다. 메모리 영역이 어떻게 생성되는지에 따라 다릅니다.

여러 프로세스가 동일한 공유 메모리 영역을 사용하는 경우 해당 가상 주소는 동일한 물리적 주소를 가리킵니다. 한 프로세스의 쓰기는 메모리에 연결된 디스크 파일(있는 경우)을 통하지 않고 다른 프로세스에서 직접 볼 수 있습니다.

공유 메모리 뒤에 파일이 있는 경우 커널은 때때로 RAM에서 변경된 페이지를 파일로 동기화합니다. 메모리를 사용하는 프로세스는 일반적으로 이러한 일이 언제 발생하는지 알 필요가 없지만 필요한 경우 msync더 빠르게 발생하도록 호출할 수 있습니다.

공유 메모리 뒤에 파일이 없으면 비공유 프로세스 메모리와 마찬가지로 일부 RAM을 확보해야 할 때 커널이 스왑 페이지를 이동할 수 있습니다. 다시 교체되면 공유 메모리를 매핑하는 모든 프로세스에서 즉시 사용할 수 있는 새로운 물리적 주소를 얻습니다.

처음 봤을 때 나를 혼란스럽게 했던 또 하나의 사실은 맵 파일을 사용하는 경우 프로세스가 하나만 포함되어 있어도 mmap변경 사항을 적용하고 파일에 다시 저장하려면 맵 파일을 사용해야 한다는 것입니다 . MAP_SHARED처음에는 MAP_SHARED이 함수의 이름이 잘못되었다고 생각했지만 나중에 생각해보면 를 read사용하거나 나중에 제공될 파일에 액세스하는 다른 프로세스와 수정 사항을 "공유" 하고 있다는 것입니다 mmap. 그래서 그것은 의미가 있습니다.

관련 정보