프로세스와 스레드의 기술적 차이점은 무엇입니까?
'프로세스'라는 단어가 남용되고 하드웨어 및 소프트웨어 스레드도 있다는 느낌이 듭니다. Erlang 과 같은 언어로 된 경량 프로세스는 어떻습니까? 한 용어를 다른 용어보다 사용해야 하는 확실한 이유가 있습니까?
질문자 :James Fassett
프로세스와 스레드의 기술적 차이점은 무엇입니까?
'프로세스'라는 단어가 남용되고 하드웨어 및 소프트웨어 스레드도 있다는 느낌이 듭니다. Erlang 과 같은 언어로 된 경량 프로세스는 어떻습니까? 한 용어를 다른 용어보다 사용해야 하는 확실한 이유가 있습니까?
프로세스와 스레드는 모두 독립적인 실행 시퀀스입니다. 일반적인 차이점은 (동일한 프로세스의) 스레드는 공유 메모리 공간에서 실행되는 반면 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.
나는 당신이 말하는 "하드웨어"와 "소프트웨어" 스레드가 무엇인지 잘 모르겠습니다. 스레드는 CPU 기능이 아니라 운영 환경 기능입니다(CPU에는 일반적으로 스레드를 효율적으로 만드는 작업이 있음).
Erlang은 공유 메모리 다중 프로그래밍 모델을 노출하지 않기 때문에 "프로세스"라는 용어를 사용합니다. 그것들을 "스레드"라고 부르는 것은 그들이 공유 메모리를 가지고 있음을 의미합니다.
프로세스
각 프로세스는 프로그램을 실행하는 데 필요한 리소스를 제공합니다. 프로세스에는 가상 주소 공간, 실행 가능한 코드, 시스템 개체에 대한 열린 핸들, 보안 컨텍스트, 고유한 프로세스 식별자, 환경 변수, 우선 순위 클래스, 최소 및 최대 작업 집합 크기, 최소 하나의 실행 스레드가 있습니다. 각 프로세스는 종종 기본 스레드라고 하는 단일 스레드로 시작되지만 해당 스레드에서 추가 스레드를 생성할 수 있습니다.
실
스레드는 실행을 예약할 수 있는 프로세스 내의 엔터티입니다. 프로세스의 모든 스레드는 가상 주소 공간과 시스템 리소스를 공유합니다. 또한 각 스레드는 예외 처리기, 스케줄링 우선 순위, 스레드 로컬 저장소, 고유한 스레드 식별자 및 스케줄링될 때까지 시스템이 스레드 컨텍스트를 저장하는 데 사용할 구조 집합을 유지 관리합니다. 스레드 컨텍스트에는 스레드의 머신 레지스터 세트, 커널 스택, 스레드 환경 블록 및 스레드 프로세스의 주소 공간에 있는 사용자 스택이 포함됩니다. 스레드는 클라이언트를 가장하는 데 사용할 수 있는 자체 보안 컨텍스트를 가질 수도 있습니다.
이 정보는 Microsoft Docs에서 찾을 수 있습니다. 프로세스 및 스레드 정보
Microsoft Windows는 여러 프로세스에서 여러 스레드를 동시에 실행하는 효과를 생성하는 선점형 멀티태스킹을 지원합니다. 다중 프로세서 컴퓨터에서 시스템은 컴퓨터에 있는 프로세서 수만큼 스레드를 동시에 실행할 수 있습니다.
프로세스:
실:
먼저 이론적 측면을 살펴보자. 프로세스와 스레드 간의 차이점과 이들 간에 공유되는 내용을 이해하려면 개념적으로 프로세스가 무엇인지 이해해야 합니다.
Tanenbaum의 2.2.2 최신 운영 체제 3e 의 클래식 스레드 모델 섹션에는 다음이 있습니다.
프로세스 모델은 리소스 그룹화와 실행이라는 두 가지 독립적인 개념을 기반으로 합니다. 때때로 그것들을 분리하는 것이 유용합니다. 이것은 스레드가 들어오는 곳입니다....
그는 계속한다:
프로세스를 보는 한 가지 방법은 관련 리소스를 함께 그룹화하는 방법이라는 것입니다. 프로세스에는 프로그램 텍스트, 데이터 및 기타 리소스가 포함된 주소 공간이 있습니다. 이러한 리소스에는 열린 파일, 하위 프로세스, 보류 중인 경보, 신호 처리기, 계정 정보 등이 포함될 수 있습니다. 그것들을 하나의 프로세스 형태로 묶음으로써 보다 쉽게 관리할 수 있습니다. 프로세스가 가지고 있는 또 다른 개념은 실행 스레드이며 일반적으로 스레드로 단축됩니다. 스레드에는 다음에 실행할 명령어를 추적하는 프로그램 카운터가 있습니다. 현재 작업 변수를 보유하는 레지스터가 있습니다. 호출되었지만 아직 반환되지 않은 각 프로시저에 대해 하나의 프레임이 있는 실행 기록이 포함된 스택이 있습니다. 쓰레드는 어떤 프로세스에서 실행되어야 하지만 쓰레드와 그 프로세스는 다른 개념이고 별도로 취급될 수 있다. 프로세스는 리소스를 함께 그룹화하는 데 사용됩니다. 스레드는 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는 단일 프로그램 카운터 (PC) 및 레지스터 집합을 통해 스레드 상태를 유지하면서 단일 스레드 실행을 지원합니다. 하지만 캐시 미스가 발생하면 어떻게 될까요? 메인 메모리에서 데이터를 가져오는 데 오랜 시간이 걸리며, 그 동안 CPU는 유휴 상태로 있습니다. 그래서 누군가는 기본적으로 두 세트의 스레드 상태(PC + 레지스터)를 갖고 있어 다른 스레드(동일한 프로세스에 있을 수도 있고, 다른 프로세스에 있을 수도 있음)가 다른 스레드가 주 메모리에서 대기하는 동안 작업을 완료할 수 있다는 아이디어를 가지고 있었습니다. 하이퍼 스레딩 및동시 다중 스레딩 (줄여서 SMT)과 같이 이 개념의 여러 이름과 구현이 있습니다.
이제 소프트웨어 측면을 살펴보겠습니다. 기본적으로 소프트웨어 측에서 스레드를 구현할 수 있는 세 가지 방법이 있습니다.
스레드를 구현하는 데 필요한 것은 CPU 상태를 저장하고 여러 스택을 유지하는 기능뿐이며, 이는 많은 경우 사용자 공간에서 수행할 수 있습니다. 사용자 공간 스레드의 장점은 커널에 트랩할 필요가 없고 원하는 방식으로 스레드를 예약할 수 있는 능력이 있기 때문에 초고속 스레드 전환입니다. 가장 큰 단점은 I/O를 차단할 수 없다는 것입니다(전체 프로세스와 모든 사용자 스레드를 차단함). 이것이 우리가 처음에 스레드를 사용하는 큰 이유 중 하나입니다. 스레드를 사용하여 I/O를 차단하면 많은 경우에 프로그램 설계가 크게 단순화됩니다.
커널 스레드는 모든 스케줄링 문제를 OS에 맡기는 것 외에도 차단 I/O를 사용할 수 있다는 이점이 있습니다. 그러나 각 스레드 스위치는 잠재적으로 상대적으로 느린 커널에 트래핑해야 합니다. 그러나 차단된 I/O로 인해 스레드를 전환하는 경우 I/O 작업이 이미 어쨌든 커널에 갇혔을 수 있기 때문에 이것은 실제로 문제가 되지 않습니다.
또 다른 접근 방식은 각각 여러 사용자 스레드가 있는 여러 커널 스레드를 사용하여 둘을 결합하는 것입니다.
따라서 용어에 대한 질문으로 돌아가서 프로세스와 실행 스레드가 두 가지 다른 개념이며 사용할 용어의 선택은 말하는 내용에 따라 다르다는 것을 알 수 있습니다. "경량 프로세스"라는 용어와 관련하여 "실행 스레드"라는 용어뿐만 아니라 진행 상황을 실제로 전달하지 않기 때문에 개인적으로 요점을 알지 못합니다.
동시 프로그래밍에 대해 더 설명하려면
프로세스에는 자체 포함된 실행 환경이 있습니다. 프로세스에는 일반적으로 기본 런타임 리소스의 완전한 개인 집합이 있습니다. 특히 각 프로세스에는 고유한 메모리 공간이 있습니다.
스레드는 프로세스 내에 존재합니다. 모든 프로세스에는 적어도 하나가 있습니다. 스레드는 메모리 및 열린 파일을 포함하여 프로세스의 리소스를 공유합니다. 이것은 효율적이지만 잠재적으로 문제가 있는 의사소통을 가능하게 합니다.
평균적인 사람을 염두에 둔 예:
컴퓨터에서 Microsoft Word와 웹 브라우저를 엽니다. 우리는 이 두 프로세스를 호출합니다.
Microsoft Word에서 무언가를 입력하면 자동으로 저장됩니다. 이제 한 스레드에서 편집하고 다른 스레드에서 저장하는 편집과 저장이 병렬로 발생하는 것을 관찰했습니다.
애플리케이션은 하나 이상의 프로세스로 구성됩니다. 프로세스는 가장 간단한 용어로 실행 중인 프로그램입니다. 하나 이상의 스레드가 프로세스 컨텍스트에서 실행됩니다. 스레드는 운영 체제가 프로세서 시간을 할당하는 기본 단위입니다. 스레드는 현재 다른 스레드에서 실행 중인 부분을 포함하여 프로세스 코드의 모든 부분을 실행할 수 있습니다. 광섬유는 응용 프로그램에서 수동으로 예약해야 하는 실행 단위입니다. 파이버는 스케줄을 지정하는 스레드의 컨텍스트에서 실행됩니다.
여기 에서 도난당했습니다.
프로세스는 코드, 메모리, 데이터 및 기타 리소스의 모음입니다. 스레드는 프로세스 범위 내에서 실행되는 코드 시퀀스입니다. (일반적으로) 동일한 프로세스 내에서 동시에 실행되는 여러 스레드를 가질 수 있습니다.
프로세스:
예시:
모든 브라우저(mozilla, Chrome, IE)를 엽니다. 이 시점에서 새로운 프로세스가 실행되기 시작합니다.
스레드:
스레드와 프로세스는 모두 OS 리소스 할당의 원자 단위입니다(즉, CPU 시간이 이들 사이에 어떻게 나누어지는지를 설명하는 동시성 모델과 다른 OS 리소스를 소유하는 모델이 있습니다). 다음과 같은 차이점이 있습니다.
위의 Greg Hewgill은 "프로세스"라는 단어의 Erlang 의미에 대해 정확했으며 여기에 Erlang이 가벼운 프로세스를 수행할 수 있는 이유에 대한 논의가 있습니다.
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는 컨텍스트의 일부를 서로 공유할 수 있으며 해당 공유의 한 하위 집합 은 기존의 "스레드"/"프로세스" 설정이지만 실제로는 하위 집합으로만 보아야 합니다(중요한 하위 집합이지만 그 중요성은 설계가 아니라 표준에서: 우리는 Linux 위에서도 표준을 준수하는 스레드 프로그램을 실행하기를 분명히 원합니다.
요컨대: 스레드/프로세스 사고 방식을 중심으로 설계하지 마십시오. 커널은 COE의 사고 방식을 중심으로 설계되어야 하며, 그러면 pthreads 라이브러리 는 COE를 보는 방식을 사용하려는 사용자에게 제한된 pthreads 인터페이스를 내보낼 수 있습니다.
스레드/프로세스와 반대되는 COE를 생각할 때 가능한 것의 예로서:
- UNIX 및/또는 프로세스/스레드에서는 전통적으로 불가능했던 외부 "cd" 프로그램을 수행할 수 있습니다. /스레드 설정). 다음을 수행하십시오.
클론(CLONE_VM|CLONE_FS);
자식: execve("external-cd");
/* "execve()"는 VM의 연결을 해제하므로 CLONE_VM을 사용한 유일한 이유는 복제 작업을 더 빠르게 만드는 것이었습니다. */
- 자연스럽게 "vfork()"를 수행할 수 있습니다(최소한의 커널 지원을 필요로 하지만 해당 지원은 CUA의 사고 방식에 완벽하게 맞습니다).
클론(CLONE_VM);
자식: 계속 실행, 결국 execve()
어머니: execve를 기다려
- 외부 "IO 데몬"을 수행할 수 있습니다.
클론(CLONE_FILES);
자식: 파일 설명자 등 열기
어머니: fd의 자식을 여는 것과 vv를 사용하십시오.
위의 모든 것은 스레드/프로세스 사고 방식에 얽매이지 않기 때문에 작동합니다. 예를 들어 CGI 스크립트가 "실행 스레드"로 수행되는 웹 서버를 생각해 보십시오. 기존 스레드는 항상 전체 주소 공간을 공유해야 하기 때문에 기존 스레드로는 그렇게 할 수 없습니다. 다른 실행 파일).
대신 이것을 "실행 컨텍스트" 문제로 생각하면 작업에서 원하는 경우 외부 프로그램(= 부모로부터 주소 공간 분리) 등을 실행하도록 선택할 수 있습니다. 또는 예를 들어 다음을 제외한 모든 것을 부모와 공유할 수 있습니다. 파일 설명자(하위 "스레드"가 부모가 걱정할 필요 없이 많은 파일을 열 수 있도록: 하위 "스레드"가 종료될 때 자동으로 닫히고 부모의 fd를 사용하지 않음) .
예를 들어 스레드 "inetd"를 생각해 보십시오. 낮은 오버헤드 fork+exec를 원하므로 Linux 방식으로 "fork()"를 사용하는 대신 CLONE_VM(주소 공간을 공유하지만 파일을 공유하지 않음)으로 각 스레드가 생성되는 다중 스레드 inetd를 작성할 수 있습니다. 설명자 등). 그런 다음 자식은 외부 서비스(예: rlogind)이거나 내부 inetd 서비스(echo, timeofday) 중 하나인 경우 execve할 수 있습니다. 이 경우 해당 작업을 수행하고 종료합니다.
"스레드"/"프로세스"로는 그렇게 할 수 없습니다.
라이너스
Java 세계와 관련된 이 질문에 답하려고 합니다.
프로세스는 프로그램의 실행이지만 스레드는 프로세스 내의 단일 실행 시퀀스입니다. 프로세스는 여러 스레드를 포함할 수 있습니다. 스레드를 경량 프로세스 라고도 합니다.
예를 들어:
예 1: JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다. 그렇기 때문에 여러 스레드가 동일한 개체에 액세스할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간을 갖습니다. 이것은 한 스레드의 메소드 호출과 해당 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 유지되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으며 스레드 안전을 위해 동기화되어야 합니다.
예 2: 프로그램이 키 입력을 읽어서 그림을 그리지 못할 수 있습니다. 프로그램은 키보드 입력에 모든 주의를 기울여야 하며 한 번에 둘 이상의 이벤트를 처리하는 기능이 부족하면 문제가 발생합니다. 이 문제에 대한 이상적인 솔루션은 동시에 두 개 이상의 프로그램 섹션을 원활하게 실행하는 것입니다. 스레드를 사용하면 이를 수행할 수 있습니다. 여기서 그림을 그리는 것은 프로세스이고 키 입력을 읽는 것은 하위 프로세스(스레드)입니다.
시각화를 통해 학습하는 것이 더 편한 사람들을 위해 프로세스와 스레드를 설명하기 위해 만든 편리한 다이어그램이 있습니다.
MSDN의 정보를 사용했습니다 - 프로세스 및 스레드 정보
프로세스와 스레드는 모두 독립적인 실행 시퀀스입니다. 일반적인 차이점은 (동일한 프로세스의) 스레드는 공유 메모리 공간에서 실행되는 반면 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.
프로세스
실행 중인 프로그램입니다. 그것은 텍스트 섹션, 즉 프로그램 코드, 프로그램 카운터의 값으로 표현되는 현재 활동 및 프로세서 레지스터의 내용을 가지고 있습니다. 여기에는 임시 데이터(예: 함수 매개변수, 반환 주소 및 지역 변수)가 포함된 프로세스 스택과 전역 변수가 포함된 데이터 섹션도 포함됩니다. 프로세스는 또한 프로세스 런타임 동안 동적으로 할당되는 메모리인 힙을 포함할 수 있습니다.
실
스레드는 CPU 활용의 기본 단위입니다. 스레드 ID, 프로그램 카운터, 레지스터 세트 및 스택으로 구성됩니다. 동일한 프로세스에 속한 다른 스레드와 코드 섹션, 데이터 섹션 및 열린 파일 및 신호와 같은 기타 운영 체제 리소스를 공유합니다.
-- Galvin의 운영 체제에서 가져옴
Linux Kernel의 OS View에서 답변을 시도합니다.
프로그램은 메모리로 실행될 때 프로세스가 됩니다. 프로세스에는 컴파일된 코드를 저장하기 위한 .text
세그먼트, 초기화되지 않은 정적 또는 전역 변수를 저장하기 위한 .bss
등과 같이 메모리에 다양한 세그먼트를 갖는 자체 주소 공간이 있습니다.
각 프로세스에는 자체 프로그램 카운터와 사용자 공간 스택이 있습니다.
커널 내부에서 각 프로세스는 자체 커널 스택(보안 문제를 위해 사용자 공간 스택과 분리됨)과 task_struct
라는 구조를 가지며 우선 순위와 같은 프로세스에 관한 모든 정보를 저장합니다. 상태(그리고 다른 많은 청크).
프로세스는 여러 실행 스레드를 가질 수 있습니다.
스레드에 이르면 프로세스 내부에 상주하며 파일 시스템 리소스, 보류 중인 신호 공유, 데이터(변수 및 명령) 공유와 같이 스레드 생성 중에 전달할 수 있는 다른 리소스와 함께 상위 프로세스의 주소 공간을 공유하므로 스레드를 경량화하고 따라서 더 빠른 컨텍스트 전환이 가능합니다.
커널 내부에서 각 스레드는 스레드를 정의하는 task_struct
따라서 커널은 동일한 프로세스의 스레드를 다른 엔터티로 보고 자체적으로 스케줄링할 수 있습니다. 동일한 프로세스의 스레드는 스레드 그룹 id( tgid
pid
)라고 하는 고유한 id를 갖습니다.
프로세스는 응용 프로그램의 실행 인스턴스이고 스레드는 프로세스 내 실행 경로입니다. 또한 프로세스는 여러 스레드를 포함할 수 있습니다. 스레드는 프로세스가 수행할 수 있는 모든 작업을 수행할 수 있다는 점에 유의해야 합니다. 그러나 프로세스는 여러 스레드로 구성될 수 있으므로 스레드는 '가벼운' 프로세스로 간주될 수 있습니다. 따라서 스레드와 프로세스의 근본적인 차이점은 각각이 수행하는 데 사용되는 작업입니다. 스레드는 작은 작업에 사용되는 반면 프로세스는 기본적으로 응용 프로그램 실행과 같은 '무거운' 작업에 사용됩니다.
스레드와 프로세스의 또 다른 차이점은 동일한 프로세스 내의 스레드는 동일한 주소 공간을 공유하지만 다른 프로세스는 공유하지 않는다는 것입니다. 이를 통해 스레드는 동일한 데이터 구조 및 변수에서 읽고 쓸 수 있으며 스레드 간의 통신도 용이해집니다. IPC 또는 프로세스 간 통신이라고도 하는 프로세스 간의 통신은 매우 어렵고 리소스를 많이 사용합니다.
다음은 스레드와 프로세스의 차이점에 대한 요약입니다.
스레드는 별도의 주소 공간이 필요하지 않기 때문에 프로세스보다 생성하기 쉽습니다.
멀티스레딩은 스레드가 한 번에 하나의 스레드에서만 수정되어야 하는 데이터 구조를 공유하기 때문에 신중한 프로그래밍이 필요합니다. 스레드와 달리 프로세스는 동일한 주소 공간을 공유하지 않습니다.
스레드는 프로세스보다 훨씬 적은 리소스를 사용하기 때문에 경량으로 간주됩니다.
프로세스는 서로 독립적입니다. 스레드는 동일한 주소 공간을 공유하므로 상호 의존적이므로 서로 다른 스레드가 서로 밟지 않도록 주의해야 합니다.
이것은 위의 #2를 나타내는 또 다른 방법입니다.
프로세스는 여러 스레드로 구성될 수 있습니다.
면접관의 관점에서 기본적으로 듣고 싶은 것은 3가지입니다. 프로세스가 여러 스레드를 가질 수 있는 것과 같은 명백한 것 외에도:
더 많은 것을 원하면 Scott Langham의 답변이 거의 모든 것을 다룹니다. 이 모든 것은 운영 체제의 관점에서 본 것입니다. 다른 언어는 작업, 가벼운 스레드 등과 같은 다른 개념을 구현할 수 있지만 스레드(Windows의 섬유)를 사용하는 방법일 뿐입니다. 하드웨어 및 소프트웨어 스레드가 없습니다. 하드웨어 및 소프트웨어 예외 및 인터럽트 또는 사용자 모드 및 커널 스레드가 있습니다.
다음은 Code Project 의 기사 중 하나에서 얻은 것입니다. 필요한 모든 것을 명확하게 설명한다고 생각합니다.
스레드는 워크로드를 별도의 실행 스트림으로 분할하는 또 다른 메커니즘입니다. 스레드는 프로세스보다 가볍습니다. 즉, 완전한 프로세스보다 유연성이 떨어지지만 운영 체제를 설정할 필요가 적기 때문에 더 빠르게 시작할 수 있습니다. 프로그램이 둘 이상의 스레드로 구성되면 모든 스레드가 단일 메모리 공간을 공유합니다. 프로세스에는 별도의 주소 공간이 제공됩니다. 모든 스레드는 단일 힙을 공유합니다. 그러나 각 스레드에는 자체 스택이 제공됩니다.
프로세스:
프로세스는 기본적으로 실행 중인 프로그램입니다. 활동적인 존재입니다. 일부 운영 체제에서는 '태스크'라는 용어를 사용하여 실행 중인 프로그램을 나타냅니다. 프로세스는 항상 기본 메모리 또는 랜덤 액세스 메모리라고도 하는 주 메모리에 저장됩니다. 따라서 프로세스를 활성 엔터티라고 합니다. 기기를 재부팅하면 사라집니다. 여러 프로세스가 동일한 프로그램과 연관될 수 있습니다. 다중 프로세서 시스템에서는 여러 프로세스를 병렬로 실행할 수 있습니다. 단일 프로세서 시스템에서는 진정한 병렬 처리가 이루어지지 않지만 프로세스 스케줄링 알고리즘이 적용되고 프로세서는 동시성의 환상을 생성하는 각 프로세스를 한 번에 하나씩 실행하도록 스케줄링됩니다. 예: 'Calculator' 프로그램의 여러 인스턴스 실행. 각 인스턴스를 프로세스라고 합니다.
실:
스레드는 프로세스의 하위 집합입니다. 실제 프로세스와 유사하지만 프로세스의 컨텍스트 내에서 실행되고 커널이 프로세스에 할당한 동일한 리소스를 공유하기 때문에 '경량 프로세스'라고 합니다. 일반적으로 프로세스에는 한 번에 한 세트의 기계 명령어가 실행되는 단 하나의 제어 스레드만 있습니다. 프로세스는 명령을 동시에 실행하는 여러 실행 스레드로 구성될 수도 있습니다. 다중 제어 스레드는 다중 프로세서 시스템에서 가능한 진정한 병렬 처리를 이용할 수 있습니다. 단일 프로세서 시스템에서 스레드 스케줄링 알고리즘이 적용되고 프로세서는 각 스레드를 한 번에 하나씩 실행하도록 스케줄링됩니다. 프로세스 내에서 실행되는 모든 스레드는 동일한 주소 공간, 파일 설명자, 스택 및 기타 프로세스 관련 속성을 공유합니다. 프로세스의 스레드가 동일한 메모리를 공유하기 때문에 공유 데이터에 대한 액세스를 프로세스와 동기화하는 것은 전례 없는 중요성을 갖게 됩니다.
참조- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread
임베디드 세계에서 나오는 프로세스의 개념 은 MMU(메모리 관리 장치)가 있는 "큰" 프로세서(데스크톱 CPU, ARM Cortex A-9 ) 및 MMU 사용을 지원하는 운영 체제( 리눅스 와 같은). freeRTOS와 같은 소형/구형 프로세서와 마이크로컨트롤러 및 소형 RTOS 운영 체제( 실시간 운영 체제 )에서는 MMU 지원이 없으므로 프로세스가 없고 스레드만 있습니다.
스레드 는 서로의 메모리에 액세스할 수 있으며 OS에 의해 인터리브 방식으로 스케줄링되어 병렬로 실행되는 것처럼 보입니다(또는 멀티 코어를 사용하면 실제로 병렬로 실행됨).
반면에 프로세스 는 MMU에서 제공하고 보호하는 가상 메모리의 개인 샌드박스에 있습니다. 이것은 다음을 가능하게 하기 때문에 편리합니다.
프로세스 : 실행 중인 프로그램을 프로세스라고 합니다.
쓰레드 : 쓰레드는 "하나와 다른 하나"라는 개념에 따라 프로그램의 다른 부분과 함께 실행되는 기능이므로 쓰레드는 프로세스의 일부입니다..
나는 거의 모든 답변을 읽었습니다. 아아, 현재 OS 과정을 수강하는 학부생으로서 나는 두 개념을 완전히 이해할 수 없습니다. 내 말은 대부분의 사람들이 일부 OS 책에서 읽은 차이점을 의미합니다. 즉, 스레드는 프로세스의 주소 공간을 사용하기 때문에 트랜잭션 단위의 전역 변수에 액세스할 수 있습니다. 그러나 프로세스가 있는 이유에 대한 새로운 질문이 발생합니다. 이미 우리는 스레드가 프로세스에 비해 더 가볍다는 것을 알고 있습니다. 이전 답변 중 하나 에서 발췌한 이미지를 사용하여 다음 예를 살펴보겠습니다.
Libre Office 와 같은 워드 문서에서 한 번에 작업하는 3개의 스레드가 있습니다. 첫 번째는 단어의 철자가 잘못된 경우 밑줄을 긋는 맞춤법 검사를 수행합니다. 두 번째는 키보드에서 문자를 가져와서 인쇄합니다. 그리고 마지막은 뭔가 잘못되었을 때 작업한 문서를 잃지 않기 위해 짧은 시간마다 문서를 저장합니다. 이 경우 3개의 스레드는 프로세스의 주소 공간인 공통 메모리를 공유하므로 편집 중인 문서에 모두 액세스할 수 있으므로 3개의 프로세스가 될 수 없습니다. 그래서 길은 그 중 하나가 이미지에 부족하지만 실인 두 개의 불도저와 함께 단어 문서입니다.
다중 스레딩을 통합한 Python(해석된 언어) 알고리즘을 구축하는 동안 이전에 구축한 순차 알고리즘과 비교할 때 실행 시간이 더 좋지 않다는 사실에 놀랐습니다. 이 결과에 대한 이유를 이해하기 위해 나는 약간의 독서를 했고, 내가 배운 내용이 다중 스레딩과 다중 프로세스의 차이점을 더 잘 이해할 수 있는 흥미로운 맥락을 제공한다고 믿습니다.
다중 코어 시스템은 다중 스레드 실행을 실행할 수 있으므로 Python은 다중 스레드를 지원해야 합니다. 그러나 Python은 컴파일된 언어가 아니며 대신 해석된 언어입니다 1 . 즉, 프로그램을 실행하려면 프로그램을 해석해야 하며 인터프리터는 프로그램 실행을 시작하기 전에 프로그램을 인식하지 못합니다. 그러나 그것이 알고 있는 것은 Python의 규칙이며 그런 다음 해당 규칙을 동적으로 적용합니다. Python의 최적화는 기본적으로 실행될 코드가 아니라 인터프리터 자체의 최적화여야 합니다. 이것은 C++와 같은 컴파일된 언어와 대조되며 Python의 다중 스레딩에 대한 결과를 가져옵니다. 특히 Python은 Global Interpreter Lock을 사용하여 다중 스레딩을 관리합니다.
반면에 컴파일된 언어는 컴파일됩니다. 프로그램은 "완전히" 처리되며, 먼저 구문 정의에 따라 해석된 다음 언어에 구애받지 않는 중간 표현에 매핑되고 마지막으로 실행 코드에 연결됩니다. 이 프로세스를 사용하면 컴파일 시 모두 사용할 수 있으므로 코드를 고도로 최적화할 수 있습니다. 다양한 프로그램 상호 작용 및 관계는 실행 파일이 생성될 때 정의되고 최적화에 대한 강력한 결정을 내릴 수 있습니다.
현대 환경에서 Python의 인터프리터는 멀티스레딩을 허용해야 하며 이는 안전하고 효율적이어야 합니다. 이것은 해석된 언어와 컴파일된 언어의 차이가 그림에 들어가는 곳입니다. 인터프리터는 다른 스레드에서 내부적으로 공유된 데이터를 방해해서는 안 되며 동시에 계산을 위한 프로세서 사용을 최적화해야 합니다.
이전 게시물에서 언급했듯이 프로세스와 스레드는 모두 독립적인 순차적 실행이며 주요 차이점은 프로세스의 여러 스레드에서 메모리를 공유하는 반면 프로세스는 메모리 공간을 분리한다는 것입니다.
Python에서 데이터는 Global Interpreter Lock에 의해 다른 스레드에 의한 동시 액세스로부터 보호됩니다. 모든 Python 프로그램에서 한 번에 하나의 스레드만 실행할 수 있어야 합니다. 반면에 각 프로세스의 메모리는 다른 프로세스와 분리되어 있고 프로세스는 여러 코어에서 실행할 수 있으므로 여러 프로세스를 실행할 수 있습니다.
1 Donald Knuth는 Art of Computer Programming: Fundamental Algorithms에서 해석 루틴에 대해 잘 설명했습니다.
지금까지 내가 찾은 최고의 답변은 Michael Kerrisk의 'Linux 프로그래밍 인터페이스'입니다 .
최신 UNIX 구현에서 각 프로세스는 여러 실행 스레드를 가질 수 있습니다. 스레드를 구상하는 한 가지 방법은 동일한 가상 메모리와 다른 속성 범위를 공유하는 프로세스 집합입니다. 각 스레드는 동일한 프로그램 코드를 실행하고 동일한 데이터 영역과 힙을 공유합니다. 그러나 각 스레드에는 로컬 변수와 함수 호출 연결 정보가 포함된 자체 스택이 있습니다. [LPI 2.12]
이 책은 매우 명료한 출처입니다. Julia Evans는 이 기사 에서 Linux 그룹이 실제로 작동하는 방식을 정리하는 데 도움이 된다고 언급했습니다.
동일한 프로세스 내의 스레드는 메모리를 공유하지만 각 스레드에는 고유한 스택과 레지스터가 있으며 스레드는 스레드별 데이터를 힙에 저장합니다. 스레드는 독립적으로 실행되지 않으므로 프로세스 간 통신에 비해 스레드 간 통신이 훨씬 빠릅니다.
프로세스는 동일한 메모리를 공유하지 않습니다. 자식 프로세스가 생성되면 부모 프로세스의 메모리 위치를 복제합니다. 프로세스 통신은 파이프, 공유 메모리 및 메시지 구문 분석을 사용하여 수행됩니다. 스레드 간의 컨텍스트 전환은 매우 느립니다.
예 1: JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속한 힙을 공유합니다. 그렇기 때문에 여러 스레드가 동일한 개체에 액세스할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간을 갖습니다. 이것은 한 스레드의 메소드 호출과 해당 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 유지되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으며 스레드 안전을 위해 동기화되어야 합니다.
그것들은 거의 동일합니다... 그러나 주요 차이점은 스레드가 가볍고 컨텍스트 전환, 작업 부하 등의 측면에서 프로세스가 무겁다는 것입니다.
출처 : http:www.stackoverflow.com/questions/200469/what-is-the-difference-between-a-process-and-a-thread
프록시 서버와 역방향 프록시 서버의 차이점은 무엇입니까? [닫은] (0) | 2021.12.30 |
---|---|
특정 파일을 어떻게 git stash 할 수 있습니까? (0) | 2021.12.30 |
단일 SQL 쿼리에 여러 행을 삽입하시겠습니까? [복제하다] (0) | 2021.12.30 |
'div' 컨테이너에 맞게 이미지 크기를 자동으로 조정하려면 어떻게 해야 합니까? (0) | 2021.12.30 |
단일 SQL 쿼리에 여러 행을 삽입하시겠습니까? [복제하다] (0) | 2021.12.30 |