Linux에서 POSIX 공유 메모리 개체[1]는 tmpfs
via를 사용합니다 /dev/shm
. 결과적으로 A는 tmpfs
"페이지 캐시에 완전히 존재"한다고 합니다[2](스왑이 아직 활성화되지 않았다고 가정합니다). mmap
POSIX SHM 개체(주소 공간에 프로그래밍됨)를 사용할 때 일관성/찢김 방지 보장이 무엇인지 궁금합니다 .
예: 두 프로세스 A와 B가 POSIX SHM 개체를 공유하고 두 프로세스 모두 mmap
자신의 주소 공간에 쓴다고 가정합니다. 페이지가 4kB이고 개체가 페이지 정렬되어 있다고 가정하면 개체의 크기는 8kB 또는 두 페이지입니다.
- A는 두 번의 연속 [3] 쓰기를 실행합니다. 첫 번째 쓰기는 첫 번째 페이지(첫 번째 4k 블록)에, 두 번째 쓰기는 두 번째 페이지에 수행됩니다.
- B는 공유 객체/두 페이지 모두를 폴링합니다.
B가 읽은 내용이 찢어졌을 가능성이 있습니까? 즉, B가 신선하고 업데이트된 두 번째 페이지를 읽었지만 첫 번째 페이지는 오래되었습니다.
[1]https://www.man7.org/linux/man-pages/man7/shm_overview.7.html
[2]https://www.kernel.org/doc/html/latest/filesystems/tmpfs.html
[3] 이는 관련 C 의사코드입니다.
int fd = shm_open(...);
void *share = mmap(0, 8192, $flags, fd, 0);
memcpy(share , data1, 4096);
memcpy(share + 4096, data2, 4096);