포크를 호출 할 때 스레드가 복사됩니까?


31

스레드로 실행중인 프로그램이 fork()있고 유닉스 기반 시스템에서 호출 하면 스레드가 복사됩니까? 현재 프로세스의 가상 메모리가 생성 된 새 프로세스에 1 : 1로 복사된다는 것을 알고 있습니다. 스레드가 프로세스의 가상 메모리에 자체 스택을 가지고 있음을 알고 있습니다. 따라서 최소한 스레드 스택도 복사해야합니다. 그러나 가상 메모리에 상주하지 않아 복사되지 않는 스레드에 더 많은 것이 있는지 알 수 없습니다. 없는 경우 두 프로세스가 스레드를 공유합니까, 아니면 독립 사본입니까?

답변:


29

아니.

스레드는에 복사되지 않습니다 fork(). POSIX 사양에 따르면 (강조 표시) :

포크-새로운 프로세스를 만듭니다

프로세스는 단일 스레드로 작성되어야합니다 . 멀티 스레드 프로세스가 fork ()를 호출하는 경우, 새로운 프로세스는 호출 스레드의 복제본과 전체 주소 공간 (가능하면 뮤텍스 및 기타 리소스 상태 포함)을 포함해야합니다. 결과적으로, 오류를 피하기 위해, 자식 프로세스는 exec 함수 중 하나가 호출 될 때까지 비동기 신호 안전 조작 만 실행할 수 있습니다.

이 문제를 피하기 pthread_atfork()위해 도움 이되는 기능 이 있습니다 .


7

남자 포크 :

자식 프로세스는 단일 스레드 (fork ()라고하는 스레드)로 만들어집니다. 뮤텍스의 상태, 조건 변수 및 기타 pthread 객체를 포함하여 부모의 전체 가상 주소 공간이 자식에 복제됩니다. pthread_atfork (3)를 사용하면 이로 인해 발생할 수있는 문제를 처리하는 데 도움이 될 수 있습니다.


그러나 그것은 이상하게 보입니다. 실제 스레드 (가상 메모리 이외의 저장소가 포함되어 있지 않음)가 아닌 경우 프로세스 호출 포크의 스레드 스택이 복사되는 이유는 무엇입니까?

글쎄, 그 이유 는 완전히 다른 질문입니다. 나는 그 구현으로 이어진 원래의 디자인 결정을 모른다. 관심이 있다면 별도의 질문으로 질문해야합니다.
kaylum

@ dip이지만 다른 스레드의 스택은 복사되지 않습니다. 누가 그렇게 말했습니까?
Jean-Baptiste Yunès

1
@ Jean-BaptisteYunès 유닉스 시스템에는 프로세스의 가상 메모리를 나타내는 구조체가 있습니다. 그것이 복사 된 것입니다. 힙과

6
전체 메모리 공간과 모든 스레드의 스택을 얻습니다. 나머지 스레드가 액세스 할 수있는 스택 (또는 정적 메모리)에있는 포인터가 가리키는 위치에 대한 제한이 없기 때문에 원래 프로세스에서 일부 스레드의 스택에있는 데이터를 가리키는 것일 수 있습니다
davidbak

4

Open Group Base 사양 Issue 7, 2018 버전의 포크에서 :

프로세스는 단일 스레드로 작성해야합니다. 멀티 스레드 프로세스가 fork ()를 호출 하면 새로운 프로세스는 호출 스레드의 복제본과 전체 주소 공간 (가능하면 뮤텍스 및 기타 리소스 상태 포함)을 포함해야합니다. 결과적으로, 오류를 피하기 위해, 자식 프로세스는 exec 함수 중 하나 가 호출 될 때까지 비동기 신호 안전 조작 만 실행할 수 있습니다 .

애플리케이션 통화시 포크 () 신호 처리기에 의해 등록 된 포크 핸들러에서 어떤 pthread_atfork 명령 ()가 없는 비동기 신호 안전한 함수를 호출하는 동작이 정의되지 않는다.


-2

원래 "포크"는 작업을 디스크에 기록한 다음 다른 스레드 (작업을 다른 스레드로 교체 할 경우 수행)를 읽지 않고 여전히 메모리에있는 이미지의 작업 ID를 수정하고 계속하는 것이 아니라 달성되었습니다. 실행으로 (새 작업으로). 한 번에 하나의 작업 만 RAM 메모리를 차지하는 기본 작업 전환 메커니즘을 매우 간단하게 수정했습니다.

물론 메모리 관리가 더욱 정교 해지면서이 체계는 새로운 환경에 맞게 수정되었습니다.


왜 이것이 투표가 어려운지 궁금합니다. 이것이 유닉스의 방식입니다.
핫 릭

이것은 흥미로운 통찰력이지만 스레드를 어디에서 언급합니까? 나에게는 답이 아닌 것 같습니다.
wastl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.