프로세스와 스레드의 기술적 차이점은 무엇입니까?
'프로세스'와 같은 단어가 과도하게 사용되었다는 느낌이 들며 하드웨어 및 소프트웨어 스레드도 있습니다. Erlang 과 같은 언어의 경량 프로세스는 어떻습니까? 한 용어를 다른 용어보다 사용해야하는 확실한 이유가 있습니까?
프로세스와 스레드의 기술적 차이점은 무엇입니까?
'프로세스'와 같은 단어가 과도하게 사용되었다는 느낌이 들며 하드웨어 및 소프트웨어 스레드도 있습니다. Erlang 과 같은 언어의 경량 프로세스는 어떻습니까? 한 용어를 다른 용어보다 사용해야하는 확실한 이유가 있습니까?
답변:
프로세스와 스레드는 모두 독립적 인 실행 순서입니다. 일반적인 차이점은 동일한 프로세스의 스레드가 공유 메모리 공간에서 실행되고 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.
"하드웨어"와 "소프트웨어"스레드 중 무엇을 참조하는지 잘 모르겠습니다. 스레드는 CPU 기능이 아닌 운영 환경 기능입니다 (CPU에는 일반적으로 스레드를 효율적으로 만드는 작업이 있지만).
Erlang은 공유 메모리 멀티 프로그래밍 모델을 노출하지 않기 때문에 "프로세스"라는 용어를 사용합니다. "스레드"라고 부르면 메모리를 공유 한 것입니다.
프로세스
각 프로세스는 프로그램을 실행하는 데 필요한 리소스를 제공합니다. 프로세스에는 가상 주소 공간, 실행 코드, 시스템 개체에 대한 열린 핸들, 보안 컨텍스트, 고유 한 프로세스 식별자, 환경 변수, 우선 순위 클래스, 최소 및 최대 작업 세트 크기 및 하나 이상의 실행 스레드가 있습니다. 각 프로세스는 기본 스레드라고도하는 단일 스레드로 시작되지만 모든 스레드에서 추가 스레드를 작성할 수 있습니다.
스레드
스레드는 프로세스 내에서 실행 예약 될 수있는 엔티티입니다. 프로세스의 모든 스레드는 가상 주소 공간과 시스템 리소스를 공유합니다. 또한 각 스레드는 예외 처리기, 예약 우선 순위, 스레드 로컬 저장소, 고유 한 스레드 식별자 및 시스템이 예약 될 때까지 스레드 컨텍스트를 저장하는 데 사용할 구조 집합을 유지 관리합니다. 스레드 컨텍스트에는 스레드의 시스템 레지스터 세트, 커널 스택, 스레드 환경 블록 및 스레드 프로세스의 주소 공간에있는 사용자 스택이 포함됩니다. 스레드는 또한 클라이언트를 가장하는 데 사용할 수있는 자체 보안 컨텍스트를 가질 수 있습니다.
이 정보는 Microsoft 문서에서 찾을 수 있습니다. 프로세스 및 스레드 정보
Microsoft Windows는 선점 형 멀티 태스킹을 지원하므로 여러 프로세스에서 여러 스레드를 동시에 실행할 수 있습니다. 다중 프로세서 컴퓨터에서 시스템은 컴퓨터에 프로세서가있는 수만큼 스레드를 동시에 실행할 수 있습니다.
방법:
실:
먼저 이론적 인 측면을 살펴 보자. 프로세스와 스레드 간의 차이점과 프로세스간에 공유되는 것을 이해하려면 프로세스가 개념적으로 무엇인지 이해해야합니다.
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) 과 같은 여러 이름과 구현이 있습니다.
이제 소프트웨어 측면을 보자. 소프트웨어 측에서 스레드를 구현할 수있는 방법은 기본적으로 세 가지가 있습니다.
스레드를 구현하기 위해서는 CPU 상태를 저장하고 여러 스택을 유지 관리하는 기능 만 있으면됩니다. 많은 경우 사용자 공간에서 수행 할 수 있습니다. 사용자 공간 스레드의 장점은 커널에 갇히지 않아도되고 원하는 방식으로 스레드를 예약 할 수 있으므로 초고속 스레드 전환입니다. 가장 큰 단점은 I / O를 차단할 수 없다는 것 (전체 프로세스와 모든 사용자 스레드)을 차단할 수 없다는 것인데, 이는 처음에 스레드를 사용하는 큰 이유 중 하나입니다. 스레드를 사용하여 I / O를 차단하면 많은 경우 프로그램 설계가 크게 간소화됩니다.
커널 스레드는 모든 스케줄링 문제를 OS에 남기는 것 외에도 I / O 차단을 사용할 수 있다는 이점이 있습니다. 그러나 각 스레드 스위치는 잠재적으로 상대적으로 느린 커널에 트래핑해야합니다. 그러나 I / O 차단으로 인해 스레드를 전환하는 경우 I / O 작업이 이미 커널에 이미 갇혀 있기 때문에 실제로 문제가되지 않습니다.
다른 접근 방식은이 둘을 각각 여러 사용자 스레드를 갖는 여러 커널 스레드와 결합하는 것입니다.
따라서 용어에 대한 질문으로 돌아가서, 프로세스와 실행 스레드는 서로 다른 두 가지 개념이며 사용하려는 용어를 선택하는 것은 말하는 내용에 따라 다릅니다. "가벼운 프로세스"라는 용어와 관련하여, 나는 실제로 무슨 일이 일어나고 있는지와 "실행 스레드"라는 용어를 전달하지 않기 때문에 개인적으로 그 요점을 알지 못합니다.
동시 프로그래밍에 대한 자세한 설명
프로세스에는 자체 포함 된 실행 환경이 있습니다. 프로세스에는 일반적으로 완전한 비공개 기본 런타임 리소스 세트가 있습니다. 특히, 각 프로세스에는 자체 메모리 공간이 있습니다.
프로세스 내에 스레드가 존재합니다. 모든 프로세스에는 하나 이상의 프로세스가 있습니다. 스레드는 메모리 및 열린 파일을 포함하여 프로세스의 리소스를 공유합니다. 이것은 효율적이지만 문제가되는 의사 소통을 가능하게합니다.
평범한 사람을 염두에두고
컴퓨터에서 Microsoft Word 및 웹 브라우저를 엽니 다. 우리는이 두 프로세스를 호출 합니다 .
Microsoft 단어에서는 무언가를 입력하면 자동으로 저장됩니다. 이제 한 스레드에서 편집하고 다른 스레드에서 저장하는 편집 및 저장이 동시에 수행되는 것을 관찰했습니다.
응용 프로그램은 하나 이상의 프로세스로 구성됩니다. 가장 간단한 용어로 프로세스는 실행 프로그램입니다. 프로세스 컨텍스트에서 하나 이상의 스레드가 실행됩니다. 스레드는 운영 체제가 프로세서 시간을 할당하는 기본 단위입니다. 스레드는 현재 다른 스레드에서 실행중인 부분을 포함하여 프로세스 코드의 모든 부분을 실행할 수 있습니다. 파이버는 응용 프로그램에서 수동으로 예약해야하는 실행 단위입니다. 파이버는 스레드를 예약하는 스레드의 컨텍스트에서 실행됩니다.
여기 에서 도난당했습니다 .
방법:
예 :
모든 브라우저 (mozilla, Chrome, IE)를 엽니 다. 이 시점에서 새로운 프로세스가 실행되기 시작합니다.
스레드 :
예 :
브라우저에서 여러 탭을 엽니 다.
스레드와 프로세스는 OS 자원 할당의 원자 단위입니다 (즉, CPU 시간이 어떻게 나누어 지는지를 설명하는 동시성 모델과 다른 OS 자원을 소유하는 모델이 있습니다). 차이가 있습니다 :
위의 Greg Hewgill은 "process"라는 단어의 Erlang 의미에 대해 정확했으며 여기에 Erlang이 경량 프로세스를 수행 할 수있는 이유에 대한 설명이 있습니다.
프로세스와 스레드는 모두 독립적 인 실행 순서입니다. 일반적인 차이점은 동일한 프로세스의 스레드가 공유 메모리 공간에서 실행되고 프로세스는 별도의 메모리 공간에서 실행된다는 것입니다.
방법
실행중인 프로그램입니다. 여기에는 텍스트 섹션, 즉 프로그램 코드, 프로그램 카운터 값 및 프로세서 레지스터의 내용으로 표시되는 현재 활동이 있습니다. 또한 함수 매개 변수, 리턴 주소 지정 및 로컬 변수와 같은 임시 데이터를 포함하는 프로세스 스택과 전역 변수를 포함하는 데이터 섹션도 포함합니다. 프로세스는 프로세스 런타임 동안 동적으로 할당되는 메모리 인 힙을 포함 할 수도 있습니다.
실
스레드는 CPU 사용의 기본 단위입니다. 스레드 ID, 프로그램 카운터, 레지스터 세트 및 스택으로 구성됩니다. 동일한 프로세스에 속하는 다른 스레드와 코드 섹션, 데이터 섹션 및 열린 파일 및 신호와 같은 기타 운영 체제 리소스를 공유했습니다.
-Galvin에서 운영 체제에서 가져옴
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) 중 하나 인 경우 실행할 수 있습니다.이 경우에는 그냥 수행하고 종료됩니다.
"스레드"/ "프로세스"로는이를 수행 할 수 없습니다.
리누스
Linux Kernel의 OS View에서 응답하려고합니다.
프로그램은 메모리로 시작될 때 프로세스가됩니다. 프로세스는 .text
컴파일 된 코드 .bss
저장, 초기화되지 않은 정적 또는 전역 변수 저장 등의 세분화와 같이 메모리에 다양한 세그먼트가있는 고유 한 주소 공간을 갖습니다 .
각 프로세스에는 고유 한 프로그램 카운터와 사용자 공간 스택이 있습니다.
커널 내부에서 각 프로세스에는 자체 커널 스택 (보안 문제로 인해 사용자 공간 스택과 분리됨)과 task_struct
프로세스 제어 블록으로 추상화 된 구조 가 있으며, 우선 순위, 상태와 같은 프로세스 관련 정보를 모두 저장합니다. , (그리고 다른 많은 청크).
프로세스는 여러 실행 스레드를 가질 수 있습니다.
스레드에 도달하면 프로세스 내부에 상주하며 파일 시스템 리소스, 보류중인 신호 공유, 데이터 공유 (변수 및 명령어)와 같은 스레드 생성 중에 전달 될 수있는 다른 리소스와 함께 상위 프로세스의 주소 공간을 공유하므로 스레드가 가벼워지고 따라서 더 빠른 컨텍스트 전환이 가능합니다.
커널 내부에서 각 스레드에는 스레드 task_struct
를 정의하는 구조 와 함께 자체 커널 스택이 있습니다. 따라서 커널은 다른 프로세스와 동일한 프로세스의 스레드를보고 자체적으로 예약 할 수 있습니다. 동일한 프로세스의 스레드는 스레드 그룹 id ( tgid
) 라는 공통 ID를 공유하며 프로세스 ID ( pid
) 라는 고유 ID를 갖습니다 .
Java 세계와 관련된이 질문에 대답하려고합니다.
프로세스는 프로그램의 실행이지만 스레드는 프로세스 내의 단일 실행 시퀀스입니다. 프로세스는 여러 스레드를 포함 할 수 있습니다. 스레드를 경량 프로세스 라고도 합니다 .
예를 들면 다음과 같습니다.
예 1 : JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속하는 힙을 공유합니다. 그렇기 때문에 여러 스레드가 동일한 객체에 액세스 할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간이 있습니다. 이것은 하나의 스레드가 메소드를 호출하고 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 유지되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으며 스레드 안전을 위해 동기화되어야합니다.
예 2 : 프로그램이 키 입력을 읽음으로써 그림을 그릴 수 없습니다. 프로그램은 키보드 입력에 최대한주의를 기울여야하며 한 번에 둘 이상의 이벤트를 처리 할 수있는 기능이 없으면 문제가 발생할 수 있습니다. 이 문제에 대한 이상적인 솔루션은 프로그램의 둘 이상의 섹션을 동시에 원활하게 실행하는 것입니다. 쓰레드는 이것을 가능하게합니다. 여기서 그림 그리기는 프로세스이며 키 입력을 읽는 것은 하위 프로세스 (스레드)입니다.
프로세스는 응용 프로그램의 실행 인스턴스이고 스레드는 프로세스 내의 실행 경로입니다. 또한 프로세스에는 여러 스레드가 포함될 수 있으므로 스레드는 프로세스가 수행 할 수있는 모든 작업을 수행 할 수 있습니다. 그러나 프로세스는 여러 스레드로 구성 될 수 있으므로 스레드는 '가벼운'프로세스로 간주 될 수 있습니다. 따라서 스레드와 프로세스의 근본적인 차이점은 각 스레드가 수행하는 작업입니다. 스레드는 작은 작업에 사용되는 반면 프로세스는 더 많은 '무거운'작업 (기본적으로 응용 프로그램 실행)에 사용됩니다.
스레드와 프로세스의 또 다른 차이점은 동일한 프로세스 내의 스레드는 동일한 주소 공간을 공유하지만 다른 프로세스는 그렇지 않습니다. 이를 통해 스레드는 동일한 데이터 구조 및 변수를 읽고 쓸 수 있으며 스레드 간의 통신을 용이하게합니다. 프로세스 간 통신 (IPC 또는 프로세스 간 통신이라고도 함)은 매우 어렵고 리소스를 많이 사용합니다.
스레드와 프로세스의 차이점에 대한 요약은 다음과 같습니다.
스레드는 별도의 주소 공간이 필요하지 않기 때문에 프로세스보다 작성하기 쉽습니다.
스레드는 한 번에 하나의 스레드 만 수정해야하는 데이터 구조를 공유하므로 멀티 스레딩에는 신중한 프로그래밍이 필요합니다. 스레드와 달리 프로세스는 동일한 주소 공간을 공유하지 않습니다.
스레드는 프로세스보다 훨씬 적은 리소스를 사용하기 때문에 경량으로 간주됩니다.
프로세스는 서로 독립적입니다. 스레드는 동일한 주소 공간을 공유하므로 상호 의존적이므로 다른 스레드가 서로 밟지 않도록주의해야합니다.
이것은 위의 # 2를 나타내는 또 다른 방법입니다.
프로세스는 여러 스레드로 구성 될 수 있습니다.
다음은 The Code Project 의 기사 중 하나에서 얻은 것입니다 . 나는 그것이 필요한 모든 것을 명확하게 설명한다고 생각합니다.
스레드는 워크로드를 별도의 실행 스트림으로 분할하기위한 또 다른 메커니즘입니다. 스레드는 프로세스보다 가볍습니다. 즉, 전체 프로세스보다 유연성이 떨어지지 만 운영 체제 설정이 적기 때문에 더 빠르게 시작할 수 있습니다. 프로그램이 둘 이상의 스레드로 구성된 경우 모든 스레드는 단일 메모리 공간을 공유합니다. 프로세스에는 별도의 주소 공간이 제공됩니다. 모든 스레드는 단일 힙을 공유합니다. 그러나 각 스레드에는 자체 스택이 제공됩니다.
방법:
프로세스는 기본적으로 실행중인 프로그램입니다. 활동적인 엔터티입니다. 일부 운영 체제는 '작업'이라는 용어를 사용하여 실행중인 프로그램을 나타냅니다. 프로세스는 항상 주 메모리 또는 기본 액세스 메모리라고도하는 주 메모리에 저장됩니다. 따라서 프로세스를 활성 엔티티라고합니다. 컴퓨터가 재부팅되면 사라집니다. 여러 프로세스가 동일한 프로그램과 연관 될 수 있습니다. 다중 프로세서 시스템에서 여러 프로세스를 병렬로 실행할 수 있습니다. 단일 프로세서 시스템에서는 진정한 병렬 처리가 이루어지지는 않지만 프로세스 스케줄링 알고리즘이 적용되고 프로세서는 동시 처리의 착오를 일으키는 각 프로세스를 한 번에 하나씩 실행하도록 예약됩니다. 예 : '계산기'프로그램의 여러 인스턴스를 실행합니다. 각 인스턴스를 프로세스라고합니다.
실:
스레드는 프로세스의 하위 집합입니다. 실제 프로세스와 비슷하지만 프로세스 컨텍스트 내에서 실행되고 커널이 프로세스에 할당 한 동일한 리소스를 공유하므로 '경량 프로세스'라고합니다. 일반적으로 프로세스에는 한 번에 하나의 시스템 명령어 세트 만 실행되는 제어 스레드가 하나만 있습니다. 프로세스는 명령을 동시에 실행하는 여러 실행 스레드로 구성 될 수도 있습니다. 다중 제어 스레드는 다중 프로세서 시스템에서 가능한 진정한 병렬 처리를 이용할 수 있습니다. 단일 프로세서 시스템에서는 스레드 예약 알고리즘이 적용되고 프로세서는 각 스레드를 한 번에 하나씩 실행하도록 예약됩니다. 프로세스 내에서 실행되는 모든 스레드는 동일한 주소 공간, 파일 설명자, 스택 및 기타 프로세스 관련 속성을 공유합니다. 프로세스의 스레드가 동일한 메모리를 공유하므로
REF- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread
면접관의 관점에서 볼 때 프로세스와 같은 명백한 것에는 여러 스레드가있을 수있는 것 외에도 기본적으로 듣고 싶은 3 가지가 있습니다.
더 많은 것을 원한다면 Scott Langham의 답변은 거의 모든 것을 다룹니다. 이 모든 것은 운영 체제의 관점에서입니다. 다른 언어는 작업, 가벼운 스레드 등과 같은 다른 개념을 구현할 수 있지만 스레드를 사용하는 방법 일뿐입니다 (Windows의 광섬유). 하드웨어 및 소프트웨어 스레드가 없습니다. 하드웨어 및 소프트웨어 예외 및 인터럽트 또는 사용자 모드 및 커널 스레드가 있습니다.
시각화하여 학습에 더 익숙한 사람들을 위해 Process and Threads를 설명하기 위해 작성한 편리한 다이어그램이 있습니다.
MSDN의 정보를 사용했습니다- 프로세스 및 스레드 정보
임베디드 세계에서 온 프로세스 개념 은 MMU (메모리 관리 장치) 가있는 "큰"프로세서 ( 데스크탑 CPU, ARM Cortex A-9 ) 및 MMU 사용을 지원하는 운영 체제 ( 리눅스 와 같은 ). freeRTOS와 같은 소형 / 구형 프로세서 및 마이크로 컨트롤러 및 소형 RTOS 운영 체제 ( 실시간 운영 체제 )를 사용하면 MMU 지원이 없으므로 프로세스 만없고 스레드 만 있습니다.
스레드 는 서로의 메모리에 액세스 할 수 있으며 OS에 의해 인터리브 방식으로 예약되므로 병렬로 실행되는 것처럼 보입니다 (또는 멀티 코어에서는 실제로 병렬로 실행됩니다).
반면 프로세스 는 MMU가 제공하고 보호하는 가상 메모리의 개인 샌드 박스에 있습니다. 다음을 가능하게하기 때문에 편리합니다.
프로세스 : 실행중인 프로그램을 프로세스라고합니다.
Thread : Thread는 "one with other"개념을 기반으로 프로그램의 다른 부분에서 실행되는 기능이므로 스레드는 프로세스의 일부입니다.
나는 OS 과정을 수강하는 학부생으로서 현재 두 가지 개념을 완전히 이해할 수 없기 때문에 거의 모든 대답을 읽었습니다. 나는 대부분의 사람들이 일부 OS 책에서 차이점을 읽습니다. 즉 스레드가 프로세스의 주소 공간을 사용하기 때문에 트랜잭션 단위의 전역 변수에 액세스 할 수 있습니다. 그러나 새로운 질문은 왜 프로세스가 존재하는지에 대해 제기됩니다. 이전 답변 중 하나 에서 발췌 한 이미지를 사용하여 다음 예를 살펴 보겠습니다 .
우리는 단어 문서에서 한 번에 3 개의 스레드가 작동합니다 (예 : Libre Office) . 첫 번째 단어는 철자가 틀린 단어인지 밑줄로 맞춤법을 검사합니다. 두 번째는 키보드에서 문자를 가져 와서 인쇄합니다. 마지막으로 문제가 발생했을 때 작업 한 문서를 잃지 않도록 짧은 시간마다 문서를 저장합니다. 이 경우, 3 개의 스레드는 프로세스의 주소 공간 인 공통 메모리를 공유하므로 모두 편집중인 문서에 액세스 할 수 있으므로 3 개의 프로세스가 될 수 없습니다. 따라서 도로는 두 개의 불도저와 함께 단어 문서이며 이미지 중 하나는 부족하지만 스레드입니다.
멀티 스레딩을 통합 한 Python (통역 언어)으로 알고리즘을 구축하는 동안 이전에 구축 한 순차적 알고리즘과 비교할 때 실행 시간이 더 나쁘지 않다는 사실에 놀랐습니다. 이 결과에 대한 이유를 이해하기 위해 나는 약간의 독서를했으며, 내가 배운 것은 멀티 스레딩과 멀티 프로세스의 차이점을 더 잘 이해하는 흥미로운 컨텍스트를 제공한다고 생각합니다.
멀티 코어 시스템은 여러 스레드 실행을 수행 할 수 있으므로 파이썬은 멀티 스레딩을 지원해야합니다. 그러나 파이썬은 컴파일 된 언어가 아니라 해석 된 언어 1 입니다. 즉, 프로그램을 실행하려면 프로그램을 해석해야하며 인터프리터는 프로그램이 실행을 시작하기 전에 프로그램을 인식하지 못합니다. 그러나 파이썬의 규칙은 알고 있으며 그 규칙을 동적으로 적용합니다. 파이썬에서 최적화는 실행되는 코드가 아니라 주로 인터프리터 자체의 최적화 여야합니다. 이것은 C ++과 같은 컴파일 된 언어와 대조적이며 파이썬에서 멀티 스레딩에 영향을 미칩니다. 특히 파이썬은 Global Interpreter Lock을 사용하여 멀티 스레딩을 관리합니다.
반면에 컴파일 된 언어는 컴파일됩니다. 이 프로그램은 "완전히"처리되며, 먼저 구문 정의에 따라 해석 된 다음 언어에 구애받지 않는 중간 표현에 매핑되고 마지막으로 실행 코드에 연결됩니다. 이 프로세스를 통해 코드는 컴파일 시점에 모두 사용할 수 있으므로 코드를 매우 최적화 할 수 있습니다. 다양한 프로그램 상호 작용 및 관계는 실행 파일을 만들 때 정의되며 최적화에 대한 강력한 결정을 내릴 수 있습니다.
현대 환경에서 파이썬의 인터프리터는 멀티 스레딩을 허용해야하며 안전하고 효율적이어야합니다. 해석 된 언어와 컴파일 된 언어의 차이가 그림에 들어갑니다. 인터프리터는 다른 스레드에서 내부적으로 공유 된 데이터를 방해해서는 안되며 동시에 계산에 프로세서 사용을 최적화합니다.
이전 게시물에서 언급했듯이 프로세스와 스레드는 독립적 인 순차적 실행으로, 프로세스의 여러 스레드에서 메모리가 공유되고 프로세스는 메모리 공간을 분리한다는 점에서 차이가 있습니다.
파이썬에서 데이터는 Global Interpreter Lock에 의해 다른 스레드에 의한 동시 액세스로부터 보호됩니다. 모든 Python 프로그램에서 언제든지 하나의 스레드 만 실행할 수 있어야합니다. 반면에 각 프로세스의 메모리가 다른 프로세스와 분리되어 프로세스가 여러 코어에서 실행될 수 있으므로 여러 프로세스를 실행할 수 있습니다.
1 Donald Knuth는 컴퓨터 프로그래밍 기술 : 기본 알고리즘의 해석 루틴에 대해 잘 설명하고 있습니다.
내가 지금까지 찾은 가장 좋은 대답은 Michael Kerrisk의 'The Linux Programming Interface'입니다 .
최신 UNIX 구현에서 각 프로세스는 여러 실행 스레드를 가질 수 있습니다. 스레드를 시각화하는 한 가지 방법은 동일한 다른 가상 메모리와 다양한 다른 속성을 공유하는 일련의 프로세스입니다. 각 스레드는 동일한 프로그램 코드를 실행하고 동일한 데이터 영역과 힙을 공유합니다. 그러나 각 스레드에는 로컬 변수와 함수 호출 연결 정보가 포함 된 자체 스택이 있습니다. [LPI 2.12]
이 책은 분명한 출처입니다. Julia Evans는 이 기사 에서 Linux 그룹이 실제로 어떻게 작동하는지 정리하는 데 도움을 주었습니다 .
예 1 : JVM은 단일 프로세스에서 실행되고 JVM의 스레드는 해당 프로세스에 속하는 힙을 공유합니다. 그렇기 때문에 여러 스레드가 동일한 객체에 액세스 할 수 있습니다. 스레드는 힙을 공유하고 자체 스택 공간이 있습니다. 이것은 하나의 스레드가 메소드를 호출하고 로컬 변수가 다른 스레드로부터 스레드로부터 안전하게 유지되는 방법입니다. 그러나 힙은 스레드로부터 안전하지 않으며 스레드 안전을 위해 동기화되어야합니다.
그것들은 거의 같습니다 ... 그러나 중요한 차이점은 스레드가 가벼우 며 컨텍스트 전환, 작업 부하 등의 측면에서 프로세스가 무겁다는 것입니다.