포크를 호출할 때 스레드가 복사됩니까?
스레드와 호출로 실행 중인 프로그램이 있는 경우fork()
유닉스 기반 시스템에서 스레드가 복사됩니까?현재 프로세스의 가상 메모리가 생성된 새 프로세스에 1:1로 복사되는 것으로 알고 있습니다.스레드는 프로세스의 가상 메모리에 자체 스택이 있다는 것을 알고 있습니다.따라서 적어도 스레드 스택도 복사해야 합니다.하지만 가상 메모리에 상주하지 않아 복사되지 않는 스레드가 더 있는지는 모르겠습니다.없는 경우 두 프로세스가 스레드를 공유합니까, 아니면 독립적인 복사본입니까?
아니요.
스레드가 복사되지 않음fork()
POSIX 사양은 다음과 같습니다(강조는 나의 것임을 강조함).
포크 - 새 프로세스 생성
프로세스는 단일 스레드로 생성되어야 합니다.멀티스레드 프로세스가 포크()를 호출하는 경우, 새 프로세스는 호출 스레드의 복제본과 전체 주소 공간(mutex 및 기타 리소스의 상태 포함)을 포함해야 합니다.따라서 오류를 방지하기 위해 자식 프로세스는 실행 함수 중 하나가 호출될 때까지 비동기 신호 안전 작업만 실행할 수 있습니다.
이 문제를 회피하기 위해,pthread_atfork()
도움이 되는 기능
맨 포크:
자식 프로세스는 포크()라는 스레드 하나로 만들어집니다.뮤텍스, 조건 변수 및 기타 pthread 개체의 상태를 포함하여 부모의 전체 가상 주소 공간이 자식에 복제됩니다. pthread_atfork(3)를 사용하면 이로 인해 발생할 수 있는 문제를 해결하는 데 도움이 될 수 있습니다.
공개 그룹 기반 사양 7호, 2018년판 포크에서:
프로세스는 단일 스레드로 생성되어야 합니다.멀티스레드 프로세스가 포크()를 호출하는 경우, 새 프로세스는 호출 스레드의 복제본과 전체 주소 공간(mutex 및 기타 리소스의 상태 포함)을 포함해야 합니다.따라서 오류를 방지하기 위해 자식 프로세스는 실행 함수 중 하나가 호출될 때까지 비동기 신호 안전 작업만 실행할 수 있습니다.
응용 프로그램이 신호 핸들러에서 포크()를 호출하고 pthread_atfork ()에 의해 등록된 포크 핸들러 중 하나가 비동기 신호 안전이 아닌 함수를 호출하면 동작이 정의되지 않습니다.
원래 "포크"는 작업을 디스크에 쓴 다음 다른 스레드에서 읽기(작업을 다른 스레드와 스왑할 경우 수행됨)하는 대신 메모리에 남아 있는 이미지의 작업 ID를 수정하고 실행을 계속함으로써 달성되었습니다.이것은 한 번에 하나의 작업만 RAM 메모리를 차지하는 기본 작업 전환 메커니즘에 대한 매우 간단한 수정이었습니다.
물론 메모리 관리가 더욱 정교해짐에 따라 이 체계는 새로운 환경에 맞게 수정되었습니다.
언급URL : https://stackoverflow.com/questions/61207217/are-threads-copied-when-calling-fork
'programing' 카테고리의 다른 글
쿼리 실행에서 테이블 열기 상태는 정확히 무엇입니까? (0) | 2023.08.04 |
---|---|
PL/SQL Developer의 실행 절차에 문제가 있습니다. (0) | 2023.08.04 |
문자열에서 영숫자가 아닌 모든 문자 바꾸기 (0) | 2023.07.30 |
PowerShell이 빈 배열을 배열로 반환하지 않음 (0) | 2023.07.30 |
MongoDB에서 이 스키마를 어떻게 구현해야 합니까? (0) | 2023.07.30 |