포크와 실의 차이점은 무엇입니까?
누가 포크와 실의 차이를 설명할 수 있나요?
포크는 동일한 코드 세그먼트를 가진 현재 프로세스의 복사본인 완전히 새로운 프로세스를 제공합니다.메모리 이미지가 변경되면(일반적으로 두 프로세스의 동작이 다르기 때문에), 메모리 이미지가 분리되지만(Copy On Write), 실행 가능한 코드는 그대로 유지됩니다.IPC(Inter Process Communication) 프리미티브를 사용하지 않는 한 태스크는 메모리를 공유하지 않습니다.
하나의 프로세스에는 여러 스레드가 있을 수 있으며 각 스레드는 프로세스의 동일한 컨텍스트 내에서 병렬로 실행됩니다.메모리 및 기타 리소스는 스레드 간에 공유되므로 데이터 손상을 방지하기 위해 일부 원시 및 동기화 개체(뮤텍스, 조건 변수 및 세마포어 등)를 통해 공유 데이터에 액세스해야 합니다.
포크
포크는 이전 프로세스 또는 상위 프로세스와 똑같이 보이는 새로운 프로세스에 불과하지만 프로세스 ID가 다르고 자체 메모리가 있는 다른 프로세스입니다.부모 프로세스는 자녀에 대해 별도의 주소 공간을 만듭니다.부모 프로세스와 자녀 프로세스 모두 동일한 코드 세그먼트를 가지고 있지만 서로 독립적으로 실행됩니다.
포킹의 가장 간단한 예는 Unix/Linux에서 셸에서 명령을 실행하는 경우입니다.사용자가 명령을 실행할 때마다 셸은 하위 프로세스를 포크하고 작업을 수행합니다.
포크 시스템콜이 발행되면 부모 프로세스에 대응하는 모든 페이지의 복사가 작성되어 OS에 의해 자녀 프로세스용으로 별도의 메모리 위치에 로드되지만 경우에 따라서는 이것이 필요하지 않습니다.exec 시스템 호출과 마찬가지로 execv가 부모 프로세스 자체의 주소 공간을 대체하므로 부모 프로세스 페이지를 복사할 필요가 없습니다.
포킹에 관한 주의사항은 다음과 같습니다.
- 하위 프로세스에는 고유한 프로세스 ID가 있습니다.
- 자식 프로세스에는 부모 파일 기술자의 자체 복사본이 있어야 합니다.
- 상위 프로세스에 의해 설정된 파일 잠금은 하위 프로세스에 의해 상속되지 않습니다.
- 상위 프로세스에서 열려 있는 세마포는 하위 프로세스에서도 열려야 합니다.
- 자녀 프로세스는 부모의 메시지 큐 기술자의 자체 복사본을 가져야 합니다.
- 아이에게는 독자적인 주소 공간과 메모리가 있습니다.
스레드
스레드는 경량 프로세스(LWP)입니다.일반적으로 스레드는 CPU(및 기타 최소 상태) 상태이며 나머지(데이터, 스택, I/O, 신호)가 포함된 프로세스입니다.스레드는 새로운 프로세스의 가상 메모리 공간과 환경을 초기화하지 않기 때문에 새로운 프로세스를 "포킹"하거나 생성하는 것보다 오버헤드가 적습니다.프로세스 플로우가 다른 프로세서에서 실행되도록 스케줄링할 수 있는 멀티프로세서 시스템에서 가장 효과적이며 병렬 또는 분산 프로세싱을 통해 속도를 높일 수 있지만 I/O 지연 및 프로세스 실행을 중지할 수 있는 기타 시스템 기능을 이용하는 단일 프로세서 시스템에서도 이점이 발견됩니다.
동일한 프로세스의 스레드 공유:
- 처리 명령
- 대부분의 데이터
- 열린 파일(프로세서)
- 신호 및 신호 핸들러
- 현재 작업 디렉토리
- 사용자 및 그룹 ID
자세한 내용은 여기를 참조하십시오.
Dacav의 답변은 훌륭합니다. 저는 단지 모든 스레드화 모델이 진정한 멀티 프로세싱을 제공하는 것은 아니라는 것을 덧붙이고 싶었습니다.
예를 들어, Ruby의 디폴트 스레드 구현에서는 진정한 OS/커널 스레드를 사용하지 않습니다.대신 단일 커널 스레드/프로세스 내에서 스레드 오브젝트를 전환함으로써 여러 스레드가 있는 것처럼 보입니다.
이는 멀티프로세서/멀티코어 시스템에서 중요합니다.이러한 종류의 경량 스레드는 단일 코어에서만 실행할 수 있기 때문입니다.여러 스레드를 사용해도 퍼포먼스가 크게 향상되지 않습니다.
또 다른 차이점은 하나의 스레드 블록(I/O 대기 또는 드라이버의 IOCTL 호출)이 모두 스레드 블록인 경우입니다.
이것은 오늘날에는 그다지 흔하지 않습니다.대부분의 스레드 실장에서는 이러한 문제에 시달리지 않는 커널 스레드를 사용하고 있습니다만, 완전성을 위해 조언할 가치가 있습니다.
반면 포크는 원래 프로세스가 실행되는 동안 다른 물리적 CPU에서 동시에 실행할 수 있는 다른 프로세스를 제공합니다.IPC가 앱에 더 적합하다고 생각하는 사람도 있고 스레드를 선호하는 사람도 있습니다.
행운을 빌고 재미있게 놀아요!멀티스레딩은 힘들고 보람이 있습니다.
스레드는 병렬로 실행되는 함수이며, 포크는 부모 상속이 있는 새로운 프로세스입니다.스레드는 작업을 병렬로 실행하는 데 유용하지만 포크는 동시에 실행되는 독립 프로세스입니다.스레드에는 레이스 조건이 있으며 세마포, 잠금 장치 또는 뮤텍스 컨트롤이 있습니다.파이프는 포크와 스레드에 모두 사용할 수 있습니다.
언급URL : https://stackoverflow.com/questions/2483041/what-is-the-difference-between-fork-and-thread
'programing' 카테고리의 다른 글
iOS 오류 코드 70에서 프로젝트를 빌드할 수 없습니다. 어떻게 수정합니까? (0) | 2022.07.03 |
---|---|
vue 테이블을 구현하는 동안 템플릿을 컴파일하는 동안 오류 인스턴스 대신 "exported value" 오류가 발생했습니다. (0) | 2022.07.03 |
VueJ에서 모든 사용자 지정 이벤트를 청취하는 방법 (0) | 2022.07.02 |
vue.이것 좀 봐주세요.$120 정의되지 않음 (0) | 2022.07.02 |
일반적인 실장에서는 동적 메모리 할당이 C와 C++로 다른가요? (0) | 2022.07.02 |