프로세스와 스레드의 기술적 차이점은 무엇입니까?
나는 '프로세스'와 같은 단어가 남용되고 하드웨어 및 소프트웨어 스레드가 있다는 느낌을받습니다. 가벼운 프로세스는 어때?얼랑? 하나의 용어를 다른 용어보다 우선 사용해야하는 결정적인 이유가 있습니까?
프로세스와 스레드 모두 독립적 인 실행 순서입니다. 일반적인 차이점은 공유 메모리 공간에서 스레드 (동일한 프로세스의 스레드)가 실행되는 반면 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.
나는 "하드웨어"대 "소프트웨어"스레드가 무엇을 말하는지 잘 모르겠습니다. 스레드는 CPU 기능보다는 운영 환경 기능입니다 (CPU는 일반적으로 스레드를 효율적으로 만드는 작업을 수행하지만).
Erlang은 공유 메모리 다중 프로그래밍 모델을 노출시키지 않기 때문에 "프로세스"라는 용어를 사용합니다. "스레드"라고 부르는 것은 메모리를 공유한다는 의미입니다.
방법
각 프로세스는 프로그램을 실행하는 데 필요한 리소스를 제공합니다. 프로세스는 가상 주소 공간, 실행 코드, 시스템 객체에 대한 열린 핸들, 보안 컨텍스트, 고유 프로세스 식별자, 환경 변수, 우선 순위 클래스, 최소 및 최대 작업 집합 크기 및 실행 스레드를 포함합니다. 각 프로세스는 주로 1 차 스레드라고하는 단일 스레드로 시작되지만 해당 스레드에서 추가 스레드를 작성할 수 있습니다.
실
스레드는 실행을 위해 예약 할 수있는 프로세스 내의 엔티티입니다. 프로세스의 모든 스레드는 가상 주소 공간과 시스템 자원을 공유합니다. 또한 각 스레드는 예외 처리기, 일정 우선 순위, 스레드 로컬 저장소, 고유 한 스레드 식별자 및 시스템이 예약 될 때까지 스레드 컨텍스트를 저장하는 데 사용할 구조 집합을 유지 관리합니다. 쓰레드 컨텍스트는 쓰레드의 머신 레지스터 세트, 커널 스택, 쓰레드 환경 블록, 쓰레드 프로세스의 주소 공간에있는 사용자 스택을 포함한다. 쓰레드는 자신 만의 보안 컨텍스트를 가질 수 있으며, 이는 클라이언트를 가장하는 데 사용될 수 있습니다.
여기 MSDN에서 이것을 발견 :
프로세스 및 스레드 정보
Microsoft Windows는 선점 형 멀티 태스킹을 지원하므로 여러 프로세스의 여러 스레드를 동시에 실행할 수 있습니다. 다중 프로세서 컴퓨터에서 시스템은 컴퓨터에 프로세서가있는 수만큼의 스레드를 동시에 실행할 수 있습니다.
방법:
실:
나는 위의 정보를지식 퀘스트! 블로그.
먼저, 이론적 측면을 살펴 보겠습니다. 프로세스와 스레드의 차이점과 그 차이점을 이해하려면 프로세스가 개념적으로 무엇인지 이해해야합니다.
우리는 다음 절을 가지고 있습니다.2.2.2 고전적인 모형 모형...에서현대 운영 체제 3eTanenbaum :
프로세스 모델은 두 가지 독립적 인 개념, 즉 자원 그룹화 및 실행 때때로 그들을 분리하는 것이 유용합니다. 이것은 스레드가 들어오는 곳입니다 ....
그는 계속한다:
프로세스를 보는 한 가지 방법은 프로세스를 보는 것입니다. 관련 리소스를 함께 그룹화합니다. 프로세스에는 주소 공간이 있습니다. 프로그램 텍스트와 데이터 및 기타 리소스가 포함되어 있습니다. 이들 리소스에는 열린 파일, 하위 프로세스, 보류중인 경보, 시그널 핸들러, 회계 정보 등을 제공합니다. 그들을 넣음으로써 함께 프로세스의 형태로, 그들은 더 쉽게 관리 될 수 있습니다. 프로세스가 가지고있는 다른 개념은 일반적으로 실행 스레드입니다. 스레드로 줄었습니다. 쓰레드는 프로그램 카운터를 가지고 있습니다. 다음에 실행할 명령을 추적합니다. 그것에는 레지스터가 있습니다. 현재 작업 변수를 보유합니다. 그것에는 스택이 있습니다. 실행 기록, 각 프로 시저마다 하나의 프레임이 호출되지만 그렇지 않은 경우 아직 돌아왔다. 스레드가 어떤 프로세스에서 실행되어야하지만, 쓰레드와 그 프로세스는 다른 개념이며 처리 될 수있다. 따로 따로. 프로세스는 자원을 그룹화하는 데 사용됩니다. 실 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 및동시 멀티 스레딩(간단히 SMT).
이제 소프트웨어 측면을 살펴 보겠습니다. 기본적으로 스레드를 소프트웨어 측에서 구현할 수있는 세 가지 방법이 있습니다.
스레드를 구현하는 데 필요한 모든 기능은 CPU 상태를 저장하고 여러 스택을 유지 관리하는 기능입니다. 대부분의 경우 사용자 공간에서 수행 할 수 있습니다. 사용자 공간 스레드의 장점은 커널에 트랩 할 필요가 없으며 원하는 방식으로 스레드를 예약 할 수 있기 때문에 초고속 스레드 전환입니다. 가장 큰 단점은 I / O (전체 프로세스와 모든 사용자 스레드를 차단하는)를 차단할 수 없다는 점입니다. 이는 우리가 처음부터 스레드를 사용하는 큰 이유 중 하나입니다. 스레드를 사용하여 I / O를 차단하면 많은 경우에 프로그램 설계가 크게 단순 해집니다.
커널 스레드는 블로킹 I / O를 사용할 수있는 이점이 있으며, 모든 스케줄링 문제를 OS에 남겨 둡니다. 그러나 각 스레드 스위치는 상대적으로 느린 커널에 트래핑해야합니다. 그러나 I / O가 차단되어 스레드를 전환하는 경우 I / O 작업으로 인해 이미 커널에 갇히게되어 실제 문제가되지 않습니다.
또 다른 방법은 둘을 여러 개의 커널 스레드가 각각 여러 개의 사용자 스레드를 가지고 결합하는 것입니다.
용어에 대한 질문으로 돌아 가면 프로세스와 실행 스레드가 서로 다른 두 개념이고 사용할 용어의 선택은 사용자가 말하는 것에 달려 있다는 것을 알 수 있습니다. "경량 프로세스"라는 용어에 관해서는 개인적으로 "실행 스레드"라는 용어뿐만 아니라 진행중인 내용을 전달하지 않기 때문에 개인적으로 그 점을 보지 않습니다.
동시 프로그래밍과 관련하여 더 많은 것을 설명하려면
프로세스에는 자체 포함 된 실행 환경이 있습니다. 프로세스는 일반적으로 완전한 기본 런타임 리소스 세트를 가지고 있습니다. 특히, 각 프로세스는 자체 메모리 공간을 가지고 있습니다.
스레드는 프로세스 내에 존재하며 모든 프로세스는 적어도 하나를가집니다. 스레드는 메모리 및 열린 파일을 포함하여 프로세스의 리소스를 공유합니다. 이것은 효율적이지만 잠재적으로 문제가되는 커뮤니케이션을 만듭니다.
평균적인 사람을 염두에두고,
컴퓨터에서 Microsoft Word 및 웹 브라우저를 엽니 다. 우리는이 두 가지를프로세스들.
마이크로 소프트 워드에서는 어떤 것을 입력하면 자동으로 저장됩니다. 이제 편집과 저장이 병렬로 진행되는 것을 보았을 것입니다. 하나의 스레드에서 편집하고 다른 스레드에서 저장합니다.
응용 프로그램은 하나 이상의 프로세스로 구성됩니다. 프로세스는 가장 간단한 용어로 실행 프로그램입니다. 하나 이상의 스레드가 프로세스의 컨텍스트에서 실행됩니다. 스레드는 운영 체제가 프로세서 시간을 할당하는 기본 단위입니다. 스레드는 현재 다른 스레드가 실행중인 부분을 포함하여 프로세스 코드의 일부를 실행할 수 있습니다. 파이버는 응용 프로그램에서 수동으로 예약해야하는 실행 단위입니다. 섬유는 일정을 잡는 스레드의 컨텍스트에서 실행됩니다.
도난당한 사람이리.
프로세스는 코드, 메모리, 데이터 및 기타 리소스의 모음입니다. 스레드는 프로세스 범위 내에서 실행되는 일련의 코드입니다. 동일한 프로세스 내에서 (일반적으로) 여러 스레드가 동시에 실행될 수 있습니다.
프로세스는 응용 프로그램의 실행 인스턴스입니다. 그게 무슨 뜻 이죠? 예를 들어 Microsoft Word 아이콘을 두 번 누르면 Word를 실행하는 프로세스가 시작됩니다. 스레드는 프로세스 내의 실행 경로입니다. 또한 프로세스는 다중 스레드를 포함 할 수 있습니다. Word를 시작하면 운영 체제에서 프로세스를 만들고 해당 프로세스의 주 스레드를 실행하기 시작합니다.
스레드는 프로세스가 수행 할 수있는 모든 작업을 수행 할 수 있다는 점에 유의해야합니다. 그러나 프로세스가 여러 스레드로 구성 될 수 있으므로 스레드는 '경량'프로세스로 간주 될 수 있습니다. 따라서 스레드와 프로세스 간의 근본적인 차이는 각 스레드가 수행하는 작업입니다. 스레드는 작은 작업에 사용되는 반면, 프로세스는 더 많은 '중량'작업 (기본적으로 응용 프로그램 실행)에 사용됩니다.
스레드와 프로세스의 또 다른 차이점은 동일한 프로세스 내의 스레드는 동일한 주소 공간을 공유하지만 다른 프로세스는 그렇지 않다는 것입니다. 이를 통해 스레드는 동일한 데이터 구조와 변수를 읽고 쓸 수 있으며 스레드 간의 통신을 용이하게합니다. 프로세스 간 통신 (IPC 또는 프로세스 간 통신이라고도 함)은 매우 어렵고 리소스 집약적입니다.
방법:
예:
브라우저 (Mozilla, Chrome, IE)를여십시오. 이 시점에서 새 프로세스가 실행되기 시작합니다.
쓰레드 :
예:
브라우저에서 여러 개의 탭 열기.
프로세스와 스레드 모두 독립적 인 실행 순서입니다. 일반적인 차이점은 공유 메모리 공간에서 스레드 (동일한 프로세스의 스레드)가 실행되는 반면 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.
방법
프로그램이 실행 중입니다. 텍스트 섹션, 즉 프로그램 코드, 프로그램 카운터 & 값의 값으로 표현되는 현재 활동을 갖는다. 프로세서의 내용을 등록하십시오. 또한 함수 매개 변수, 반환 된 주소 및 로컬 변수와 같은 임시 데이터와 전역 변수를 포함하는 데이터 섹션이 포함 된 프로세스 스택도 포함됩니다. 프로세스에는 프로세스 런타임 중에 동적으로 할당되는 메모리 인 힙 (heap)도 포함될 수 있습니다.
실
스레드는 CPU 사용의 기본 단위입니다. 스레드 ID, 프로그램 카운터, 레지스터 세트 및 스택을 포함한다. 그것은 동일한 프로세스에 속한 다른 스레드와 코드 섹션, 데이터 섹션 및 열린 파일 및 신호와 같은 다른 운영 체제 자원을 공유합니다.
- 운영 체제에서 가져온 Galvin
쓰레드와 프로세스는 모두 OS 리소스 할당의 원자 단위입니다 (즉, CPU 시간이 어떻게 나누어 져 있는지와 다른 OS 리소스 소유 모델을 설명하는 동시성 모델이 있습니다). 차이점은 다음과 같습니다.
위의 Greg Hewgill은 "프로세스"라는 단어의 Erlang 의미에 대해 정확했으며이리Erlang이 가벼운 프로세스를 수행 할 수있는 이유에 대한 논의가 있습니다.
Java 세계와 관련된이 질문에 대답하려고합니다.
프로세스는 프로그램 실행이지만 스레드는 프로세스 내의 단일 실행 순서입니다. 프로세스는 다중 스레드를 포함 할 수 있습니다. 스레드는 때로는경량 공정.
예 :
예제 1 : JVM은 단일 프로세스로 실행되며 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다. 그래서 여러 스레드가 동일한 객체에 액세스 할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간을 갖습니다. 이것은 메소드의 한 스레드의 호출과 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 보호되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으므로 스레드의 안전을 위해 동기화되어야합니다.
예 2 : 프로그램에서 키 입력을 읽으면 그림을 그릴 수 없습니다. 프로그램은 키보드 입력에 모든주의를 기울여야하며 한 번에 둘 이상의 이벤트를 처리 할 능력이 부족하면 문제가 발생할 수 있습니다. 이 문제에 대한 이상적인 솔루션은 동시에 두 개 이상의 프로그램 섹션을 완벽하게 실행하는 것입니다. 스레드를 사용하면이 작업을 수행 할 수 있습니다. 그림 그리기 그림은 프로세스이며 읽기 키 입력은 하위 프로세스 (스레드)입니다.
프로세스는 응용 프로그램의 실행 인스턴스이고 스레드는 프로세스 내에서 실행 경로입니다. 또한 프로세스는 여러 스레드를 포함 할 수 있습니다. 스레드는 프로세스가 수행 할 수있는 모든 작업을 수행 할 수 있다는 점에 유의해야합니다. 그러나 프로세스가 여러 스레드로 구성 될 수 있으므로 스레드는 '경량'프로세스로 간주 될 수 있습니다. 따라서 스레드와 프로세스 간의 근본적인 차이는 각 스레드가 수행하는 작업입니다. 스레드는 작은 작업에 사용되는 반면, 프로세스는 더 많은 '중량'작업 (기본적으로 응용 프로그램 실행)에 사용됩니다.
스레드와 프로세스의 또 다른 차이점은 동일한 프로세스 내의 스레드는 동일한 주소 공간을 공유하지만 다른 프로세스는 그렇지 않다는 것입니다. 이를 통해 스레드는 동일한 데이터 구조와 변수를 읽고 쓸 수 있으며 스레드 간의 통신을 용이하게합니다. 프로세스 간 통신 (IPC 또는 프로세스 간 통신이라고도 함)은 매우 어렵고 리소스 집약적입니다.
다음은 스레드와 프로세스의 차이점을 요약 한 것입니다.
스레드는 프로세스보다 프로세스보다 생성하기 쉽습니다. 별도의 주소 공간이 필요하지 않습니다.
멀티 스레딩은 스레드 한 스레드 만 수정해야하는 데이터 구조 공유 한 번에. 스레드와 달리 프로세스가 동일한 프로세스를 공유하지 않습니다. 주소 공간.
스레드는 멀리 사용하기 때문에 경량으로 간주됩니다. 프로세스보다 리소스가 적습니다.
프로세스는 서로 독립적입니다. 쓰레드
동일한 주소 공간을 공유하는 것이 상호 의존적이므로주의해야합니다.
서로 다른 스레드가 서로 밟지 않도록해야합니다.
이것은 위의 2 번을 말하는 또 다른 방법입니다.
프로세스는 여러 스레드로 구성 될 수 있습니다.
면접관의 관점에서 볼 때 기본적으로 듣고 싶은 3 가지 주요한 것들이 있습니다. 물론 프로세스가 여러 스레드를 가질 수있는 명백한 것들 외에 :
더 원한다면 Scott Langham의 대답은 모든 것을 다루고 있습니다. 이 모든 것은 운영 체제의 관점에서 나온 것입니다. 다른 언어는 작업, 경량 스레드 등과 같은 다른 개념을 구현할 수 있지만 스레드 (Windows에서는 광섬유)를 사용하는 방법 일뿐입니다. 하드웨어 및 소프트웨어 스레드가 없습니다. 하드웨어와 소프트웨어가 있습니다.예외과인터럽트, 또는 사용자 모드와 커널실.
다음은에 대한 기사 중 하나에서 얻은 것입니다.코드 프로젝트. 나는 그것이 모든 것이 분명하게 필요한 것이라고 설명한다.
쓰레드는 작업 부하를 분리하여 분리하는 또 다른 메커니즘입니다 실행 스트림. 스레드는 프로세스보다 가벼운 무게입니다. 이 즉, 전체 프로세스보다 유연성이 떨어지지 만 운영 체제가 더 적기 때문에 더 빨리 시작될 수 있습니다. 설정. 프로그램이 두 개 이상의 스레드로 구성되어 있으면 모든 스레드는 단일 메모리 공간을 공유합니다. 프로세스에는 별도의 주소 공간이 제공됩니다. 모든 스레드는 단일 힙을 공유합니다. 그러나 각 스레드에는 자체 스택이 제공됩니다.
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
Linus Torvalds (torvalds@cs.helsinki.fi)
화, 1996 년 8 월 6 일 12시 47 분 31 초 +0300 (EST 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 그들의 맥락의 일부를 서로 공유 할 수 있고, 하나는부분 집합의 공유는 전통적인 "스레드"/ "프로세스"설정이지만 그 실제로 하위 집합으로 만 표시되어야합니다 (중요한 하위 집합이지만 그 중요성은 디자인이 아니라 표준에서 비롯됩니다. Linux 기반의 표준 준수 쓰레드 프로그램을 실행하고 싶다. 너무).
즉, 스레드 / 프로세스 사고 방식을 중심으로 디자인하지 마십시오. 그만큼 커널은 COE 사고 방식을 중심으로 설계되어야하며, pthreads도서관제한된 pthreads 인터페이스를 사용자에게 내보낼 수 있습니다. 누가 COE를 보는 그 방법을 사용하고 싶어하는지.
COE를 다음과 같이 생각할 때 가능한 일의 예처럼 스레드 / 프로세스에 반대 :
- 외부 "cd"프로그램을 할 수 있습니다. 유닉스 및 / 또는 프로세스 / 쓰레드에서 전통적으로 불가능한 것입니다. (바보 같은 예입니다. 이러한 종류의 "모듈"을 가질 수 있다는 것입니다. 전통적인 UNIX / threads 설정). 수행 :
클론 (CLONE_VM | CLONE_FS);
자식 : execve ( "external-cd");
/ * "execve ()"는 VM의 연결을 끊습니다. CLONE_VM을 사용하면 복제 작업이 빨라졌습니다 * /
- "vfork ()"를 자연스럽게 수행 할 수 있습니다 (최소한의 커널 지원 만 제공하지만 CUA의 사고 방식에 완벽하게 부합합니다).
복제 (CLONE_VM);
자식 : 계속 실행, 결국 execve ()
어머니 : execve를 기다립니다.
- 외부 "IO deamons"를 수행 할 수 있습니다.
클론 (CLONE_FILES);
자식 : 열린 파일 기술자 등
어머니 : fd의 아이를 열어서 사용하십시오.
위의 모든 작업은 스레드 / 프로세스에 묶여 있지 않기 때문에 가능합니다. 사고 방식. 예를 들어 웹 서버를 생각해보십시오. CGI 스크립트는 "실행 스레드"로 수행됩니다. 너는 그것으로 할 수 없다. 전통적인 스레드는 항상 공유해야하기 때문에 전체 주소 공간, 그래서 당신은 모든 것을 연결해야 할거야. 웹 서버 자체에서 수행하고 싶었습니다 ( "스레드"가 다른 스레드를 실행할 수 없음). 실행 파일).
이를 대신 "실행 컨텍스트"문제로 생각하면 태스크는 이제 외부 프로그램을 실행하도록 선택할 수 있습니다 (= 부모로부터의 주소 공간) 등을 원하는지, 아니면 부모와 모든 것을 공유하는 예제외파일 설명자 (하위 "스레드"가 부모님은 걱정할 필요가 있습니다. 하위 "스레드"가 종료되고 부모에서 fd를 사용하지 않습니다).
예를 들어 스레드 된 "inetd"를 생각해보십시오. 낮은 오버 헤드를 원한다. fork + exec를 사용하면 리눅스에서 "fork ()"대신에 " 각 스레드가 만들어지는 다중 스레드 inetd를 작성합니다. CLONE_VM (주소 공간을 공유하지만 파일 설명자는 공유하지 않음) 기타). 그런 다음 외부 서비스 인 경우 자녀가 execve 할 수 있습니다 (rlogind, 예를 들어) 또는 내부 inetd 서비스 중 하나 일 수 있습니다. (echo, timeofday) 어떤 경우에는 그냥 일을하고 종료합니다.
"스레드"/ "프로세스"로는이를 수행 할 수 없습니다.
리누스
임베디드 세계에서 나온 프로세스의 개념은 "큰"프로세서에만 존재한다고 덧붙이고 싶습니다. (데스크탑 CPU, ARM Cortex A-9), MMU (메모리 관리 장치) 및 MMU 사용을 지원하는 운영 체제 (예 :리눅스). 소형 / 구형 프로세서 및 마이크로 컨트롤러 및 소형 RTOS 운영 체제 (실시간 운영 체제), freeRTOS와 같이 MMU 지원이 없으므로 프로세스가없고 스레드 만 존재합니다.
실서로 다른 메모리에 액세스 할 수 있으며 인터럽트 방식으로 OS별로 예약되므로 병렬로 실행되거나 실제로 병렬로 실행되는 다중 코어로 실행됩니다.
프로세스는 반면에 MMU가 제공하고 보호하는 가상 메모리의 사적인 샌드 박스에서 살고 있습니다. 이것은 다음을 가능하게 해주기 때문에 편리합니다.
멀티 스레딩을 통합 한 파이썬 (인터프리터 언어) 알고리즘을 구축하는 동안 이전에 작성한 순차 알고리즘과 비교할 때 실행 시간이 더 좋지 않다는 사실에 놀랐습니다. 이 결과에 대한 이유를 이해하기 위해 필자는 약간의 독서를했으며, 내가 배운 것은 멀티 스레딩과 다중 프로세스 간의 차이점을보다 잘 이해할 수있는 흥미로운 컨텍스트를 제공한다고 믿습니다.
멀티 코어 시스템은 다중 스레드 실행을 수행 할 수 있으므로 파이썬은 멀티 스레딩을 지원해야합니다. 그러나 파이썬은 컴파일 된 언어가 아니며 해석 된 언어입니다.1. 즉, 프로그램을 실행하려면 해석해야하며 인터프리터는 실행을 시작하기 전에 프로그램을 알지 못합니다. 그러나 이것이 알고있는 것은 파이썬의 규칙이며, 그 규칙을 동적으로 적용합니다. 따라서 파이썬의 최적화는 인터프리터 자체의 최적화가되어야하며 실행될 코드는 최적화되어서는 안됩니다. 이것은 C ++와 같은 컴파일 된 언어와 대조적이며 파이썬에서 멀티 스레딩에 영향을 미칩니다. 특히 파이썬은 글로벌 인터프리터 잠금을 사용하여 멀티 스레딩을 관리합니다.
반면에 컴파일 된 언어는 잘 컴파일됩니다. 프로그램은 "전체적으로"처리됩니다. 먼저 구문 론적 정의에 따라 해석 된 다음 언어에 구속받지 않는 중간 표현으로 매핑되고 마지막으로 실행 가능 코드로 링크됩니다. 이 프로세스를 사용하면 컴파일 할 때 모두 사용할 수 있기 때문에 코드를 고도로 최적화 할 수 있습니다. 다양한 프로그램 상호 작용과 관계는 실행 파일이 생성되고 최적화에 대한 강력한 결정이 내려 질 때 정의됩니다.
현대 환경에서 파이썬의 인터프리터는 멀티 스레딩을 허용해야하며 이는 안전하고 효율적이어야합니다. 이것은 해석 된 언어 대 컴파일 된 언어의 차이점이 그림에 들어가는 곳입니다. 인터프리터는 다른 스레드의 내부 공유 데이터를 방해하지 않아야하며 동시에 계산을 위해 프로세서 사용을 최적화해야합니다.
이전 게시물에서 언급했듯이 프로세스와 스레드는 모두 독립적 인 순차 실행이며 프로세스의 여러 스레드간에 메모리가 공유되는 반면 프로세스는 메모리 공간을 격리합니다.
파이썬에서 데이터는 글로벌 인터프리터 잠금 (Global Interpreter Lock)에 의해 다른 스레드에 의한 동시 액세스로부터 보호됩니다. 모든 파이썬 프로그램에서 언제든지 하나의 스레드 만 실행할 수 있어야합니다. 반면에 각 프로세스의 메모리는 다른 프로세스와 분리되어 있으며 여러 코어에서 프로세스를 실행할 수 있기 때문에 여러 프로세스를 실행할 수 있습니다.
1도널드 크 누스 (Donald Knuth)는 컴퓨터 프로그래밍의 기술 : 기본 알고리즘 (Basic Algorithms)의 해석 루틴에 대해 잘 설명합니다.
Linux Kernel의 OS보기에서 답변하려고합니다.
프로그램이 메모리로 시작되면 프로세스가됩니다. 프로세스는 컴파일 된 코드 저장을위한 텍스트 세그먼트, 초기화되지 않은 정적 또는 전역 변수 저장을위한 .bss 등과 같은 메모리의 다양한 세그먼트를 갖는 자체 주소 공간을 갖습니다. 각 프로세스는 자체 프로그램 카운터 및 사용자 spcae스택. 커널 내부에서 각 프로세스는 자체 커널 스택 (보안 문제를 위해 사용자 공간 스택과 분리되어 있음)과 구조체task_struct
프로세스 제어 블록으로 일반적으로 추상화되어 프로세스의 우선 순위, 상태 (및 다른 많은 청크 전체)와 같은 프로세스에 관한 모든 정보를 저장합니다. 프로세스는 여러 스레드의 실행을 가질 수 있습니다.
쓰레드에 도착하면 프로세스 내부에 상주하며 부모 프로세스의 주소 공간을 파일 시스템 리소스, 보류중인 신호 공유, 데이터 공유 (변수 및 명령어)와 같이 쓰레드 생성 중에 전달할 수있는 다른 리소스와 함께 공유하므로 쓰레드가 가볍고 빠른 컨텍스트 스위칭이 가능합니다. 커널 내부의 각 스레드는 고유 한 커널 스택과task_struct
스레드를 정의하는 구조체. 따라서 커널은 다른 엔티티와 동일한 프로세스의 스레드를보고 자체적으로 스케줄 가능합니다. 동일한 프로세스의 스레드는 스레드 그룹 ID (tgid
), 그들은 또한 프로세스 ID로 불리는 유일한 id를 가진다 (pid
).
시각화를 통해 학습하는 것이 더 편한 사람들을 위해, 여기 프로세스와 스레드를 설명하기 위해 만든 편리한 다이어그램이 있습니다.
나는 MSDN에서 정보를 사용했다 -프로세스 및 스레드 정보
동일한 프로세스 내의 스레드는 메모리를 공유하지만 각 스레드는 자체 스택과 레지스터를 가지며 스레드는 스레드 특정 데이터를 힙에 저장합니다. 스레드는 독립적으로 실행되지 않으므로 프로세스 간 통신과 비교할 때 스레드 간 통신이 훨씬 빠릅니다.
프로세스는 동일한 메모리를 공유하지 않습니다. 하위 프로세스가 생성되면 상위 프로세스의 메모리 위치가 복제됩니다. 프로세스 통신은 파이프, 공유 메모리 및 메시지 구문 분석을 사용하여 수행됩니다. 스레드 간의 상황 전환은 매우 느립니다.
그것들은 거의 동일합니다 ... 그러나 중요한 차이점은 쓰레드가 가볍고 컨텍스트 스위칭, 작업로드 등의 측면에서 프로세스가 무겁다는 것입니다.
필자가 보았던 가장 좋은 짧은 정의는 Michael Kerrisk의 'The Linux Programming Interface'에서 나온 것이다.
현대 UNIX 구현에서 각 프로세스는 다중 스레드를 가질 수 있습니다 실행의. 스레드를 예상하는 한 가지 방법은 프로세스 집합 동일한 가상 메모리를 공유 할뿐만 아니라 다른 가상 메모리를 공유합니다. 속성. 각 스레드는 동일한 프로그램 코드를 실행하고 공유합니다. 같은 데이터 영역과 힙. 그러나 각 스레드에는 자체 스택이 있습니다. 지역 변수 및 함수 호출 연결 정보를 포함합니다. [LPI 2.12]
예 1 : JVM은 단일 프로세스로 실행되며 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다. 그래서 여러 스레드가 동일한 객체에 액세스 할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간을 갖습니다. 이것은 메소드의 한 스레드의 호출과 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 보호되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으므로 스레드의 안전을 위해 동기화되어야합니다.
소유권 단위 또는 작업에서 필요한 리소스와 같은 프로세스를 고려하십시오. 프로세스는 메모리 공간, 특정 입 / 출력, 특정 파일 및 우선 순위 등과 같은 자원을 가질 수 있습니다.
쓰레드는 디스패치 할 수있는 실행 단위이거나 간단한 단어로 일련의 명령을 통한 진행