프로세스와 쓰레드의 차이는?
프로세스(Process)
프로세스는 실행 중인 프로그램을 말하며, 디스크로부터 메모리에 적재되어 CPU의 할당을 받을 수 있는 것을 말합니다. 이러한 프로세스에 대한 정보는 프로세스 제어블록(PCB, Process Control Block)이라는 자료구조를 통해 관리가 되며 이를 통해 CPU가 각각의 프로세스를 교체해가면서 일할 때 어디에서 시작해야할지 알 수 있는 것입니다. PCB에 저장되는 정보는 다음과 같습니다.
- 프로세스 식별자(Process ID, PID) : 프로세스 식별번호
- 프로세스 상태 : new, ready, running, waiting, terminated 등의 상태를 저장
- 프로그램 카운터 : 프로세스가 다음에 실행할 명령어의 주소
- CPU 레지스터
- CPU 스케쥴링 정보 : 프로세스의 우선순위, 스케줄 큐에 대한 포인터 등
- 메모리 관리 정보 : 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함
- 입출력 상태 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록
- 어카운팅 정보 : 사용된 CPU 시간, 시간제한, 계정번호 등
프로그램과 프로세스의 차이는?
프로그램은 보조 기억장치에 존재하는 명령어(코드)와 정적인 데이터의 묶음인 반면, 프로세스는 이러한 명령어(코드)와 정적인 데이터의 묶음이 메모리에 적재되면서 실체를 가지게 되는 것입니다. 즉 프로세스는 프로그램의 인스턴스라고 생각할 수 있겠습니다.
쓰레드(Thread)
쓰레드는 프로세스의 실행단위입니다. 하나의 프로세스는 적어도 1개이상의 쓰레드를 가지고 있으며, 쓰레드 간에는 프로세스 내 주소 공간이나 자원을 공유할 수 있습니다. 각각의 쓰레드는 쓰레드ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성됩니다. 멀티 쓰레딩는 다수의 실행단위로 나누어 자원 생성 및 중복을 최소화하고 이를 통해 수행능력을 최대화하는 것을 말합니다.
쓰레드가 스택을 가지고 있는 이유는 각 쓰레드는 독립적인 실행단위이기 때문입니다. 물론 쓰레드간 자원을 공유하기도 하지만 다른 실행흐름이고 이를 통해 함수를 호출하게 됩니다. 또 프로그램 카운터가 각 쓰레드마다 가지고 있는 이유는 각 쓰레드의 명령어가 어디까지 수행하였는지 체크하기 위함입니다. 쓰레드 역시 하나의 쓰레드가 실행되는 것이 아니라 스케줄링에 따라 CPU 할당이 될 때 처리되기 때문입니다.
*레지스터(register) : 특정한 목적에 사용되는 일시적인 기억장치
자바 쓰레드(Java Thread)
자바는 JVM이 하나의 프로세스가 되어 JVM에 의해 쓰레드를 스케줄링 합니다. 그래서 쓰레드의 다음과 같은 부분은 JVM에서 관리합니다. 개발자는 쓰레드 코드를 작성하고 생명력 가질 수 있도록 JVM에 요청을 하면 JVM에서 알아서 관리해주는 것입니다.
- 쓰레드가 몇 개 존재하는지
- 쓰레드로 실행되고 있는 프로그램 코드의 메모리 위치는 어디인지
- 쓰레드의 상태는 무엇인지
- 쓰레드 우선순위는 얼마인지
'CS' 카테고리의 다른 글
웹을 지탱하는 기술3 - HTTP (0) | 2019.03.07 |
---|---|
프로세서와 코어의 차이점 (2) | 2019.02.08 |
Sync Async Block Non-Block (0) | 2019.01.31 |
TCP/IP (0) | 2019.01.30 |