IT박스

포크 대 스레딩

itboxs 2020. 12. 25. 09:07
반응형

포크 대 스레딩


이전에 응용 프로그램에서 스레딩을 사용했고 그 개념을 잘 알고 있었지만 최근에는 운영 체제 강의에서 fork ()를 발견했습니다. 스레딩과 비슷한 것입니다.

나는 그들 사이의 차이점을 Google에서 검색했으며 다음을 알게되었습니다.

  1. Fork는 이전 또는 상위 프로세스와 똑같이 보이는 새로운 프로세스에 불과하지만 여전히 프로세스 ID가 다르고 자체 메모리를 갖는 다른 프로세스입니다.
  2. 스레드는 오버 헤드가 적은 경량 프로세스입니다.

그러나 내 마음에는 여전히 몇 가지 질문이 있습니다.

  1. 언제 스레딩보다 fork ()를 선호해야합니까?
  2. 외부 응용 프로그램을 자식으로 호출하려면 fork () 또는 스레드를 사용해야합니까?
  3. Google 검색을 수행하는 동안 스레드 내부에서 fork ()를 호출하는 것이 좋지 않다고 말하는 사람들을 발견했습니다. 왜 사람들은 비슷한 일을 할 때 스레드 내에서 fork ()를 호출하고 싶어합니까?
  4. fork ()가 부모와 자식 프로세스가 동시에 실행되지 않기 때문에 다중 프로세서 시스템을 이용할 수 없다는 것이 사실입니까?

포크와 스레딩 방식의 주요 차이점은 운영 체제 아키텍처 중 하나입니다. Unix가 설계되었을 때, Forking은 메인 프레임 및 서버 유형 요구 사항을 가장 잘 충족하는 쉽고 간단한 시스템이었습니다. 따라서 Unix 시스템에서 대중화되었습니다. Microsoft는 NT 커널을 처음부터 다시 설계했을 때 스레딩 모델에 더 중점을 두었습니다. 따라서 오늘날에도 유닉스 시스템은 포크를 사용하는 것이 효율적이고 Windows는 스레드가 더 효율적이라는 점에서 주목할만한 차이가 있습니다. 가장 주목할만한 것은 Unix에서 prefork 전략을 사용하고 Windows에서 스레드 풀링을 사용하는 Apache에서 볼 수 있습니다.

특히 귀하의 질문에 :

언제 스레딩보다 fork ()를 선호해야합니까?

작업자를 인스턴스화하는 것보다 훨씬 더 복잡한 작업을 수행하거나 별도의 프로세스에 대한 암시 적 보안 샌드 박싱을 원하는 Unix 시스템에서.

외부 응용 프로그램을 자식으로 호출하려면 fork () 또는 스레드를 사용해야합니까?

자식이 부모와 동일한 코드로 동일한 작업을 수행 할 경우 fork를 사용합니다. 더 작은 하위 작업의 경우 스레드를 사용합니다. 별도의 외부 프로세스의 경우 둘 다 사용하지 말고 적절한 API 호출로 호출하십시오.

Google 검색을 수행하는 동안 스레드 내부에서 fork ()를 호출하는 것이 좋지 않다고 말하는 사람들을 발견했습니다. 왜 사람들은 비슷한 일을 할 때 스레드 내에서 fork ()를 호출하고 싶어합니까?

완전히 확실하지는 않지만 프로세스와 많은 하위 스레드를 복제하는 것이 계산적으로 다소 비싸다고 생각합니다.

fork ()가 부모와 자식 프로세스가 동시에 실행되지 않기 때문에 다중 프로세서 시스템을 이용할 수 없다는 것이 사실입니까?

이것은 거짓입니다. fork는 OS 작업 스케줄러의 프로세스에 사용할 수있는 모든 기능을 활용하는 새로운 프로세스를 생성합니다.


분기 된 프로세스는 무거운 프로세스라고하는 반면 스레드 된 프로세스는 경량 프로세스라고합니다.

다음은 그 차이입니다.

  1. 분기 된 프로세스는 자식 프로세스로 간주되는 반면 스레드 된 프로세스는 형제라고합니다.
  2. 분기 된 프로세스는 코드, 데이터, 스택 등과 같은 리소스를 부모 프로세스와 공유하지 않지만 스레드 된 프로세스는 코드를 공유 할 수 있지만 자체 스택이 있습니다.
  3. 프로세스 전환에는 OS의 도움이 필요하지만 스레드 전환은 필요하지 않습니다.
  4. 여러 프로세스를 만드는 것은 리소스 집약적 인 작업이지만 여러 스레드를 만드는 것은 리소스 집약적 인 작업입니다.
  5. 각 프로세스는 독립적으로 실행될 수 있지만 한 스레드는 다른 스레드 데이터를 읽고 쓸 수 있습니다. 스레드 및 프로세스 강의 여기에 이미지 설명 입력

fork()언급했듯이 프로세스의 새 복사본을 생성합니다. 위에 언급되지 않은 것은 exec()자주 따르는 부름입니다. 이것은 기존 프로세스를 새 프로세스 (새 실행 파일)로 대체하므로 fork()/ exec()는 이전 프로세스에서 새 프로세스를 생성하는 표준 수단입니다.

예를 들어 쉘이 명령 줄에서 프로세스를 호출하는 방법입니다. 당신은 당신의 프로세스 ( ls, 예를 들어)와 쉘 포크를 지정한 다음 execs를 지정 ls합니다.

이것은 스레딩과는 매우 다른 수준에서 작동합니다. 스레딩은 프로세스 내에서 여러 줄의 실행을 실행합니다. 포크는 새로운 프로세스 를 생성하는 수단입니다 .

참조 URL : https://stackoverflow.com/questions/16354460/forking-vs-threading

반응형