프로세스와 스레드의 차이점은 무엇입니까?


1640

프로세스와 스레드의 기술적 차이점은 무엇입니까?

'프로세스'와 같은 단어가 과도하게 사용되었다는 느낌이 들며 하드웨어 및 소프트웨어 스레드도 있습니다. Erlang 과 같은 언어의 경량 프로세스는 어떻습니까? 한 용어를 다른 용어보다 사용해야하는 확실한 이유가 있습니까?



4
아마도 각 OS마다 '스레드'또는 '프로세스'에 대한 아이디어가 다릅니다. 일부 주류 OS에는 '스레드'라는 개념이 없으며 '스레드'만있는 일부 임베디드 OS도 있습니다.
Neil

답변:


1457

프로세스와 스레드는 모두 독립적 인 실행 순서입니다. 일반적인 차이점은 동일한 프로세스의 스레드가 공유 메모리 공간에서 실행되고 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.

"하드웨어"와 "소프트웨어"스레드 중 무엇을 참조하는지 잘 모르겠습니다. 스레드는 CPU 기능이 아닌 운영 환경 기능입니다 (CPU에는 일반적으로 스레드를 효율적으로 만드는 작업이 있지만).

Erlang은 공유 메모리 멀티 프로그래밍 모델을 노출하지 않기 때문에 "프로세스"라는 용어를 사용합니다. "스레드"라고 부르면 메모리를 공유 한 것입니다.


56
하드웨어 스레드는 코어 내의 여러 스레드 컨텍스트 (예 : HyperThreading, SMT, Sun 's Niagara / Rock)를 참조합니다. 이는 중복 된 레지스터 파일, 파이프 라인을 통한 명령과 함께 전달되는 추가 비트 및 기타 복잡한 우회 / 전달 논리를 의미합니다.
Matt J

4
@greg, 스레드에 의심의 여지가 있습니다. RAM에 약간의 공간을 확보 한 프로세스 A가 있다고 가정하겠습니다. 프로세스 A가 스레드를 작성하는 경우 스레드도 실행할 공간이 필요합니다. 프로세스 A에 대해 생성 된 공간 또는 다른 곳에서 작성된 스레드에 대한 공간의 크기가 증가합니까? 가상 공간 프로세스는 무엇을 만드는가? 내 질문이 틀렸다면 저를 정정하십시오. 감사합니다
duslabo

9
@JeshwanthKumarNK : 새 스레드를 만들면 새 스택에 충분한 메모리가 할당됩니다. 이 메모리는 프로세스 A의 OS에 의해 할당
그렉 Hewgill를

24
이 답변은 잘못된 것 같습니다. 프로세스와 스레드가 모두 독립적 인 실행 순서 인 경우 두 개의 스레드가 포함 된 프로세스는 3 개의 실행 순서를 가져야하며 이는 맞지 않습니다. 스레드 만 실행 시퀀스입니다. 프로세스는 하나 이상의 실행 시퀀스를 보유 할 수있는 컨테이너입니다.
David Schwartz

8
"하드웨어 스레드"는 개별 하드웨어 리소스 (별도의 코어, 프로세서 또는 하이퍼 스레드)가 제공되는 스레드입니다. "소프트웨어 스레드"는 동일한 처리 능력을 위해 경쟁해야하는 스레드입니다.
jpmc26

811

프로세스
각 프로세스는 프로그램을 실행하는 데 필요한 리소스를 제공합니다. 프로세스에는 가상 주소 공간, 실행 코드, 시스템 개체에 대한 열린 핸들, 보안 컨텍스트, 고유 한 프로세스 식별자, 환경 변수, 우선 순위 클래스, 최소 및 최대 작업 세트 크기 및 하나 이상의 실행 스레드가 있습니다. 각 프로세스는 기본 스레드라고도하는 단일 스레드로 시작되지만 모든 스레드에서 추가 스레드를 작성할 수 있습니다.

스레드
스레드는 프로세스 내에서 실행 예약 될 수있는 엔티티입니다. 프로세스의 모든 스레드는 가상 주소 공간과 시스템 리소스를 공유합니다. 또한 각 스레드는 예외 처리기, 예약 우선 순위, 스레드 로컬 저장소, 고유 한 스레드 식별자 및 시스템이 예약 될 때까지 스레드 컨텍스트를 저장하는 데 사용할 구조 집합을 유지 관리합니다. 스레드 컨텍스트에는 스레드의 시스템 레지스터 세트, 커널 스택, 스레드 환경 블록 및 스레드 프로세스의 주소 공간에있는 사용자 스택이 포함됩니다. 스레드는 또한 클라이언트를 가장하는 데 사용할 수있는 자체 보안 컨텍스트를 가질 수 있습니다.


이 정보는 Microsoft 문서에서 찾을 수 있습니다. 프로세스 및 스레드 정보

Microsoft Windows는 선점 형 멀티 태스킹을 지원하므로 여러 프로세스에서 여러 스레드를 동시에 실행할 수 있습니다. 다중 프로세서 컴퓨터에서 시스템은 컴퓨터에 프로세서가있는 수만큼 스레드를 동시에 실행할 수 있습니다.


18
플로피를 동시에 포맷 할 수없는 이유를 알고 싶은 사람들을 위해 : stackoverflow.com/questions/20708707/…
Computernerd

7
@LuisVasconcellos-스레드가 없으면 프로세스가 아무것도하지 않습니다. 프로세스는 메모리에로드 된 일부 코드 및 프로그램 상태 일뿐입니다. 많이 사용하지 않습니다. 차량이없는 도로를 따라 이동하는 것과 같습니다.
Scott Langham

4
@LuisVasconcellos-좋아. 예, 스레드를 프로세스 코드를 통해 이동하고 해당 코드의 지침을 수행하는 것으로 생각할 수 있습니다.
Scott Langham

9
이 답변은 프로세스와 스레드 의 이상 에 대해 이야기하기 때문에 허용되는 답변보다 훨씬 낫습니다 . 별도의 문제가있는 별도의 것이어야합니다. 사실, 대부분의 운영 체제는 스레드의 발명보다 훨씬 더 오래된 역사를 가지고 있으며, 결과적으로 대부분의 운영 체제에서 이러한 문제는 시간이 지남에 따라 천천히 개선 되더라도 여전히 다소 얽혀 있습니다.
Solomon Slow

4
@BKSpurgeon 설명 할 때마다 독자를 한 수준의 이해 수준에서 다음 수준으로 끌어 올려야합니다. 불행히도, 나는 모든 독자들에게 답을 맞출 수 없으므로 지식 수준을 가정해야합니다. 모르는 사람들은 이해하지 못하는 기준점에 도달 할 때까지 내가 이해하지 못하는 용어를 더 많이 검색 할 수 있습니다. 나는 당신이 당신의 자신의 대답을 제안 할 것이지만, 당신이 이미 가지고있는 것을 보게되어 기쁘다.
Scott Langham

301

방법:

  • 프로그램의 실행 인스턴스를 프로세스라고합니다.
  • 일부 운영 체제는 '작업'이라는 용어를 사용하여 실행중인 프로그램을 나타냅니다.
  • 프로세스는 항상 주 메모리 또는 기본 액세스 메모리라고도하는 주 메모리에 저장됩니다.
  • 따라서 프로세스를 활성 엔티티라고합니다. 컴퓨터가 재부팅되면 사라집니다.
  • 여러 프로세스가 동일한 프로그램과 연관 될 수 있습니다.
  • 다중 프로세서 시스템에서 여러 프로세스를 병렬로 실행할 수 있습니다.
  • 단일 프로세서 시스템에서는 진정한 병렬 처리가 이루어지지는 않지만 프로세스 스케줄링 알고리즘이 적용되고 프로세서는 동시 처리의 착오를 일으키는 각 프로세스를 한 번에 하나씩 실행하도록 예약됩니다.
  • 예 : '계산기'프로그램의 여러 인스턴스를 실행합니다. 각 인스턴스를 프로세스라고합니다.

실:

  • 스레드는 프로세스의 하위 집합입니다.
  • 실제 프로세스와 비슷하지만 프로세스 컨텍스트 내에서 실행되고 커널이 프로세스에 할당 한 동일한 리소스를 공유하므로 '경량 프로세스'라고합니다.
  • 일반적으로 프로세스에는 한 번에 하나의 시스템 명령어 세트 만 실행되는 제어 스레드가 하나만 있습니다.
  • 프로세스는 명령을 동시에 실행하는 여러 실행 스레드로 구성 될 수도 있습니다.
  • 다중 제어 스레드는 다중 프로세서 시스템에서 가능한 진정한 병렬 처리를 이용할 수 있습니다.
  • 단일 프로세서 시스템에서는 스레드 예약 알고리즘이 적용되고 프로세서는 각 스레드를 한 번에 하나씩 실행하도록 예약됩니다.
  • 프로세스 내에서 실행되는 모든 스레드는 동일한 주소 공간, 파일 설명자, 스택 및 기타 프로세스 관련 속성을 공유합니다.
  • 프로세스의 스레드는 동일한 메모리를 공유하므로 프로세스 내에서 공유 데이터에 대한 액세스를 동기화하면 전례없는 중요성을 얻게됩니다.

지식 퀘스트 에서 위의 정보를 빌 렸습니다 ! 블로그 .


90
Kumar : 내 지식으로는 스레드가 동일한 스택을 공유하지 않습니다. 그렇지 않으면 각각에 대해 다른 코드를 실행할 수 없습니다.
Mihai Neacsu

27
네, @MihaiNeacsu가 옳다고 생각합니다. 스레드는 "코드, 데이터 및 파일"을 공유하고 자체 "레지스터 및 스택"을 갖습니다. 내 OS 과정에서 슬라이드 : i.imgur.com/Iq1Qprv.png
Shehaaz

이것은 스레드와 프로세스가 무엇이며 서로 어떻게 관련되어 있는지에 따라 확장되므로 매우 유용합니다. 스레드에 대한 예제를 추가하는 것이 좋습니다. 특히 프로세스에 대한 예제가 있기 때문입니다. 좋은 물건!
Smithers 2016 년

1
Kquest.co.cc 링크가 죽었습니다.
Elijah Lynn

1
@ Rndp13 문제는 "스택"대신 "스택"이라는 단어를 사용하는 것입니다. 스택은 가상 메모리의 일부이고 스레드는 모든 가상 메모리를 공유하므로 스레드는 스택을 공유합니다. 스레드는 스택 포인터를 숨길 수 있으며 문제없이 다른 스레드에서 실행을 다시 시작할 수 있습니다. 하나의 스레드가 특정 시간에 하나의 스택을 실행한다는 것은 하나의 스레드가 한 번에 파일 디스크립터에서 작동한다는 사실과 마찬가지로 스레드가 파일 디스크립터를 공유하지 않는다는 의미와 같이 스레드가 스택을 공유하지 않는다는 의미는 아닙니다 .
David Schwartz

127

먼저 이론적 인 측면을 살펴 보자. 프로세스와 스레드 간의 차이점과 프로세스간에 공유되는 것을 이해하려면 프로세스가 개념적으로 무엇인지 이해해야합니다.

Tanenbaum의 2.2.2 절 에서 최신 운영 체제 의 클래식 스레드 모델 을 살펴 보았습니다.

프로세스 모델은 리소스 그룹화 및 실행이라는 두 가지 독립적 인 개념을 기반으로합니다. 때때로 그것들을 분리하는 것이 유용합니다; 이곳은 실이 들어오는 곳입니다.

그는 계속한다:

프로세스를 보는 한 가지 방법은 관련 리소스를 그룹화하는 방법입니다. 프로세스에는 프로그램 텍스트와 데이터 및 기타 리소스가 포함 된 주소 공간이 있습니다. 이러한 리소스에는 열린 파일, 하위 프로세스, 보류중인 경보, 신호 처리기, 계정 정보 등이 포함될 수 있습니다. 프로세스 형태로 구성하면보다 쉽게 ​​관리 할 수 ​​있습니다. 프로세스가 갖는 다른 개념은 실행 스레드이며 일반적으로 스레드로 단축됩니다. 스레드에는 다음에 실행할 명령을 추적하는 프로그램 카운터가 있습니다. 현재 작업 변수를 보유하는 레지스터가 있습니다. 스택에는 실행 기록이 포함되어 있으며 각 프로 시저에 대해 하나의 프레임이 호출되었지만 아직 리턴되지 않았습니다. 스레드는 일부 프로세스에서 실행되어야하지만 스레드와 프로세스는 서로 다른 개념이며 별도로 처리 할 수 ​​있습니다. 프로세스는 자원을 함께 그룹화하는 데 사용됩니다. 스레드는 CPU에서 실행되도록 예약 된 엔티티입니다.

아래로 그는 다음 표를 제공합니다.

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

하드웨어 멀티 스레딩 문제를 다루겠습니다 . 일반적으로 CPU는 단일 프로그램 스레드 및 레지스터 세트를 통해 스레드 상태를 유지하면서 단일 실행 스레드를 지원합니다. 그러나 캐시 미스가 발생하면 어떻게됩니까? 메인 메모리에서 데이터를 가져 오는 데 오랜 시간이 걸리며, 그 동안 CPU가 유휴 상태에 있습니다. 따라서 누군가는 기본적으로 두 개의 스레드 상태 세트 (PC + 레지스터)를 가지고있어 다른 스레드 (아마 같은 프로세스에 있거나 다른 프로세스에있을 수 있음)가 다른 스레드가 주 메모리를 기다리는 동안 작업을 수행 할 수 있다고 생각했습니다. 이 개념의 HyperThreading 및 Simultaneous Multithreading (SMT) 과 같은 여러 이름과 구현이 있습니다.

이제 소프트웨어 측면을 보자. 소프트웨어 측에서 스레드를 구현할 수있는 방법은 기본적으로 세 가지가 있습니다.

  1. 사용자 공간 스레드
  2. 커널 스레드
  3. 이 둘의 조합

스레드를 구현하기 위해서는 CPU 상태를 저장하고 여러 스택을 유지 관리하는 기능 만 있으면됩니다. 많은 경우 사용자 공간에서 수행 할 수 있습니다. 사용자 공간 스레드의 장점은 커널에 갇히지 않아도되고 원하는 방식으로 스레드를 예약 할 수 있으므로 초고속 스레드 전환입니다. 가장 큰 단점은 I / O를 차단할 수 없다는 것 (전체 프로세스와 모든 사용자 스레드)을 차단할 수 없다는 것인데, 이는 처음에 스레드를 사용하는 큰 이유 중 하나입니다. 스레드를 사용하여 I / O를 차단하면 많은 경우 프로그램 설계가 크게 간소화됩니다.

커널 스레드는 모든 스케줄링 문제를 OS에 남기는 것 외에도 I / O 차단을 사용할 수 있다는 이점이 있습니다. 그러나 각 스레드 스위치는 잠재적으로 상대적으로 느린 커널에 트래핑해야합니다. 그러나 I / O 차단으로 인해 스레드를 전환하는 경우 I / O 작업이 이미 커널에 이미 갇혀 있기 때문에 실제로 문제가되지 않습니다.

다른 접근 방식은이 둘을 각각 여러 사용자 스레드를 갖는 여러 커널 스레드와 결합하는 것입니다.

따라서 용어에 대한 질문으로 돌아가서, 프로세스와 실행 스레드는 서로 다른 두 가지 개념이며 사용하려는 용어를 선택하는 것은 말하는 내용에 따라 다릅니다. "가벼운 프로세스"라는 용어와 관련하여, 나는 실제로 무슨 일이 일어나고 있는지와 "실행 스레드"라는 용어를 전달하지 않기 때문에 개인적으로 그 요점을 알지 못합니다.


4
탁월한 답변! 그것은 많은 전문 용어와 가정을 세분화합니다. 그래도이 라인은 어색한 것으로 눈에 : 다. "누군가는 기본적으로 두 개의 스레드 상태 세트 (PC + 레지스터)를 갖고 있다는 생각을 가지고있었습니다."-여기서 "PC"란 무엇입니까?
Smithers 2016 년

2
@Smithers PC는 프로그램 카운터 또는 명령 포인터로, 다음에 실행될 명령의 주소를 제공합니다. en.wikipedia.org/wiki/Program_counter
Robert S. Barnes


"스택"이 "프로세스 항목 별"에 표시되지 않는 이유는 무엇입니까? 프로세스와 스레드 모두 자체 스택이 있습니다.
stackoverflowuser2010

1
@ stackoverflowuser2010 스레드에만 스택이 없습니다. 프로세스라고하는 것은 단일 실행 스레드가있는 프로세스이며 프로세스가 아닌 스택이있는 스레드입니다.
Robert S. Barnes

100

동시 프로그래밍에 대한 자세한 설명

  1. 프로세스에는 자체 포함 된 실행 환경이 있습니다. 프로세스에는 일반적으로 완전한 비공개 기본 런타임 리소스 세트가 있습니다. 특히, 각 프로세스에는 자체 메모리 공간이 있습니다.

  2. 프로세스 내에 스레드가 존재합니다. 모든 프로세스에는 하나 이상의 프로세스가 있습니다. 스레드는 메모리 및 열린 파일을 포함하여 프로세스의 리소스를 공유합니다. 이것은 효율적이지만 문제가되는 의사 소통을 가능하게합니다.

평범한 사람을 염두에두고

컴퓨터에서 Microsoft Word 및 웹 브라우저를 엽니 다. 우리는이 두 프로세스를 호출 합니다 .

Microsoft 단어에서는 무언가를 입력하면 자동으로 저장됩니다. 이제 한 스레드에서 편집하고 다른 스레드에서 저장하는 편집 및 저장이 동시에 수행되는 것을 관찰했습니다.


14
탁월한 답변은 일을 단순하게 유지하며 질문을 보는 모든 사용자가 관련시킬 수있는 예를 제공합니다.
Smithers 2016 년

7
편집 / 저장은 프로세스 내부의 여러 스레드에 대한 좋은 예입니다!

53

응용 프로그램은 하나 이상의 프로세스로 구성됩니다. 가장 간단한 용어로 프로세스는 실행 프로그램입니다. 프로세스 컨텍스트에서 하나 이상의 스레드가 실행됩니다. 스레드는 운영 체제가 프로세서 시간을 할당하는 기본 단위입니다. 스레드는 현재 다른 스레드에서 실행중인 부분을 포함하여 프로세스 코드의 모든 부분을 실행할 수 있습니다. 파이버는 응용 프로그램에서 수동으로 예약해야하는 실행 단위입니다. 파이버는 스레드를 예약하는 스레드의 컨텍스트에서 실행됩니다.

여기 에서 도난당했습니다 .


Linux와 같은 다른 운영 체제에서는 스레드가 일반적으로 상위 프로세스와 동일한 메모리 공간을 공유한다는 점을 제외하고 운영 체제 레벨에서 둘 사이에 실질적인 차이가 없습니다. (따라서 나의 downvote)
Arafangion

1
좋은 답변 (특히 신용과 함께)은 두 사람과 segue 사이의 관계를 쉽게 예상되는 "다음 질문"(섬유에 관한)으로 보여줍니다.
Smithers 2016 년

29

프로세스는 코드, 메모리, 데이터 및 기타 리소스의 모음입니다. 스레드는 프로세스 범위 내에서 실행되는 일련의 코드입니다. 동일한 프로세스 내에서 여러 스레드가 동시에 실행되도록 할 수 있습니다.


27

Process and Thread에 대한 실제 예제 이것은 스레드와 프로세스에 대한 기본 아이디어를 제공합니다. 여기에 이미지 설명을 입력하십시오

Scott Langham의 답변에서 위의 정보를 빌 렸습니다 -감사합니다


25

방법:

  1. 프로세스는 무거운 프로세스입니다.
  2. 프로세스는 별도의 메모리, 데이터, 리소스 등을 가진 별도의 프로그램입니다.
  3. 프로세스는 fork () 메소드를 사용하여 작성됩니다.
  4. 프로세스 간 컨텍스트 전환은 시간이 많이 걸립니다.

예 :
모든 브라우저 (mozilla, Chrome, IE)를 엽니 다. 이 시점에서 새로운 프로세스가 실행되기 시작합니다.

스레드 :

  1. 스레드는 가벼운 프로세스이며 스레드는 프로세스 내부에 번들로 제공됩니다.
  2. 스레드에는 공유 메모리, 데이터, 리소스, 파일 등이 있습니다.
  3. 스레드는 clone () 메소드를 사용하여 작성됩니다.
  4. 스레드 간 컨텍스트 전환은 프로세스만큼 시간이 많이 걸리지 않습니다.

예 :
브라우저에서 여러 탭을 엽니 다.


Windows 세계에서는 정확하지만 Linux에서는 모든 '스레드'가 프로세스이며 '무거운'(또는 가벼운) 프로세스입니다.
Neil

22
  • 모든 프로세스는 스레드 (1 차 스레드)입니다.
  • 그러나 모든 스레드는 프로세스가 아닙니다. 프로세스의 일부입니다.

3
좀 더 설명하거나 증거를 포함시킬 수 있습니까?
Zim84

15

스레드와 프로세스는 OS 자원 할당의 원자 단위입니다 (즉, CPU 시간이 어떻게 나누어 지는지를 설명하는 동시성 모델과 다른 OS 자원을 소유하는 모델이 있습니다). 차이가 있습니다 :

  • 공유 리소스 (스레드는 정의에 의해 메모리를 공유하고 있으며 스택 및 로컬 변수를 제외하고는 아무것도 소유하지 않습니다. 프로세스는 메모리를 공유 할 수 있지만 OS에 의해 유지 관리되는 별도의 메커니즘이 있습니다)
  • 할당 공간 (프로세스의 커널 공간과 스레드의 사용자 공간)

위의 Greg Hewgill은 "process"라는 단어의 Erlang 의미에 대해 정확했으며 여기에 Erlang이 경량 프로세스를 수행 할 수있는 이유에 대한 설명이 있습니다.


13

프로세스와 스레드는 모두 독립적 인 실행 순서입니다. 일반적인 차이점은 동일한 프로세스의 스레드가 공유 메모리 공간에서 실행되고 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.

방법

실행중인 프로그램입니다. 여기에는 텍스트 섹션, 즉 프로그램 코드, 프로그램 카운터 값 및 프로세서 레지스터의 내용으로 표시되는 현재 활동이 있습니다. 또한 함수 매개 변수, 리턴 주소 지정 및 로컬 변수와 같은 임시 데이터를 포함하는 프로세스 스택과 전역 변수를 포함하는 데이터 섹션도 포함합니다. 프로세스는 프로세스 런타임 동안 동적으로 할당되는 메모리 인 힙을 포함 할 수도 있습니다.

스레드는 CPU 사용의 기본 단위입니다. 스레드 ID, 프로그램 카운터, 레지스터 세트 및 스택으로 구성됩니다. 동일한 프로세스에 속하는 다른 스레드와 코드 섹션, 데이터 섹션 및 열린 파일 및 신호와 같은 기타 운영 체제 리소스를 공유했습니다.

-Galvin에서 운영 체제에서 가져옴


13

http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html

리누스 토발즈 (torvalds@cs.helsinki.fi)

1996 년 8 월 6 일 화요일 12:47:31 +0300 (EET DST)

분류 된 메시지 : [날짜] [스레드] [제목] [저자]

다음 메시지 : Bernd P. Ziller : "Re : 죄송합니다. get_hash_table"

이전 메시지 : Linus Torvalds : "Re : I / O 요청 주문"

1996 년 8 월 5 일 월요일, Peter P. Eiserloh는 다음과 같이 썼습니다.

스레드 개념을 명확하게 유지해야합니다. 너무 많은 사람들이 스레드를 프로세스와 혼동하는 것 같습니다. 다음의 논의는 리눅스의 현재 상태를 반영하는 것이 아니라 높은 수준의 논의를 유지하려는 시도입니다.

아니!

"스레드"와 "프로세스"가 별도의 엔티티라고 생각할 이유가 없습니다. 그것이 전통적으로 이루어진 방식이지만 개인적으로는 그렇게 생각하는 것이 큰 실수라고 생각합니다. 그렇게 생각하는 유일한 이유는 역사적인 수하물입니다.

스레드와 프로세스는 실제로 "실행 컨텍스트"라는 한 가지 일뿐입니다. 다른 경우를 인위적으로 구별하려고하는 것은 자체 제한적입니다.

여기에서 COE라고하는 "실행 컨텍스트"는 해당 COE의 모든 상태의 대기업입니다. 이 상태에는 CPU 상태 (레지스터 등), MMU 상태 (페이지 매핑), 권한 상태 (uid, gid) 및 다양한 "통신 상태"(파일 열기, 신호 처리기 등)가 포함됩니다. 전통적으로 "스레드"와 "프로세스"의 차이점은 주로 스레드가 CPU 상태 (+ 가능하면 다른 최소 상태)를 갖는 반면 다른 모든 컨텍스트는 프로세스에서 비롯된다는 것입니다. 그러나 그것은 COE의 전체 상태를 나누는 한 가지 방법 뿐이며 , 그것이 올바른 방법이라고 말하는 것은 없습니다. 그런 종류의 이미지로 자신을 제한하는 것은 단순한 바보입니다.

리눅스는 이것에 대해 생각하는 방법 (그리고 나는이 일에 일을하고자하는 방법)이 있다는 것입니다 없다 는 "처리"또는 "스레드"같은 것은. COE (Linux에서는 "작업"이라고 함)의 총합 만 있습니다. 다른 COE는 컨텍스트의 일부를 서로 공유 할 수 있으며, 공유의 한 하위 세트 는 기존의 "스레드"/ "프로세스"설정이지만 실제로는 하위 세트로만 표시되어야합니다 (중요한 하위 세트이지만 중요 함) 디자인에서가 아니라 표준에서 : 우리는 분명히 리눅스 위에서 표준을 준수하는 스레드 프로그램을 실행하기를 원합니다).

요컨대 스레드 / 프로세스 사고 방식을 중심으로 설계하지 마십시오. 커널은 COE 사고 방식을 중심으로 설계되어야하며, pthreads 라이브러리 는 제한된 pthreads 인터페이스를 COE를 보는 방식으로 사용하려는 사용자에게 내보낼 수 있습니다.

COE가 스레드 / 프로세스와 반대로 생각할 때 가능한 것이 무엇인지에 대한 예와 같이 :

  • 유닉스 및 / 또는 프로세스 / 스레드에서는 전통적으로 불가능한 외부 "cd"프로그램을 수행 할 수 있습니다. / threads 설정). 다음을 수행하십시오.

클론 (CLONE_VM | CLONE_FS);

자식 : execve ( "external-cd");

/ * "execve ()"는 VM의 연결을 해제하므로 CLONE_VM을 사용한 유일한 이유는 복제 작업을 더 빠르게하는 것입니다. * /

  • "vfork ()"를 자연스럽게 수행 할 수 있습니다 (최소한의 커널 지원이 필요하지만 CUA의 사고 방식에 완벽하게 부합합니다).

클론 (CLONE_VM);

자식 : 계속 실행, 결국 execve ()

어머니 : execve를 기다리는

  • 외부 "IO deamons"를 수행 할 수 있습니다.

클론 (CLONE_FILES);

자식 : 열린 파일 디스크립터 등

어머니 : 아이가 열었던 fd를 사용하고 vv.

스레드 / 프로세스 사고 방식에 묶여 있지 않기 때문에 위의 모든 작업이 수행됩니다. 예를 들어 CGI 스크립트가 "실행 스레드"로 수행되는 웹 서버를 생각해보십시오. 기존 스레드는 항상 전체 주소 공간을 공유해야하므로 웹 서버 자체에서 수행하려는 모든 작업 ( "스레드"를 실행할 수 없음)을 연결해야하므로 기존 스레드로는이를 수행 할 수 없습니다. 다른 실행 파일).

문제는 "실행 환경"으로 이런 생각 대신, 그들이 원하는 경우 작업은 이제 등을 외부 프로그램을 실행 (= 부모의 주소 공간을 분리)을 선택할 수 있습니다, 또는 그들은 부모와 예 점유율 모두를위한 수 를 제외 에 대한 파일 디스크립터 (하위 "스레드"는 부모가 걱정할 필요없이 많은 파일을 열 수 있습니다. 서브 "스레드"가 종료 될 때 자동으로 닫히고 부모에서 fd를 사용하지 않습니다) .

예를 들어, 스레드 "inetd"를 생각하십시오. 낮은 오버 헤드 포크 + 실행을 원하므로 Linux 방식에서는 "fork ()"대신에 각 스레드가 CLONE_VM (공유 주소 공간으로 만 공유되지만 파일은 공유하지 않음)으로 멀티 스레드 inetd를 작성합니다. 설명자 등). 그런 다음 자식은 외부 서비스 (예 : rlogind)이거나 내부 inetd 서비스 (echo, timeofday) 중 하나 인 경우 실행할 수 있습니다.이 경우에는 그냥 수행하고 종료됩니다.

"스레드"/ "프로세스"로는이를 수행 할 수 없습니다.

리누스


12

Linux Kernel의 OS View에서 응답하려고합니다.

프로그램은 메모리로 시작될 때 프로세스가됩니다. 프로세스는 .text컴파일 된 코드 .bss저장, 초기화되지 않은 정적 또는 전역 변수 저장 등의 세분화와 같이 메모리에 다양한 세그먼트가있는 고유 한 주소 공간을 갖습니다 .
각 프로세스에는 고유 한 프로그램 카운터와 사용자 공간 스택이 있습니다.

커널 내부에서 각 프로세스에는 자체 커널 스택 (보안 문제로 인해 사용자 공간 스택과 분리됨)과 task_struct프로세스 제어 블록으로 추상화 된 구조 가 있으며, 우선 순위, 상태와 같은 프로세스 관련 정보를 모두 저장합니다. , (그리고 다른 많은 청크).
프로세스는 여러 실행 스레드를 가질 수 있습니다.

스레드에 도달하면 프로세스 내부에 상주하며 파일 시스템 리소스, 보류중인 신호 공유, 데이터 공유 (변수 및 명령어)와 같은 스레드 생성 중에 전달 될 수있는 다른 리소스와 함께 상위 프로세스의 주소 공간을 공유하므로 스레드가 가벼워지고 따라서 더 빠른 컨텍스트 전환이 가능합니다.

커널 내부에서 각 스레드에는 스레드 task_struct를 정의하는 구조 와 함께 자체 커널 스택이 있습니다. 따라서 커널은 다른 프로세스와 동일한 프로세스의 스레드를보고 자체적으로 예약 할 수 있습니다. 동일한 프로세스의 스레드는 스레드 그룹 id ( tgid) 라는 공통 ID를 공유하며 프로세스 ID ( pid) 라는 고유 ID를 갖습니다 .


11

Java 세계와 관련된이 질문에 대답하려고합니다.

프로세스는 프로그램의 실행이지만 스레드는 프로세스 내의 단일 실행 시퀀스입니다. 프로세스는 여러 스레드를 포함 할 수 있습니다. 스레드를 경량 프로세스 라고도 합니다 .

예를 들면 다음과 같습니다.

예 1 : JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속하는 힙을 공유합니다. 그렇기 때문에 여러 스레드가 동일한 객체에 액세스 할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간이 있습니다. 이것은 하나의 스레드가 메소드를 호출하고 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 유지되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으며 스레드 안전을 위해 동기화되어야합니다.

예 2 : 프로그램이 키 입력을 읽음으로써 그림을 그릴 수 없습니다. 프로그램은 키보드 입력에 최대한주의를 기울여야하며 한 번에 둘 이상의 이벤트를 처리 할 수있는 기능이 없으면 문제가 발생할 수 있습니다. 이 문제에 대한 이상적인 솔루션은 프로그램의 둘 이상의 섹션을 동시에 원활하게 실행하는 것입니다. 쓰레드는 이것을 가능하게합니다. 여기서 그림 그리기는 프로세스이며 키 입력을 읽는 것은 하위 프로세스 (스레드)입니다.


1
좋은 대답은 범위 (자바 세계)를 정의하고 원래 질문을하는 사람이 즉시 관련시킬 수있는 사례 (# ​​2)를 포함하여 적용 가능한 몇 가지 예를 제공하는 것입니다.
Smithers 2016 년

9

스레드와 프로세스의 차이점은 무엇입니까?

프로세스는 응용 프로그램의 실행 인스턴스이고 스레드는 프로세스 내의 실행 경로입니다. 또한 프로세스에는 여러 스레드가 포함될 수 있으므로 스레드는 프로세스가 수행 할 수있는 모든 작업을 수행 할 수 있습니다. 그러나 프로세스는 여러 스레드로 구성 될 수 있으므로 스레드는 '가벼운'프로세스로 간주 될 수 있습니다. 따라서 스레드와 프로세스의 근본적인 차이점은 각 스레드가 수행하는 작업입니다. 스레드는 작은 작업에 사용되는 반면 프로세스는 더 많은 '무거운'작업 (기본적으로 응용 프로그램 실행)에 사용됩니다.

스레드와 프로세스의 또 다른 차이점은 동일한 프로세스 내의 스레드는 동일한 주소 공간을 공유하지만 다른 프로세스는 그렇지 않습니다. 이를 통해 스레드는 동일한 데이터 구조 및 변수를 읽고 쓸 수 있으며 스레드 간의 통신을 용이하게합니다. 프로세스 간 통신 (IPC 또는 프로세스 간 통신이라고도 함)은 매우 어렵고 리소스를 많이 사용합니다.

스레드와 프로세스의 차이점에 대한 요약은 다음과 같습니다.

  1. 스레드는 별도의 주소 공간이 필요하지 않기 때문에 프로세스보다 작성하기 쉽습니다.

  2. 스레드는 한 번에 하나의 스레드 만 수정해야하는 데이터 구조를 공유하므로 멀티 스레딩에는 신중한 프로그래밍이 필요합니다. 스레드와 달리 프로세스는 동일한 주소 공간을 공유하지 않습니다.

  3. 스레드는 프로세스보다 훨씬 적은 리소스를 사용하기 때문에 경량으로 간주됩니다.

  4. 프로세스는 서로 독립적입니다. 스레드는 동일한 주소 공간을 공유하므로 상호 의존적이므로 다른 스레드가 서로 밟지 않도록주의해야합니다.
    이것은 위의 # 2를 나타내는 또 다른 방법입니다.

  5. 프로세스는 여러 스레드로 구성 될 수 있습니다.


9

다음은 The Code Project 의 기사 중 하나에서 얻은 것입니다 . 나는 그것이 필요한 모든 것을 명확하게 설명한다고 생각합니다.

스레드는 워크로드를 별도의 실행 스트림으로 분할하기위한 또 다른 메커니즘입니다. 스레드는 프로세스보다 가볍습니다. 즉, 전체 프로세스보다 유연성이 떨어지지 만 운영 체제 설정이 적기 때문에 더 빠르게 시작할 수 있습니다. 프로그램이 둘 이상의 스레드로 구성된 경우 모든 스레드는 단일 메모리 공간을 공유합니다. 프로세스에는 별도의 주소 공간이 제공됩니다. 모든 스레드는 단일 힙을 공유합니다. 그러나 각 스레드에는 자체 스택이 제공됩니다.


1
스레드 대 프로세스를 이미 이해하는 관점에서 나오지 않는 한 이것이 분명한지 확실하지 않습니다. 그들이 서로 관련되는 방식을 추가하는 것이 유용 할 수 있습니다.
Smithers

명확하지 않습니다. 하나의 프로세스와 스레드 만 의미합니까? 각 프로세스마다 스레드가 많은 프로세스가 많으면 어떻게됩니까? 모든 스레드가 단일 메모리 공간을 공유합니까? 그 모든 과정 중에서?
Green

9

방법:

프로세스는 기본적으로 실행중인 프로그램입니다. 활동적인 엔터티입니다. 일부 운영 체제는 '작업'이라는 용어를 사용하여 실행중인 프로그램을 나타냅니다. 프로세스는 항상 주 메모리 또는 기본 액세스 메모리라고도하는 주 메모리에 저장됩니다. 따라서 프로세스를 활성 엔티티라고합니다. 컴퓨터가 재부팅되면 사라집니다. 여러 프로세스가 동일한 프로그램과 연관 될 수 있습니다. 다중 프로세서 시스템에서 여러 프로세스를 병렬로 실행할 수 있습니다. 단일 프로세서 시스템에서는 진정한 병렬 처리가 이루어지지는 않지만 프로세스 스케줄링 알고리즘이 적용되고 프로세서는 동시 처리의 착오를 일으키는 각 프로세스를 한 번에 하나씩 실행하도록 예약됩니다. 예 : '계산기'프로그램의 여러 인스턴스를 실행합니다. 각 인스턴스를 프로세스라고합니다.

실:

스레드는 프로세스의 하위 집합입니다. 실제 프로세스와 비슷하지만 프로세스 컨텍스트 내에서 실행되고 커널이 프로세스에 할당 한 동일한 리소스를 공유하므로 '경량 프로세스'라고합니다. 일반적으로 프로세스에는 한 번에 하나의 시스템 명령어 세트 만 실행되는 제어 스레드가 하나만 있습니다. 프로세스는 명령을 동시에 실행하는 여러 실행 스레드로 구성 될 수도 있습니다. 다중 제어 스레드는 다중 프로세서 시스템에서 가능한 진정한 병렬 처리를 이용할 수 있습니다. 단일 프로세서 시스템에서는 스레드 예약 알고리즘이 적용되고 프로세서는 각 스레드를 한 번에 하나씩 실행하도록 예약됩니다. 프로세스 내에서 실행되는 모든 스레드는 동일한 주소 공간, 파일 설명자, 스택 및 기타 프로세스 관련 속성을 공유합니다. 프로세스의 스레드가 동일한 메모리를 공유하므로

REF- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread


하나의 프로세스에서 다른 언어의 다중 스레드 병렬 처리와 노드 동시성 같은 소리
user2734550

이것은 문자 그대로 2010 년 아래 답변에서 복사하여 붙여 넣습니다 ...
mc01

8

면접관의 관점에서 볼 때 프로세스와 같은 명백한 것에는 여러 스레드가있을 수있는 것 외에도 기본적으로 듣고 싶은 3 가지가 있습니다.

  1. 스레드는 동일한 메모리 공간을 공유하므로 스레드는 다른 스레드 메모리에서 메모리에 액세스 할 수 있습니다. 프로세스는 일반적으로 할 수 없습니다.
  2. 자원. 리소스 (메모리, 핸들, 소켓 등)는 스레드 종료가 아닌 프로세스 종료시 해제됩니다.
  3. 보안. 프로세스에는 고정 보안 토큰이 있습니다. 반면 스레드는 다른 사용자 / 토큰을 가장 할 수 있습니다.

더 많은 것을 원한다면 Scott Langham의 답변은 거의 모든 것을 다룹니다. 이 모든 것은 운영 체제의 관점에서입니다. 다른 언어는 작업, 가벼운 스레드 등과 같은 다른 개념을 구현할 수 있지만 스레드를 사용하는 방법 일뿐입니다 (Windows의 광섬유). 하드웨어 및 소프트웨어 스레드가 없습니다. 하드웨어 및 소프트웨어 예외인터럽트 또는 사용자 모드 및 커널 스레드가 있습니다.


보안 토큰이라고 말할 때, 예를 들어 리눅스에서와 같은 사용자 자격 증명 (사용자 이름 / 패스)을 의미합니까?

창에서 이것은 복잡한 주제이며, 보안 토큰 (실제로는 액세스 토큰이라고 함)은 액세스 점검에 필요한 모든 정보를 포함하는 큰 구조입니다. 인증 후 구조가 생성되므로 사용자 이름 / 암호는 없지만 사용자 이름 / 암호를 기반으로 한 SID / 권한 목록이 있습니다. 자세한 내용은 여기 : msdn.microsoft.com/en-us/library/windows/desktop/…
AndreiM

8
  1. 스레드는 공유 메모리 공간에서 실행되지만 프로세스는 별도의 메모리 공간에서 실행됩니다.
  2. 스레드는 가벼운 프로세스이지만 프로세스는 무거운 프로세스입니다.
  3. 스레드는 프로세스의 하위 유형입니다.

이것은 매우 재귀 적입니다. 스레드와 프로세스 사이의 관계가 확장되면 더 나은 대답이 될 것입니다.
Smithers 2016 년

7

시각화하여 학습에 더 익숙한 사람들을 위해 Process and Threads를 설명하기 위해 작성한 편리한 다이어그램이 있습니다.
MSDN의 정보를 사용했습니다- 프로세스 및 스레드 정보

프로세스와 스레드


1
멀티 스레딩이 멀티 프로세싱과 비교되는 방식을보기 위해 다른 프로세스 를 추가하는 것이 흥미로울 수 있습니다 .
Bram Vanroy 2016 년

6

임베디드 세계에서 온 프로세스 개념 은 MMU (메모리 관리 장치) 가있는 "큰"프로세서 ( 데스크탑 CPU, ARM Cortex A-9 ) 및 MMU 사용을 지원하는 운영 체제 ( 리눅스 와 같은 ). freeRTOS와 같은 소형 / 구형 프로세서 및 마이크로 컨트롤러 및 소형 RTOS 운영 체제 ( 실시간 운영 체제 )를 사용하면 MMU 지원이 없으므로 프로세스 만없고 스레드 만 있습니다.

스레드 는 서로의 메모리에 액세스 할 수 있으며 OS에 의해 인터리브 방식으로 예약되므로 병렬로 실행되는 것처럼 보입니다 (또는 멀티 코어에서는 실제로 병렬로 실행됩니다).

반면 프로세스 는 MMU가 제공하고 보호하는 가상 메모리의 개인 샌드 박스에 있습니다. 다음을 가능하게하기 때문에 편리합니다.

  1. 버그가 많은 프로세스가 전체 시스템을 중단시키지 않도록합니다.
  2. 다른 프로세스 데이터를 보이지 않게하고 도달 할 수 없도록하여 보안 유지 프로세스 내부의 실제 작업은 하나 이상의 스레드에 의해 처리됩니다.

6
  1. 기본적으로 스레드는 프로세스 스레드가 없으면 프로세스의 일부가 작동하지 않습니다.
  2. 스레드는 가벼우면서도 프로세스는 무겁습니다.
  3. 프로세스 간 통신에는 시간이 필요하지만 스레드는 시간이 덜 걸립니다.
  4. 스레드는 동일한 메모리 영역을 공유 할 수있는 반면 프로세스 수명은 별도입니다.

6

프로세스 : 실행중인 프로그램을 프로세스라고합니다.

Thread : Thread는 "one with other"개념을 기반으로 프로그램의 다른 부분에서 실행되는 기능이므로 스레드는 프로세스의 일부입니다.


나쁘지는 않지만, 질문을하는 사람에게는 이질적인 새로운 개념 ( "다른 것과 하나")을 소개합니다.
Smithers 2016 년

게시물은 코드 형식이지만 일반 텍스트 여야합니다.
Heinrich

6

나는 OS 과정을 수강하는 학부생으로서 현재 두 가지 개념을 완전히 이해할 수 없기 때문에 거의 모든 대답을 읽었습니다. 나는 대부분의 사람들이 일부 OS 책에서 차이점을 읽습니다. 즉 스레드가 프로세스의 주소 공간을 사용하기 때문에 트랜잭션 단위의 전역 변수에 액세스 할 수 있습니다. 그러나 새로운 질문은 왜 프로세스가 존재하는지에 대해 제기됩니다. 이전 답변 중 하나 에서 발췌 이미지를 사용하여 다음 예를 살펴 보겠습니다 .

우리는 단어 문서에서 한 번에 3 개의 스레드가 작동합니다 (예 : Libre Office) . 첫 번째 단어는 철자가 틀린 단어인지 밑줄로 맞춤법을 검사합니다. 두 번째는 키보드에서 문자를 가져 와서 인쇄합니다. 마지막으로 문제가 발생했을 때 작업 한 문서를 잃지 않도록 짧은 시간마다 문서를 저장합니다. 이 경우, 3 개의 스레드는 프로세스의 주소 공간 인 공통 메모리를 공유하므로 모두 편집중인 문서에 액세스 할 수 있으므로 3 개의 프로세스가 될 수 없습니다. 따라서 도로는 두 개의 불도저와 함께 단어 문서이며 이미지 중 하나는 부족하지만 스레드입니다.

여기에 이미지 설명을 입력하십시오


5

멀티 스레딩을 통합 한 Python (통역 언어)으로 알고리즘을 구축하는 동안 이전에 구축 한 순차적 알고리즘과 비교할 때 실행 시간이 더 나쁘지 않다는 사실에 놀랐습니다. 이 결과에 대한 이유를 이해하기 위해 나는 약간의 독서를했으며, 내가 배운 것은 멀티 스레딩과 멀티 프로세스의 차이점을 더 잘 이해하는 흥미로운 컨텍스트를 제공한다고 생각합니다.

멀티 코어 시스템은 여러 스레드 실행을 수행 할 수 있으므로 파이썬은 멀티 스레딩을 지원해야합니다. 그러나 파이썬은 컴파일 된 언어가 아니라 해석 된 언어 1 입니다. 즉, 프로그램을 실행하려면 프로그램을 해석해야하며 인터프리터는 프로그램이 실행을 시작하기 전에 프로그램을 인식하지 못합니다. 그러나 파이썬의 규칙은 알고 있으며 그 규칙을 동적으로 적용합니다. 파이썬에서 최적화는 실행되는 코드가 아니라 주로 인터프리터 자체의 최적화 여야합니다. 이것은 C ++과 같은 컴파일 된 언어와 대조적이며 파이썬에서 멀티 스레딩에 영향을 미칩니다. 특히 파이썬은 Global Interpreter Lock을 사용하여 멀티 스레딩을 관리합니다.

반면에 컴파일 된 언어는 컴파일됩니다. 이 프로그램은 "완전히"처리되며, 먼저 구문 정의에 따라 해석 된 다음 언어에 구애받지 않는 중간 표현에 매핑되고 마지막으로 실행 코드에 연결됩니다. 이 프로세스를 통해 코드는 컴파일 시점에 모두 사용할 수 있으므로 코드를 매우 최적화 할 수 있습니다. 다양한 프로그램 상호 작용 및 관계는 실행 파일을 만들 때 정의되며 최적화에 대한 강력한 결정을 내릴 수 있습니다.

현대 환경에서 파이썬의 인터프리터는 멀티 스레딩을 허용해야하며 안전하고 효율적이어야합니다. 해석 된 언어와 컴파일 된 언어의 차이가 그림에 들어갑니다. 인터프리터는 다른 스레드에서 내부적으로 공유 된 데이터를 방해해서는 안되며 동시에 계산에 프로세서 사용을 최적화합니다.

이전 게시물에서 언급했듯이 프로세스와 스레드는 독립적 인 순차적 실행으로, 프로세스의 여러 스레드에서 메모리가 공유되고 프로세스는 메모리 공간을 분리한다는 점에서 차이가 있습니다.

파이썬에서 데이터는 Global Interpreter Lock에 의해 다른 스레드에 의한 동시 액세스로부터 보호됩니다. 모든 Python 프로그램에서 언제든지 하나의 스레드 만 실행할 수 있어야합니다. 반면에 각 프로세스의 메모리가 다른 프로세스와 분리되어 프로세스가 여러 코어에서 실행될 수 있으므로 여러 프로세스를 실행할 수 있습니다.


1 Donald Knuth는 컴퓨터 프로그래밍 기술 : 기본 알고리즘의 해석 루틴에 대해 잘 설명하고 있습니다.


4

동일한 프로세스 내의 스레드는 메모리를 공유하지만 각 스레드에는 고유 한 스택과 레지스터가 있으며 스레드는 스레드 별 데이터를 힙에 저장합니다. 스레드는 독립적으로 실행되지 않으므로 프로세스 간 통신에 비해 스레드 간 통신이 훨씬 빠릅니다.

프로세스는 동일한 메모리를 공유하지 않습니다. 자식 프로세스가 생성되면 부모 프로세스의 메모리 위치가 복제됩니다. 프로세스 통신은 파이프, 공유 메모리 및 메시지 구문 분석을 사용하여 수행됩니다. 스레드 간 컨텍스트 전환이 매우 느립니다.


4

내가 지금까지 찾은 가장 좋은 대답은 Michael Kerrisk의 'The Linux Programming Interface'입니다 .

최신 UNIX 구현에서 각 프로세스는 여러 실행 스레드를 가질 수 있습니다. 스레드를 시각화하는 한 가지 방법은 동일한 다른 가상 메모리와 다양한 다른 속성을 공유하는 일련의 프로세스입니다. 각 스레드는 동일한 프로그램 코드를 실행하고 동일한 데이터 영역과 힙을 공유합니다. 그러나 각 스레드에는 로컬 변수와 함수 호출 연결 정보가 포함 된 자체 스택이 있습니다. [LPI 2.12]

이 책은 분명한 출처입니다. Julia Evans는 이 기사 에서 Linux 그룹이 실제로 어떻게 작동하는지 정리하는 데 도움을 주었습니다 .


이것은 직접 모순되는 것처럼 보입니다. 한 부분은 프로세스가 둘 이상의 스레드를 가질 수 있다고 말합니다. 다음 부분은 스레드가 가상 메모리를 공유하는 일련의 프로세스라고 말합니다. 이 두 가지가 어떻게 사실 일 수 있는지 모르겠습니다.
David Schwartz

내가 읽는 방법은 다음과 같습니다. 첫 문장에서 'have'라는 단어를 버립니다. 당신이 남긴 것은 용어 측면에서 1) 단일 스레드와 2) 편의를위한 프로세스로 알려진 스레드 그룹입니다. 이것이 Kerrisk가 여기에 따르는 것에 대한 나의 취향입니다.
Zach Valenta

그가 말하려고하는 것은 이전 UNIX보기에 익숙하다면 프로세스가 OS 일정과 같다는 것입니다. 스레드 세트는 많은 것들을 공유한다는 점을 제외하고는 프로세스 세트와 같습니다.
David Schwartz

권리! 그것을 넣는 좋은 방법.
Zach Valenta

3

예 1 : JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속하는 힙을 공유합니다. 그렇기 때문에 여러 스레드가 동일한 객체에 액세스 할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간이 있습니다. 이것은 하나의 스레드가 메소드를 호출하고 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 유지되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으며 스레드 안전을 위해 동기화되어야합니다.


3

그것들은 거의 같습니다 ... 그러나 중요한 차이점은 스레드가 가벼우 며 컨텍스트 전환, 작업 부하 등의 측면에서 프로세스가 무겁다는 것입니다.


답을 넓힐 수 있습니까?
Fiver

3
스레드는 하위 프로세스이며 프로세스 내에서 코드, 데이터, 파일과 같은 공통 리소스를 공유합니다. 두 프로세스가 리소스를 공유 할 수없는 경우 (프로세스 (부모)가 다른 프로세스 (자식)를 만드는 데 기본적으로있는 경우 예외는 예외 임) 스레드는이 컨텍스트에서 훨씬 가볍지 만 CPU는 리소스에 대한 높은 페이로드를 요구합니다. 둘 다 동일한 것을 소유하고 있습니다. 시나리오, 단일 스레드 프로세스는 I / 0으로 인해 차단되어 전체 1로 이동합니다. 대기 상태이지만 멀티 스레드 프로세스가 i / o에 의해 차단되면 해당하는 1 개의 i / o 관련 스레드 만 차단됩니다.
Nasir Ul Islam Butt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.