Linux의 fork()는 전체 프로세스 힙을 즉시 복사합니까?

Linux의 fork()는 전체 프로세스 힙을 즉시 복사합니까?

fork()시스템 호출실행 중인 프로세스에서 하위 프로세스를 복제합니다. PID를 제외하면 두 프로세스는 동일합니다.

물론, 프로세스가 쓰기 대신 힙에서 읽기만 하는 경우 힙을 복사하면 많은 메모리가 낭비됩니다.

전체 프로세스 힙이 복사됩니까? 쓰기만 힙 복사를 트리거하는 방식으로 최적화되어 있나요?

답변1

Linux 커널은 fork()호출 시 Copy-on-Write를 구현합니다. 부모와 자식이 공유하는 페이지는 시스템 호출이 이루어질 때 읽기 전용으로 표시됩니다.

읽기 전용 페이지에서 쓰기 작업을 수행하면 두 프로세스 간의 메모리가 더 이상 동일하지 않기 때문에 페이지가 복사됩니다. 따라서 읽기 작업만 수행하면 페이지가 전혀 복사되지 않습니다.

답변2

이것전반적인of는 fork()mmap/copy on write를 사용하여 구현됩니다.

이는 힙뿐만 아니라 공유 라이브러리, 스택, BSS 영역에도 영향을 미칩니다.

그런데 이는 생성된 2개의 프로세스(상위 및 하위)가 실제로 메모리 범위에 쓰기를 시작할 때까지 포크가 매우 가벼운 작업임을 의미합니다. 이 기능은 포크 폭탄의 치사율을 높이는 주요 요소입니다. 페이지 복사 및 비교로 인해 커널이 과부하되기 전에 너무 많은 프로세스가 발생하게 됩니다.

최신 운영 체제(장치 드라이버는 예외)에서 커널이 무언가의 하드 카피를 수행하는 예를 찾기 어려울 것입니다. 가상 머신 기능을 사용하는 것이 훨씬 쉽고 효율적입니다.

Even은 execve()본질적으로 "바이너리 /ld.so/whatever를 mmap한 다음 실행하십시오"입니다. VM은 실제로 프로세스를 RAM에 로드하고 실행하는 일을 담당합니다. 초기화되지 않은 로컬 변수는 궁극적으로 "제로 페이지"(0을 포함하는 특수 읽기 전용 쓰기 시 복사 페이지)에서 매핑되고 로컬 초기화 변수는 궁극적으로 바이너리 자체(다시 쓰기 시 복사)에서 매핑됩니다.

답변3

Linux에서는 쓰기 중 복사 기능을 제공합니다. fork새 프로세스가 생성되면 할당된 페이지는 읽기 전용으로 표시되고 상위 프로세스와 하위 프로세스 간에 공유됩니다. 이들 중 하나가 페이지를 수정하려고 시도하면 페이지 부재가 생성되어 페이지가 복사되고 페이지 테이블이 적절하게 조정됩니다.

관련 정보