포크와 스레드의 차이점은 무엇입니까?


답변:


98

포크는 동일한 코드 세그먼트를 사용하여 현재 프로세스의 복사 본인 새로운 프로세스를 제공합니다. 메모리 이미지가 변경되면 (일반적으로 두 프로세스의 다른 동작으로 인해 발생) 메모리 이미지가 분리되지만 (쓰기시 복사) 실행 코드는 동일하게 유지됩니다. 작업은 일부 프로세스 간 통신 (IPC) 을 사용하지 않는 한 메모리를 공유하지 않습니다. 기본 요소 .

하나의 프로세스는 여러 스레드를 가질 수 있으며 각 스레드는 프로세스의 동일한 컨텍스트 내에서 병렬로 실행됩니다. 메모리 및 기타 리소스는 스레드간에 공유되므로 공유 데이터는 데이터 손상을 방지 할 수있는 일부 기본 및 동기화 개체 (예 : mutex , 조건 변수세마포어 )를 통해 액세스해야합니다 .


3
"현재 프로세스의 복사본"을 하위 프로세스로 참조 할 수 있습니다.

1
그러나 텍스트 세그먼트는 (가상으로) 공유되는 경우가 많으며 데이터 세그먼트도 기록시 복사 할 수 있습니다.
Jé Queue


77

포크

Fork는 이전 또는 상위 프로세스와 똑같이 보이는 새로운 프로세스에 불과하지만 여전히 프로세스 ID가 다르고 자체 메모리를 가진 다른 프로세스입니다. 부모 프로세스는 자식에 대해 별도의 주소 공간을 만듭니다. 부모 및 자식 프로세스는 모두 동일한 코드 세그먼트를 가지고 있지만 서로 독립적으로 실행됩니다.

분기의 가장 간단한 예는 Unix / Linux의 쉘에서 명령을 실행할 때입니다. 사용자가 명령을 실행할 때마다 쉘은 하위 프로세스를 분기하고 작업이 완료됩니다.

포크 시스템 호출이 발행되면 상위 프로세스에 해당하는 모든 페이지의 사본이 생성되고 하위 프로세스에 대해 OS에 의해 별도의 메모리 위치에로드되지만 경우에 따라 필요하지 않습니다. 'exec'시스템 호출과 마찬가지로 execv가 상위 프로세스 자체의 주소 공간을 대체하므로 상위 프로세스 페이지를 복사 할 필요가 없습니다.

포크에 대해주의해야 할 사항은 다음과 같습니다.

  • 하위 프로세스에는 고유 한 프로세스 ID가 있습니다.
  • 자식 프로세스는 부모의 파일 설명 자의 자체 복사본을 가져야합니다.
  • 부모 프로세스에 의해 설정된 파일 잠금은 자식 프로세스에 상속되지 않습니다.
  • 부모 프로세스에서 열려있는 모든 세마포어는 자식 프로세스에서도 열려야합니다.
  • 자식 프로세스는 부모의 메시지 큐 설명 자의 자체 복사본을 가져야합니다.
  • 자녀는 자신의 주소 공간과 메모리를 갖게됩니다.

스레드

스레드는 경량 프로세스 (LWP)입니다. 전통적으로 스레드는 나머지 (데이터, 스택, I / O, 신호)를 포함하는 프로세스가있는 CPU (및 기타 최소 상태) 상태입니다. 스레드는 시스템이 프로세스를위한 새 시스템 가상 메모리 공간 및 환경을 초기화하지 않기 때문에 "포킹"또는 새 프로세스를 생성하는 것보다 적은 오버 헤드를 필요로합니다. 프로세스 흐름이 다른 프로세서에서 실행되도록 예약하여 병렬 또는 분산 처리를 통해 속도를 얻을 수있는 다중 프로세서 시스템에서 가장 효과적이지만 I / O 및 프로세스를 중지 할 수있는 기타 시스템 기능의 지연을 이용하는 단일 프로세서 시스템에서도 이득을 볼 수 있습니다. 실행.

동일한 프로세스의 스레드는 다음을 공유합니다.

  • 프로세스 지침
  • 대부분의 데이터
  • 열린 파일 (설명자)
  • 신호 및 신호 처리기
  • 현재 작업 디렉토리
  • 사용자 및 그룹 ID

자세한 내용은 여기에서 확인할 수 있습니다 .


2
프로세스에는 여러 스레드가있을 수 있습니다. 프로세스의 스레드 중 하나가 fork를 호출하면 분기 된 프로세스에 완전히 복제 된 메모리가 있지만 호출 스레드 만 새 프로세스에 있습니까?
Michael


30

Dacav의 대답은 훌륭합니다. 모든 스레딩 모델이 진정한 다중 처리를 제공하지는 않는다는 점을 덧붙이고 싶었습니다.

예를 들어 Ruby의 기본 스레딩 구현은 실제 OS / 커널 스레드를 사용하지 않습니다. 대신 단일 커널 스레드 / 프로세스 내에서 Thread 개체 사이를 전환하여 여러 스레드를 갖는 것을 모방합니다.

이러한 유형의 경량 스레드는 단일 코어에서만 실행될 수 있기 때문에 다중 프로세서 / 다중 코어 시스템에서 중요합니다. 다중 스레드를 사용하여 성능을 크게 향상시킬 수는 없습니다.

이것이 차이를 만드는 또 다른 곳은 하나의 스레드가 블록 (I / O 대기 또는 드라이버의 IOCTL 호출), 모든 스레드 블록 일 때입니다.

이것은 요즘 흔하지 않습니다. 대부분의 스레딩 구현은 이러한 문제를 겪지 않는 커널 스레드를 사용하지만 완성도를 높이기 위해 언급 할 가치가 있습니다.

반대로 fork는 원래 프로세스가 실행되는 동안 다른 물리적 CPU에서 동시에 실행 가능한 또 다른 프로세스를 제공합니다. 어떤 사람들은 IPC가 앱에 더 적합하다고 생각하고 다른 사람들은 스레딩을 선호합니다.

행운을 빌고 재미있게 보내! 멀티 스레딩은 도전적이고 보람이 있습니다.


8
신경 타격 +1 : "모든 스레딩이 진정한 다중 처리를 제공하는 것은 아닙니다."
Dacav

5

스레드는 병렬로 실행되는 함수이고, 포크는 부모 상속이있는 새로운 프로세스입니다. 스레드는 병렬로 작업을 실행하는 것이 좋으며 포크는 동시에 실행되는 독립적 인 프로세스입니다. 스레드에는 경쟁 조건이 있고 세마포어와 잠금 또는 뮤텍스를 제어하며 파이프는 포크와 스레드에서 모두 사용할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.