이것이 읽기 전용 메모리를 아동 프로세스와 공유하는 안전한 방법입니까?

StackOverflow https://stackoverflow.com/questions/2232092

  •  19-09-2019
  •  | 
  •  

문제

상당히 큰 인접한 메모리 (~ 1GB)를 할당하고 초기화하고,이를 메모리의 사본을 만들지 않고 사용하는 리딩 전용 및 포크 배수 (예 : 수십 개) 하위 프로세스로 표시하고 싶습니다 ( 기계에는이를위한 메모리가 충분하지 않습니다).

내가 생각한다면 나는 옳다 malloc 평소와 같이 메모리를 다음과 함께 읽기 전용으로 표시합니다. mprotect(addr, size, PROT_READ) 그리고 fork, 이렇게하면 어린이 프로세스가 메모리를 복사하지 않고도 안전하게 사용할 수 있습니까? (제공 한 후에는 할당 된 메모리에 글을 쓰려고 시도하는 것이 없습니다. mprotect 전화).

편집하다: 모든 답변에 감사드립니다.

후속 질문 - 나는 사용을 계획하고 있었다 shmget, 그러나 나는 그것이 사용되었다고 생각했다 mm 따라서 더 작은 할당으로 제한됩니다 ( 제한 이 페이지의 섹션). 예를 들어 /proc/sys/kernel/shmmax 서버에서 32MB입니다. 그러나 나는 1GB의 인접한 기억을 원합니다. 이 제한에 대해 내가 틀렸습니까?

도움이 되었습니까?

해결책

남자 mprotect

구현에는이를 요구할 것입니다 addr 반환 된 페이지 크기의 배수입니다. sysconf ().

이 기능의 동작은 전화로 매핑이 설정되지 않은 경우 지정되지 않습니다. mmap ().

  1. mprotect 임의의 바이트 범위가 아닌 페이지에서만 작동하므로 일반적으로 malloc 부적절합니다. posix_memalign 도울 수 있지만 ...
  2. 현재 시스템에서 작동 할 수 있지만 ~ 아니다 mprotect 당신이하지 않은 것 mmap 당신 자신. 사용 mmap(0, pages*sysconf(_SC_PAGESIZE), PROT_READ|PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0) 대신에.

다른 팁

당신은 어린이 과정이 전화 할 수있는 이유로 옳지 않습니다. mprotect() 보호를 제거하고 거기에서 글을 쓰기 시작합니다. 페이지가 복사되지 않은 경우 원리를 위반합니다. fork().

사본-쓰레기가 포크 프로세스에 사용되는 방식으로 작동하더라도 표준 그렇다고 말합니다 (Posix는 예를 들어 복사 된 쓰기라고 말하지 않습니다).

비표준 동작을 사용하는 대신 표준 측정을 사용하여 메모리를 공유 할 수 있습니다. 예를 들어, Posix는 메모리를 공유했습니다 shm_open 그리고 결과적으로 mmap (논평에서 지적되었고 그의 게시하다 ~에 의해 일시적인). 파일 디스크립터는 포킹을 통해 보존됩니다.

읽기 전용을 표시 할 필요가 없습니다. 자녀 프로세스를 내버려두기 만하면됩니다.

부모 나 자녀가 그것에 글을 쓰지 않으면 공유해야합니다. 당신이 그것을 바꾸고 싶지 않다면, 괜찮습니다.

글을 쓰고 싶다면 MAP_SHARD와 함께 MMAP를 사용하고 싶을 것입니다.

당신은 커널이 할 것이라고 가정하고 있습니다 복사기 최적화와 복사하지 않습니다 mprotect-ED 페이지. 그래도 나는 그것을 믿을 것입니다. malloc-ED 메모리에는 모든 종류의 메타 데이터 주위에 떠 다니는 메타 데이터가 있습니다. 가드 페이지 등.

디스크 파일에서 데이터를 준비하는 것이 더 쉽고 안전 할 것입니다. mmap 모든 프로세스에 들어가거나 정상적인 posix로 가십시오. shm_open 노선.

Linux는 하위 프로세스에 전달 된 메모리 페이지에 복사기 쓰기 메커니즘을 사용하기 때문에 내 이해는 그렇습니다.

당신은 그렇게 할 수 있습니다.

대안은 사용하는 것입니다 mmap ().

또 다른 대안은 POSIX 공유 메모리를 사용하는 것입니다 (shm_open ()); 다른 주요 대안은 시스템 v 공유 메모리입니다.shmget (), shmat ()). 공식적인 공유 메모리 시스템의 장점 중 하나는 상위 프로세스가 메모리를 만들 수 있고 관련없는 프로세스가 연결될 수 있다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top