- 사전적 의미: "어떤 작업을 위해 실행할 수 있는 파일"
- 사전적 의미: "컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램"
- 메모리 상에 로드되어 실행되고 있는 프로그램의 인스턴스(독립적인 개체)
- 운영체제로부터 시스템 자원을 할당받는 작업의 단위
- CPU 시간
- 운영되기 위해 필요한 메모리 주소 공간
- Code, Data, Stack, Heap이라고 하는 구조로 되어 있는 독립된 메모리 영역
- 실행중인 프로그램이라고 간단하게 생각하면 됩니다.
- 기본적으로 프로세스 당 1개의 스레드가 존재하며, 이를 메인 스레드라고 한다.
- 각 프로세스는 별도의 메모리 공간에서 실행되며, 한 프로세스는 다른 프로세스의 메모리 공간을 직접적으로 참조할 수 없기 때문에, 통신(IPC, inter-process communication)이나 I/O를 이용해서 간접적으로 이용해야 한다.
- 한 프로세스가 다른 프로세스의 자원을 접근하는 통신방식은 여러가지가 있다.
- 파이프, 파일, 소켓 등
- 사전적 의미: "프로세스 내에서 실행되는 여러 흐름의 단위"
- 프로세스에서 실행 제어 부분만을 분리한 것
- 스레드는 프로세스 내에서,
Stack
영역만 따로 할당 받고, 같은 프로세스의 스레드는 Code, Data, Heap 영역을 공유한다. - 각각의 스레드는 별도의 레지스터와 스택을 갖고있다.
- 한 스레드가 프로세스 자원을 변경하면, 다른 이웃 스레드(sibling thread)도 그 변경 결과를 즉시 볼 수 있다.
- 같은 프로세스 안에 있는 여러 스레드들은 같은 힙 공간을 공유한다. 반면 프로세스는 다른 프로세스의 메모리 공간에 직접 접근할 수 없다.
일반 스레드와 거의 차이가 없으며 네이티브 스레드로 동작합니다.
JVM 자체가 프로세스이고, 이곳에서 스레드를 관리(스레드 스케줄링, 스레드 관련 정보)합니다.
- 스레드가 몇 개 존재하는가?
- 스레드로 실행되는 프로그램 코드의 메모리 위치는 어디인가?
- 스레드의 상태는 무엇인가?
- 스레드의 우선순위는 얼마인가?
개발자는 자바 스레드로 동작할 스레드 코드만 작성하면, 스레드의 라이프 사이클은 JVM에 맡기고 실행만 요청하면 됩니다.
하나의 응용 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업(태스크)을 처리하도록 하는 것
장점: 한 프로세스가 비정상 종료되더라도, 다른 프로세스에 영향을 미치지 않는다.
단점:
- Context Switching에서의 오버헤드
- 캐시 초기화 등의 무거운 작업들이 진행되고, 이로 인해 많은 시간이 소요되므로 오버헤드가 발생하게 된다.
- 프로세스는 각각 독립된 메모리에서 동작하기 때문에 공유하는 메모리가 없어서 Context Switching이 발생하면, 캐시에 있는 모든 데이터를 전부 지우고 다시 캐시 정보를 불러와야만 한다.
- 프로세스 사이의 어렵고 복잡한 통신 기법(IPC)
하나의 응용 프로그램을 여러 개의 스레드로 구성하고, 각 스레드는 각각의 작업을 처리하도록 하는 것
장점:
- 시스템 자원 소모 감소(자원의 효율성 증대)
- 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있다.
- 또한, 메모리를 대부분 공유하기 때문에 그만큼의 공간이 절약된다.
- 시스템 처리량 증가(처리 비용 감소)
- 스레드간 데이터를 주고받는 것은 공유하는 영역을 통해서 하면 되기 때문에, 데이터를 주고받는 것이 간단해지고, 시스템 자원을 그만큼 더 사용할 수 있게된다.
- 스레드 간의 Context Switching을 할 때에는 무거운 작업이 덜하기 때문에 자연스럽게 오버헤드가 줄어들어 응답 속도가 빨라지게 되므로 단위 시간당 처리량이 늘어나게 된다.
- 간단한 통신 방법으로 인한 프로그램 응답 시간 단축
- 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
단점:
- 주의 깊은 설계가 필요하다.
- 디버깅이 까다롭다.(자바에서 멀티 스레딩 관련 코드를 디버깅하면 쉽게 알 수 있다. 디버깅 포인트가 완전히 달라지고, 내가 디버거로 해당 코드를 지연시켜서 동작이 달라질 수도 있다.)
- 단일 프로세스 시스템의 경우 효과를 기대하기 어렵다.
- 다른 프로세스에서 스레드를 제어할 수 없다.
- 멀티 스레드의 경우 자원 공유의 문제가 발생한다.(동기화 문제)
- 하나의 스레드에 문제가 발생하면 다른 스레드까지 영향을 미치게 된다.
- 설계의 어려움과, 디버깅의 불편함과는 별개로 오버헤드가 많이 줄어들고, 자원 공유가 되기 때문입니다.
- 프로그램을 여러 개 실행시켜서 작업을 진행하는 것과, 하나의 프로그램 안에서 해결한다는 차이로도 볼 수 있습니다.
- 자원의 효율성 증대 측면
- 프로세스 생성 후 자원을 할당하는 과정의 시스템 콜이 줄어듭니다. 이를 통해서 자원이 효율적으로 관리될 수 있습니다.
- Context Switching 때, Register 교체 뿐만아니라 RAM와 CPU 사이에 위치한 캐시 메모리 까지 초기화 시켜주어야 하기 때문입니다.
- 스레드는 같은 프로세스에서는 메모리를 공유하기 때문에 프로세스간의 통신처럼 복잡한 과정이 필요 없고, 데이터를 주고 받는 방식이 간단하고, 시스템의 자원 또한 아낄 수 있습니다.
- 프로세스 생성 후 자원을 할당하는 과정의 시스템 콜이 줄어듭니다. 이를 통해서 자원이 효율적으로 관리될 수 있습니다.
- 처리 비용 감소 및 응답 시간 단축 측면
- 프로세스 간 통신(IPC)보다 스레드 간의 통신 비용이 당연히 적기 때문에 결국 응답 시간이 줄어듭니다.
- 프로세스 간 Context Switching보다 스레드 간 Context Switching 비용
[OS] 프로세스와 스레드의 차이 - Heee's Development Blog
[How Java thread maps to OS thread?](