다중 처리의 공유 메모리: 쓰기 시 복사 및 참조 계산 풀기
배경
멀티프로세싱의 세계에서 프로세스 간 데이터 공유는 여러 프로세스가 동일한 물리적 메모리에 액세스하는지 아니면 그 복사본을 처리하는지에 대한 중요한 질문을 제시합니다. Linux의 Copy-On-Write 개념과 참조 카운팅은 이러한 프로세스의 메모리 활용도를 결정하는 데 중요한 역할을 합니다.
문제 개요
다중 처리 시나리오에서 , 세 개의 큰 목록(하나는 비트 배열을 포함하고 다른 하나는 정수 배열을 포함)을 하위 프로세스 간에 공유할지 아니면 각 목록에 대해 복사할지 여부에 대한 의문이 제기됩니다. 하위 프로세스에는 목록에 대한 읽기 액세스만 필요하지만 데이터 구조의 크기가 커서 메모리 소비에 대한 우려가 있습니다.
Linux의 Copy-On-Write
Linux는 쓰기 시 복사 메모리 최적화를 활용합니다. 일반적으로 객체의 복사본을 생성할 때 새 복사본은 원본과 동일한 물리적 메모리 페이지를 공유합니다. 이러한 페이지 중 하나에 대한 모든 변경 사항은 먼저 새로운 독점 페이지에 복사되므로 이후 수정 사항은 하나의 엔터티에만 영향을 미칩니다. 이 최적화는 메모리 사용량과 잠재적인 데이터 손상을 줄입니다.
참조 카운팅
Python에서 각 객체에는 이를 참조하는 변수 수를 추적하는 참조 카운트가 있습니다. 참조 횟수가 0에 도달하면 가비지 수집기에 의해 개체가 삭제됩니다.
그러나 다중 처리의 경우 각 하위 프로세스는 공유 목록을 참조하는 자체 변수를 생성하여 참조 횟수를 효과적으로 늘립니다. 이로 인해 각 하위 프로세스에 대해 전체 목록이 복사되어 메모리 활용도가 크게 높아질 수 있습니다.
수수께끼
Linux의 쓰기 시 복사 메커니즘에도 불구하고 , 일반적인 오해는 목록이 하위 프로세스 간에 공유된다는 것입니다. 그러나 Python의 참조 계산에는 전체 개체가 복사될 가능성이 있습니다.
해결책: Python 3.8.0의 공유 메모리
다행히 Python 버전 3.8.0 복사할 필요 없이 여러 프로세스에 표시되는 메모리를 생성하는 메커니즘을 제공하는 '진정한' 공유 메모리를 도입했습니다. multiprocessing.shared_memory 모듈을 사용하면 개발자는 공유 메모리 블록을 할당하고 이러한 블록을 기반으로 하는 NumPy 배열을 생성하여 프로세스 간에 효율적인 데이터 공유를 가능하게 할 수 있습니다.
결론
다중 처리 시나리오에서는 쓰기 중 복사와 참조 계산의 상호 작용을 이해하는 것이 중요합니다. Linux는 메모리 사용을 최적화하지만 참조 계산으로 인해 여전히 과도한 복사가 발생할 수 있습니다. 대규모 데이터 구조의 경우 Python 3.8.0에 도입된 '진정한' 공유 메모리를 사용하면 복사 오버헤드 없이 효율적인 데이터 공유를 위한 안정적인 솔루션을 제공합니다.
위 내용은 Linux의 쓰기 중 복사 메커니즘을 고려할 때 Python의 참조 카운팅은 다중 처리에서 공유 메모리에 어떤 영향을 줍니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!