2011-01-19 2 views
4

제 질문은 아마도 저조한 말로 쓰여졌을 것이며 아마추어적인 기억 관리에 대한 이해에서 비롯된 것입니다.한 번의 데이터 변경으로 복사 된 것으로 표시된 모든 메모리가 복사됩니까?

내 관심사는 다음과 같습니다. 나는 여러 번 포크를하는 Perl 스크립트를 가지고 있습니다. perldoc의 포크 페이지에서 알 수 있듯이 copy-on-write가 구현되고 있습니다. 각 어린이는 system()으로 다시 전화를 걸어 외부 프로그램을 호출합니다. 외부 프로그램의 데이터는 자식으로 다시 읽어 들여지고 저장 가능한 파일로 덤프되며 모든 자식이 종료되면 부모가 수확하고 처리합니다.

내게 우려되는 것은이 상황에 대한 나의 인식 된 변동성입니다. 내 생각에 최악의 경우를 생각해 보자. 새로운 데이터가 도착하자마자 각 어린이들에게 전체 복사 - 기록 메모리가 잘 복사된다. 이 경우 몇 가지 포크를 작성한 후 신속하게 메모리 문제가 발생합니다.

그러나 필요한 경우 copy-on-write는 필요한 데이터가 들어있는 메모리의 가장 작은 부분만을 복사합니까? 그렇다면이 퀀텀은 무엇입니까? 크기는 어떻게 설정됩니까?

내가 묻는 내용이 언어에 종속적인지 또는 일부 하위 프로세스에 종속적인지 여부는 확실하지 않습니다.

답변

6

메모리는 페이지별로 구성되며 일반적으로 각각 4K입니다 (이 값은 다른 값으로 설정할 수 있으며 하드웨어에 따라 다르지만 표준 운영 체제의 Intel 플랫폼에서는 일반적입니다). 하위 프로세스가 쓰기 기록시 페이지에 기록하면 복사됩니다.

6

예, 포킹은 메모리 사용 공간을 늘립니다. 이것이 문제가되면 Parallel::ProcManager 또는 Forks::Super과 같은 활성 백그라운드 프로세스 수를 조절할 수있는 모듈을 사용하십시오. 활성 fork의 수를 제한하는 것은 프로세스가 CPU 바운드, I/O 바운드 또는 컴퓨터의 다른 제한된 리소스를 과도하게 사용하게 될 가능성이있는 경우에도 좋은 아이디어입니다.

use Forks::Super MAX_PROC => 10, ON_BUSY => block; 

... 
$pid = fork();  # blocks if there are already 10 child processes 
...     # unblocks when one of the children finishes 
+0

감사합니다. 포크 :: 슈퍼가 멋지다. – EMiller

+0

그러나 부모 프로세스가 자식 프로세스 (프로세스 제한 때문에 결코 시작되지 않음)에서 대기하는 경우 새 프로세스 생성을 차단하여 교착 상태를 만들 수 있습니다. – EmeryBerger

+0

하위 프로세스가 시작되지 않은 경우 프로세스 ID가 없으므로 기다릴 수 없습니다. 기존 자식 프로세스가 결국 끝나면 교착 상태가 발생하지 않습니다. – mob