문제

은 무엇인 기술 차이는 프로세스 및 실?

나는 느낌을 얻을 같은 말'프로세스는'남용하고 거기에 또한 하드웨어 및 소프트웨어 스레드입니다.는 방법에 대해 가벼운 무게 프로세스에서 같은 언어 얼랑?은 거기에 결정적인 이유 중 하나를 사용하는 용어를 통해 다른?

도움이 되었습니까?

해결책

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

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

Erlang은 "프로세스"라는 용어를 사용합니다. 그것들을 "스레드"라고 부르는 것은 그들이 메모리를 공유했음을 암시합니다.

다른 팁

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


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


MSDN에서 이것을 찾았습니다.
프로세스 및 스레드에 대해

Microsoft Windows는 선제 적 멀티 태스킹을 지원하여 여러 프로세스에서 여러 스레드의 동시 실행 효과를 만듭니다. 멀티 프로세서 컴퓨터에서 시스템은 컴퓨터에 프로세서가있는 것처럼 많은 스레드를 동시에 실행할 수 있습니다.

프로세스:

  • 프로그램의 실행 인스턴스를 프로세스라고합니다.
  • 일부 운영 체제는 '작업'이라는 용어를 사용하여 실행중인 프로그램을 참조합니다.
  • 프로세스는 항상 기본 메모리 또는 기본 메모리 또는 임의의 액세스 메모리라고하는 기본 메모리에 저장됩니다.
  • 따라서 프로세스를 활성 엔티티라고합니다. 기계가 재부팅되면 사라집니다.
  • 여러 프로세스가 동일한 프로그램과 관련 될 수 있습니다.
  • 멀티 프로세서 시스템에서 여러 프로세스를 병렬로 실행할 수 있습니다.
  • Uni-Processor 시스템에서는 실제 병렬 처리가 달성되지 않지만 프로세스 일정 알고리즘이 적용되고 프로세서는 각 프로세스를 한 번에 하나씩 실행하여 동시성의 환상을 산출 할 수 있습니다.
  • 예시: '계산기'프로그램의 여러 인스턴스 실행. 각 인스턴스는 프로세스라고합니다.

실:

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

나는 위의 정보를 빌렸다 지식 퀘스트! 블로그.

첫째,하자의 이론적인 측면이다.당신이 이해할 필요가 무엇입니까 프로세스를 개념적으로 차이를 이해하기 위해 프로세스와 쓰레드와 공유된다.

우리는 다음과 같은 섹션에서 2.2.2 클래식 스레드 모델운영 체제 3e 에 의해 타넨 바움:

프로세스 모델을 기반으로 두 개의 독립적인 개념:리소스 그룹화하고 실행할 수 있습니다.때때로 그것은 유용한 그들을 분리;이것은 스레드에 와서....

그는 계속한다:

방법 중 하나의 보고 프로세스가는 방법 그룹과 관련된 리소스에 함께합니다.프로세스 주소 공간 을 포함하는 프로그램에 텍스트와 데이터뿐만 아니라 다른 리소스입니다.이 리소스를 포함할 수 있 파일을 열고,자식 프로세스,보류 중인 경보 신호 처리기,회계 정보와 더 있습니다.에 의해 퍼팅 에서 함께 양식의 프로세스,관리할 수 있습니다.다른 개념 프로세스가 실행 스레드는,일반적으로 단축하 thread.스레드가 프로그램 카운터는 유지 는 명령을 실행하음.그것은 레지스터는 잡고 그것의 현재 작동 변수가 있습니다.그것은 스택을 포함하는 실행 역사,하나의 프레임에 대한 각각의 절차를 이라고 하지만 아직에서 돌아왔다.지만 스레드로 실행되어야에서 어떤 과정 스레드 및 프로세스는 다른 개념과될 수 있습 취급 별도로 합니다.프로세스를 사용하는 리소스 그룹이 함께;스레드 은 엔터티를 실행이 예약된 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+레지스터)는 또 다른 스레드(어쩌면 동일한 프로세스에서,어쩌면 다른 프로세스에서)을 얻을 수 있는 작업이 수행하는 동안 다른 스레드에서 기다리는 메모리.거기에 여러 이름과 구현의 이 개념 같은 하이퍼 스레딩 및 동시 다중 스레딩 SMT(단).

지금 보자는 소프트웨어 측.거기에 기본적으로 세 가지 방법으로 스레드를 구현할 수 있는 소프트웨어 측면에서.

  1. 사용자 쓰레드
  2. 커널 쓰레드
  3. 는 이 둘의 조합

해 필요한 모든 구현하는 스레드는 능력을 저장하는 CPU 상태 및 유지 다중 스택할 수 있는 많은 경우에 수행에 사용자 공간입니다.의 장점은 사용자 공간이 스레드 슈퍼 빠른 스레드가 전환을 하지 않기 때문이 있을 트랩으로 커널과를 예약 할 수있는 기능의 스레드 방식을 좋아한다.가장 큰 단점은 작업을 수행 할 수 없음을 차단 I/O(는 블록 전체 프로세스와 모든 사용자 쓰레드),하나의 큰 이유는 우리가 사용하는 스레드에서 첫 번째 장소입니다.차단 I/O 스레드를 사용하여 크게 단순화한 프로그램을 디자인 경우가 많습니다.

커널 쓰레드가할 수 있다는 장점을 사용하여 차단 I/O 외에,떠나는 모든 문제에 일정을 수 있습니다.그러나 각 스레드 스위치가 필요합으로 트래핑 커널은 잠재적으로 상대적으로 느립니다.그러나,당신이 스위칭 스레드 때문에 차단 I/O 이 정말 문제가 되지 않습니다 때문에 I/O 작업을 아마도 당신을 갇혀있으로는 커널 이미 어쨌든.

또 다른 방식을 결합하면 두 가지로,여러 개의 커널 쓰레드는 각각 여러 사용자 쓰레드.

그래서 다시 얻을 당신의 질문의 용어,당신이 볼 수 있는 프로세스 및 실행 스레드는 두 개의 서로 다른 개념과 당신의 선택의 어떤 용어를 사용에 따라 무엇을 모르겠습니다.에 관한 용어"가벼운 무게는 프로세스는"나는 마음에 들지 않는다고 볼 점에서 그것지 않기 때문에 정말 무엇을 전달하고 뿐만 아니라는 용어"의 실행 스레드".

동시 프로그래밍과 관련하여 더 많은 것을 설명합니다

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

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

평균적인 사람을 염두에두고

컴퓨터에서 Microsoft Word 및 Web Browser를 엽니 다. 우리는 이것을 이것을 부릅니다 프로세스.

Microsoft Word에서는 몇 가지를 입력하면 자동으로 저장됩니다. 이제 편집 및 저장은 한 스레드에서 편집하고 다른 스레드를 저장하는 것을 병렬로 관찰했을 것입니다.

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

도난당했습니다 여기.

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

  • 모든 프로세스는 스레드 (기본 스레드)입니다.
  • 그러나 모든 스레드는 프로세스가 아닙니다. 프로세스의 일부 (엔티티)입니다.

프로세스 및 스레드에 대한 실제 예제 이것은 스레드와 프로세스에 대한 기본 아이디어를 제공합니다. enter image description here

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

프로세스:

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

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

스레드 :

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

예시:
브라우저에서 여러 탭을 열었습니다.

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

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

위의 Greg Hewgill은 "프로세스"라는 단어의 Erlang의 의미에 대해 정확했고 여기 Erlang이 왜 프로세스를 가볍게 수행 할 수 있는지에 대한 논의가 있습니다.

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

프로세스

실행 프로그램입니다. 텍스트 섹션, 즉 프로그램 코드, 현재 활동은 프로그램 카운터 및 프로세서 등록의 컨텐츠로 표시됩니다. 또한 임시 데이터 (예 : 기능 매개 변수, 반환 주소 및 로컬 변수)와 글로벌 변수를 포함하는 데이터 섹션이 포함 된 프로세스 스택도 포함됩니다. 프로세스에는 또한 힙이 포함될 수 있으며, 이는 공정 실행 시간 동안 동적으로 할당되는 메모리입니다.

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

- Galvin의 운영 체제에서 가져온

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

프로세스는 프로그램의 실행이지만 스레드는 프로세스 내에서 단일 실행 시퀀스입니다. 프로세스에는 여러 스레드가 포함될 수 있습니다. 스레드는 때때로 a라고 불립니다 가벼운 과정.

예를 들어:

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

예 2 : 키 스트로크를 읽어서 프로그램이 그림을 그리지 않을 수 있습니다. 이 프로그램은 키보드 입력에 전적으로주의를 기울여야하며 한 번에 둘 이상의 이벤트를 처리 할 수있는 능력이 부족하면 문제가 발생합니다. 이 문제에 대한 이상적인 솔루션은 프로그램의 두 개 이상의 섹션을 동시에 실행하는 것입니다. 스레드를 사용하면이 작업을 수행 할 수 있습니다. 여기서 그림 그리기는 프로세스이며 키스트 로크는 하위 프로세스 (스레드)입니다.

차이 스레드 및 프로세스?

프로세스는 실행하는 인스턴스의 응용 프로그램 및 스레드의 경로를 실행 프로세스에서.또한,프로세스를 포함할 수 있습니다 그것의 중요한 참고하는 스레드가 아무것도 할 수 있는 프로세스 할 수 있습니다.하지만 이후 프로세스로 구성될 수 있습니다 여러 스레드 스레드 간주 될 수 있는'라'과정이다.따라서,본질적인 차이가 사이 스레드 프로세스는 작업을 각각 사용하여 수행할 수 있습니다.스레드가 사용되는 작은 작업을 하는 반면,프로세스에 사용되는 더 많은'헤비급 작업–기본적으로 실행하는 프로그램입니다.

다른 사이에 차이 스레드 및 프로세스는 스레드에서 동일한 프로세스 같은 주소 공간을 공유하는 반면,다른 프로세스하지 않습니다.이것은 스레드에서 읽고 쓰는 데이터를 동일한 데이터 구조와 변수,또한 커뮤니케이션을 촉진 사 실이다.통신 프로세스 사이에으로도 알려져 있 IPC 또는 프로세스 간의 통신은 매우 어렵고 자원이 많습니다.

을 요약하면 다음과 같습니다 사이의 차이 스레드 및 프로세스:

  1. 스레드는 쉽게 만들보다 이후 그들은 프로세스 이 필요하지 않는 별도의 주소 공간이 있습니다.

  2. 멀티 스레드가 필요합주의 프로그래밍기 때문 스레드 데이터 공유 strucures 어야 하는 수정에 의해 하나의 스레드 니다.과는 달리,쓰레드,프로세스를 공유하지 않는 동 주소 공간이 있습니다.

  3. 스레드 간주되는 경량 사용하기 때문에 멀리 적 리소스 프로세스입니다.

  4. 프로세스는 독립니다.스레드,이후 그들은 공유하는 동일한 주소 공간은 상호 의존적이,그래서 주의 촬영 해야 합니다 그래서 다른 스레드에 단계하지 않습니다.
    이것은 정말 다른 방법의 진술#2 니다.

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

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

Linus torvalds (torvalds@cs.helsinki.fi)

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

정렬 된 메시지 : [날짜] [스레드] [주제] [저자

다음 메시지 : Bernd P. Ziller : "re : oops in get_hash_table"

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

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

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

아니!

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

스레드와 프로세스는 실제로 한 가지 일뿐입니다 : "실행의 맥락". 인위적으로 다른 사례를 구별하려고하는 것은 자기 제한 일뿐입니다.

CoE라고 불리는 "실행의 맥락"은 그 Coe의 모든 상태의 대기업 일뿐입니다. 이 상태에는 CPU 상태 (레지스터 등), MMU 상태 (페이지 매핑), 권한 상태 (UID, GID) 및 다양한 "커뮤니케이션 상태"(열린 파일, 신호 처리기 등)와 같은 것들이 포함됩니다. 전통적으로, "스레드"와 "프로세스"의 차이는 주로 스레드에 CPU 상태 (+ 아마도 다른 최소 상태)를 가지고 있지만 다른 모든 컨텍스트는 프로세스에서 나온다는 것입니다. 그러나 그것은 단지입니다 하나 COE의 전체 상태를 나누는 방법, 그것이 올바른 방법이라고 말하는 것은 없습니다. 그런 종류의 이미지로 자신을 제한하는 것은 단지 어리석은 일입니다.

Linux가 이것에 대해 생각하는 방식 (그리고 내가 일하기를 원하는 방식)은 ~이다 "프로세스"또는 "스레드"와 같은 것은 없습니다. COE의 총체 만 있습니다 (Linux의 "작업"이라고 함). 다른 Coe는 서로 맥락의 일부를 서로 공유 할 수 있으며 하나는 서브 세트 이 공유 중 전통적인 "스레드"/"프로세스"설정이지만 실제로는 하위 집합으로 간주되어야합니다 (중요한 하위 집합이지만 그 중요성은 디자인이 아니라 표준에서 나옵니다. 우리는 명백히 표준을 실행하고 싶습니다. Linux 상단의 스레드 프로그램도 준수).

요컨대 : 스레드/프로세스 사고 방식 주위를 디자인하지 마십시오. 커널은 COE 사고 방식을 중심으로 설계 한 다음 PTHREADS를 중심으로 설계해야합니다. 도서관 제한된 PTHREADS 인터페이스를 COE를 보는 방식을 사용하려는 사용자에게 내보낼 수 있습니다.

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

  • 유닉스 및/또는 프로세스/스레드에서 전통적으로 불가능한 외부 "CD"프로그램을 수행 할 수 있지만 (어리석은 예, 아이디어는 전통적인 UNIX에만 국한되지 않는 이런 종류의 "모듈"을 가질 수 있다는 것입니다. /스레드 설정). 수행 :

클론 (clone_vm | clone_fs);

아동 : execve ( "외부 CD");

/ * "execve ()"는 VM을 분리 할 것이므로 Clone_VM을 사용한 유일한 이유는 복제 행위를 더 빨리 만드는 것이 었습니다 */

  • "vfork ()"를 자연스럽게 수행 할 수 있습니다 (최소한의 커널 지원을 MEED이지만 지원은 CUA 사고 방식에 완벽하게 맞습니다) :

클론 (clone_vm);

자식 : 계속 달리기, 결국 execve ()

어머니 : exece를 기다립니다

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

클론 (clone_files);

자식 : 파일 설명자 등을 열었습니다

어머니 : FD의 아이가 열린 아이와 VV를 사용하십시오.

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

이것을 "실행의 컨텍스트"문제로 생각하는 대신, 당신의 작업은 이제 외부 프로그램을 실행하기로 선택할 수 있습니다 (= 부모와 주소 공간을 분리) 등을 원하는 경우, 예를 들어 부모와 모든 것을 공유 할 수 있습니다. 제외하고 파일 설명자의 경우 (하위 "스레드"가 부모가 걱정할 필요없이 많은 파일을 열 수 있도록 : 하위 "스레드"가 종료 될 때 자동으로 닫히고 부모의 FD를 사용하지 않습니다. ).

예를 들어 나사로 된 "inetd"를 생각해보십시오. 낮은 오버 헤드 포크+exec를 원하므로 "fork ()"을 사용하는 대신 Linux 방법을 사용하면 각 스레드가 Clone_VM으로 생성되는 다중 스레드 inetd를 작성합니다 (주소 공간을 공유하지만 파일을 공유하지 마십시오. 설명자 등). 그런 다음 아이가 외부 서비스 (예 : rlogind,) 인 경우 실행할 수 있거나, 아마도 내부 INETD 서비스 (echo, timeofday) 중 하나 일 수도 있습니다.

"스레드"/"프로세스"로 그렇게 할 수 없습니다.

리누스

면접관의 관점에서, 기본적으로 과정과 같은 명백한 것 외에도 여러 스레드를 가질 수있는 것 외에도 기본적으로 듣고 싶은 3 가지 주요 사항이 있습니다.

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

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

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

다음은 제가 기사 중 하나에서 얻은 것입니다. 코드 프로젝트. 나는 그것이 필요한 모든 것을 명확하게 설명한다고 생각합니다.

스레드는 워크로드를 별도의 실행 스트림으로 분할하는 또 다른 메커니즘입니다. 스레드는 프로세스보다 가벼운 무게입니다. 즉, 완전 날려서 유연성이 적은 유연성을 제공하지만 운영 체제가 설정하는 것이 적기 때문에 더 빨리 시작할 수 있습니다. 프로그램이 둘 이상의 스레드로 구성되면 모든 스레드는 단일 메모리 공간을 공유합니다. 프로세스에는 별도의 주소 공간이 제공됩니다. 모든 스레드는 단일 힙을 공유합니다. 그러나 각 스레드에는 자체 스택이 주어집니다.

  1. 기본적으로 스레드는 프로세스가없는 프로세스의 일부입니다. 스레드는 작동 할 수 없습니다.
  2. 스레드는 가벼운 반면 프로세스는 헤비급입니다.
  3. 프로세스 간의 통신에는 시간이 필요하지만 스레드는 시간이 적은 시간이 필요합니다.
  4. 스레드는 동일한 메모리 영역을 공유 할 수 있지만 프로세스는 별도의 상태입니다.

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

: 스레드는 "다른 사람"이라는 개념을 기반으로 프로그램의 다른 부분과 함께 실행되는 기능입니다. 그래서 스레드는 프로세스의 일부입니다 ..

임베디드 세상에서 나오면서 프로세스의 개념은 "큰"프로세서에만 존재한다고 덧붙이고 싶습니다.데스크탑 CPU, 암 피질 A-9) MMU (메모리 관리 장치)와 MMU를 사용하는 운영 체제 (예 : 리눅스). 소규모/기존 프로세서 및 마이크로 컨트롤러 및 소규모 RTO 운영 체제 (실시간 운영 체제), Freertos와 같은) MMU 지원은 없으며 프로세스는 없지만 스레드 만 있습니다.

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

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

  1. 버기 프로세스가 전체 시스템에 충돌하지 않도록합니다.
  2. 다른 프로세스를 통해 데이터를 보이지 않고 도달 할 수없는 보안 유지 보안 유지. 프로세스 내부의 실제 작업은 하나 이상의 스레드로 처리됩니다.

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

멀티 코어 시스템은 여러 실행 스레드를 실행할 수 있으므로 파이썬은 멀티 스레딩을 지원해야합니다. 그러나 Python은 편집 된 언어가 아니며 대신 해석 된 언어입니다.1. 이는 프로그램이 실행되기 위해 해석되어야하며, 통역사는 실행을 시작하기 전에 프로그램을 인식하지 못한다는 것을 의미합니다. 그러나 아는 것은 파이썬의 규칙이며 해당 규칙을 동적으로 적용합니다. 그런 다음 Python의 최적화는 주로 실행될 코드가 아니라 통역사 자체의 최적화 여야합니다. 이는 C ++와 같은 컴파일 된 언어와 대조적이며 파이썬에서 멀티 스레딩에 영향을 미칩니다. 특히 Python은 글로벌 통역사 잠금을 사용하여 멀티 스레딩을 관리합니다.

반면에 편집 된 언어는 편집됩니다. 이 프로그램은 "전적으로"처리되며, 먼저 구문 정의에 따라 해석 된 다음 언어 불가지성 중간 표현에 매핑 된 다음 최종적으로 실행 가능한 코드에 연결됩니다. 이 프로세스를 통해 코드는 컴파일시 모두 사용할 수 있으므로 코드를 최적화 할 수 있습니다. 다양한 프로그램 상호 작용과 관계는 실행 파일이 생성 될 때 정의되며 최적화에 대한 강력한 결정이 이루어질 수 있습니다.

현대 환경에서 Python의 통역사는 멀티 스레딩을 허용해야하며 이는 안전하고 효율적이어야합니다. 이것은 해석 된 언어와 편집 된 언어의 차이가 그림에 들어가는 곳입니다. 통역사는 다른 스레드에서 내부 공유 데이터를 방해해서는 안되며 동시에 계산에 프로세서 사용을 최적화해야합니다.

이전 게시물에서 언급 된 바와 같이 프로세스와 스레드는 모두 독립적 인 순차 실행이며, 주요 차이는 메모리가 여러 스레드에서 공유되는 반면 프로세스는 메모리 공간을 분리한다는 것입니다.

파이썬 데이터는 글로벌 통역사 잠금에 의해 다른 스레드에 의한 동시 액세스로부터 보호됩니다. 모든 파이썬 프로그램에서 언제든지 하나의 스레드 만 실행할 수 있어야합니다. 반면에 각 프로세스의 메모리가 다른 프로세스에서 분리되기 때문에 여러 프로세스를 실행할 수 있으며 프로세스는 여러 코어에서 실행될 수 있습니다.


1 Donald Knuth는 컴퓨터 프로그래밍 기술 : 기본 알고리즘에서 해석 루틴에 대한 좋은 설명을 가지고 있습니다.

Linux 커널의 OS보기에서 대답하려고합니다.

프로그램은 메모리에 시작될 때 프로세스가됩니다. 프로세스에는 고유 한 주소 공간이 있습니다. 컴파일 된 코드 저장을위한 .Text Segement, 초기화되지 않은 정적 또는 글로벌 변수를 저장하기위한 .BSS 등의 메모리에 다양한 세그먼트가있는 것을 의미합니다. 각 프로세스는 자체 프로그램 카운터 및 사용자 SPCAE가 있습니다. 스택. 커널 내부에는 각 프로세스에 자체 커널 스택 (보안 문제를 위해 사용자 공간 스택과 분리 됨)과 이름이 지정된 구조가 있습니다. task_struct 이는 일반적으로 프로세스 제어 블록으로 추상화되며 우선 순위, 상태 및 다른 많은 청크와 같은 프로세스에 관한 모든 정보를 저장합니다. 프로세스에는 여러 개의 실행 스레드가있을 수 있습니다.

스레드에 와서 프로세스 내부에 거주하고 파일 시스템 리소스, 보류중인 신호 공유, 데이터 공유 (변수 및 지침)와 같은 스레드 생성 중에 전달할 수있는 다른 리소스와 함께 부모 프로세스의 주소 공간을 공유하여 스레드를 가볍게 만들고 스레드를 가볍게 만들고 있습니다. 따라서 더 빠른 컨텍스트 전환을 허용합니다. 커널 내부에는 각 스레드에 자체 커널 스택이 있습니다. task_struct 스레드를 정의하는 구조. 따라서 커널은 다른 엔티티와 동일한 프로세스의 스레드를보고 자체적으로 예약 할 수 있습니다. 동일한 프로세스의 스레드는 스레드 그룹 ID라고하는 공통 ID를 공유합니다 (tgid), 그들은 또한 프로세스 ID라고 불리는 고유 ID를 가지고 있습니다 (pid).

시각화를 통해 학습에 더 편한 사람들을 위해 프로세스와 스레드를 설명하기 위해 만든 편리한 다이어그램이 있습니다.
MSDN의 정보를 사용했습니다. 프로세스 및 스레드에 대해

Processes and Threads

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

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

베스트 답변

프로세스:

프로세스는 기본적으로 실행 프로그램입니다. 활발한 개체입니다. 일부 운영 체제는 '작업'이라는 용어를 사용하여 실행중인 프로그램을 참조합니다. 프로세스는 항상 기본 메모리 또는 기본 메모리 또는 임의의 액세스 메모리라고하는 기본 메모리에 저장됩니다. 따라서 프로세스를 활성 엔티티라고합니다. 기계가 재부팅되면 사라집니다. 여러 프로세스가 동일한 프로그램과 관련 될 수 있습니다. 멀티 프로세서 시스템에서 여러 프로세스를 병렬로 실행할 수 있습니다. Uni-Processor 시스템에서는 실제 병렬 처리가 달성되지 않지만 프로세스 일정 알고리즘이 적용되고 프로세서는 각 프로세스를 한 번에 하나씩 실행하여 동시성의 환상을 산출 할 수 있습니다. 예 : '계산기'프로그램의 여러 인스턴스 실행. 각 인스턴스는 프로세스라고합니다.

실:

스레드는 프로세스의 하위 집합입니다. 실제 프로세스와 유사하지만 프로세스의 맥락에서 실행되며 커널에 의해 프로세스에 할당 된 동일한 리소스를 공유하기 때문에 '경량 프로세스'라고합니다. 일반적으로 프로세스에는 한 번에 하나의 기계 지침 세트가 하나만 있어야합니다. 과정은 지침을 동시에 실행하는 여러 실행 스레드로 구성 될 수 있습니다. 다수의 제어 스레드는 다중 프로세서 시스템에서 가능한 진정한 병렬 처리를 악용 할 수 있습니다. Uni-Processor 시스템에서 스레드 스케줄링 알고리즘이 적용되고 프로세서는 각 스레드를 한 번에 하나씩 실행하도록 예약됩니다. 프로세스 내에서 실행되는 모든 스레드는 동일한 주소 공간, 파일 설명자, 스택 및 기타 프로세스 관련 속성을 공유합니다. 프로세스의 스레드는 동일한 메모리를 공유하므로 공유 데이터에 대한 액세스를 프로세스와 동기화하는 프로세스는 전례없는 중요성을 얻습니다.

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

내가 지금까지 찾은 가장 좋은 대답은입니다 Michael Kerrisk의 'Linux 프로그래밍 인터페이스':

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

이 책은 큰 명확성의 원천입니다. Julia Evans 이 기사.

그것들은 거의 동일하지만 ... 핵심 차이는 스레드가 가벼우 며 컨텍스트 전환, 작업 하중 등의 측면에서 프로세스가 무거운 체중입니다.

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

소유권 단위 또는 작업에 필요한 자원과 같은 프로세스를 고려하십시오. 프로세스는 메모리 공간, 특정 입력/출력, 특정 파일 및 우선 순위와 같은 리소스를 가질 수 있습니다.

스레드는 발송 가능한 실행 단위 또는 간단한 단어로 일련의 지침을 통한 진행 상황입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top