❑ 프로세스(Process)와 쓰레드(Thread)
프로세스와 쓰레드의 개념 및 관계
- 프로세스는 간단히 말해 '실행 중인 프로그램(Program)'이다
- 쓰레드는 프로세스를 구성하는 한 가지이자, 작업을 처리하는 일꾼이다.
- 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원 그리고 쓰레드로 구성되어 있다.
- 쓰레드를 프로세스라는 공장에서 작업을 처리하는 일꾼으로 생각하면 이해하기 쉽다.
- 스레드를 경량화된 프로세스라고도 한다
- 컴퓨터는 프로세스마다 자원을 분할해서 할당한다. 한 프로세스의 스레드들은 같은 공간(분할된 자원)에서 진행된다.
- 각 스레드는 Stack 영역만 독립적으로 갖고 그 외 부모 프로세스의 자원을 공유한다. 그렇기 때문에 Context Switching처럼 하나의 프로세스를 다 내렸다가, 다시 올리는 작업을 할 필요가 없다. 이를 캐싱 적중률이 높아진다고 표현한다.
- 멀티 태스킹(Multi-Tasking = Multi-Process)
윈도우, 유닉스 등 대부분의 OS는 멀티태스킹을 지원하기 때문에 여러 개의 프로세스가 동시에 실행될 수 있다.
→ 포스팅 하단의 [참고 2] 멀티태스킹의 동시성과 병렬성 확인 - 멀티 쓰레딩(Multi-Threading)
- 따라서 모든 프로세스에는 최소 한 개 이상의 쓰레드가 존재하며, 둘 이상의 쓰레드를 가진 프로세스를 멀티 쓰레드 프로세스라고 한다.
- 멀티 쓰레딩은 하나의 프로세스 내에서 여러 쓰레드가 동시에 작업을 수행한다. 예를 들어, 하나의 크롬 프로세스 안에서 유튜브와 네이버 검색 등 다중 작업을 동시에 처리함으로써 가능한 것이다. 여러 사용자에게 서비스를 해주는 서버는 멀티 쓰레드가 필수적이다.
- 단, 그림1에서와 같이 여러 개의 쓰레드가 Data, Heap 등 자원을 공유하며 작업하기 때문에 동기화(synchronization), 교착상태(deadlock)와 같은 문제들을 반드시 고려하며 사용해야 한다.
- 하나의 프로세스가 가질 수 있는 쓰레드의 개수는 제한되어 있지 않다. 하지만 쓰레드가 작업을 수행하는데 개별적인 메모리 공간(호출스택)이 필요해 프로세스의 메모리 한계에 따라 생성할 수 있는 쓰레드 수가 정해진다.
- 참고로, CPU 코어는 한 번에 단 하나의 작업만 수행할 수 있어 실제 동시 처리되는 작업은 코어의 개수와 같다. 하지만 쓰레드의 수는 언제나 코어의 개수보다 훨씬 많은데, 각 코어가 짧은 시간동안 여러 작업을 번갈아 수행함으로써 동시에 수행되는 것처럼 보이게 하는 것이다.
- 프로세스의 성능이 단순히 쓰레드의 개수에 비례하는 것은 아니다. 싱글 쓰레드가 멀티 쓰레드보다 나은 성능을 보일때도 있다.
[참고 1] 프로그램과 프로세스(Program and Process)
- 프로그램과 프로세스의 관계
- 프로그램: 코드로 작성되어 빌드된 파일
- 프로세스: 프로그램을 실행시켜 메모리에서 작동되는 것. 즉, '실행 중인 프로그램'
- 프로그램이 프로세스가 되면서 일어나는 일
- Code, Data, Heap, Stack이 메모리 영역에 올라간다
*Code: 실행 명령을 포함하는 코드들
*Data: Static 변수 혹은 Global 변수
*Heap: 동적 메모리 영역
*Stack: 지역변수, 매개변수, 반환 값 등 일시적인 데이터 - PCB(Process Control Block) 블럭 생성
*PCB: 프로세스에 대한 정보를 담고 있는 블럭
- Code, Data, Heap, Stack이 메모리 영역에 올라간다
[참고 2] 멀티 태스킹의 동시성과 병렬성
한 프로세스가 실행되기 위해선 프로세서(CPU core)를 점유하고 있어야 한다. 그리고 프로세서가 점유된 상태에선 다른 프로세스는 실행될 수 없다. 즉, 동시에 여러 개의 프로세스가 실행될 수 없다. 하지만 우리는 카카오톡, 크롬, 엑셀 등 다양한 프로세스를 함께 사용하고 있는데, 프로세서가 동시성과 병렬성의 특징으로 여러 개의 프로세스를 빠르게 처리하고 있기 때문이다.
1) 동시성(Concurrency)
- 하나의 코어에서 하나 이상의 프로세스(혹은 쓰레드)를 번갈아가면서 진행하지만 동시에 진행되는 것처럼 보이는 것.
- 일을 바꾸는 것을 Context Swithching이라 하며, 다양한 방식과 알고리즘이 사용됨. 이 과정이 매우 빠르게 일어나서 동시에 진행되는 것처럼 느껴지는 것이다.
2) 병렬성(Parallelism)
- 프로세서 하나에 코어 여러개가 달려서 각 코어가 동시에 여러 개의 작업(프로세스)을 하는 것.
- 듀얼코어, 쿼드코어 등 멀티코어 프로세서의 CPU가 처리할 수 있는 방식
❑ Reference
- Java의 정석 | 남궁성 | 도우출판
'Back-End > Java' 카테고리의 다른 글
[Java] lombok의 @Builder 사용시 필수 필드를 입력하게 하는 방법 (0) | 2023.03.14 |
---|---|
[Java] Java Array와 Hash의 데이터 접근/삽입 속도 비교 (0) | 2022.03.06 |
[Java] JUnit5 기본 Annotation (0) | 2022.03.03 |
[Java] Java에서 외부 jar 실행 후 출력되는 결과 가져오기 (0) | 2022.02.15 |
[Java] 외부 jar 실행 후 pid(process id) 가져오기(Java 8) (0) | 2022.02.11 |