Process(프로세스)
- 현재 실행중인 프로그램
- 프로세스는 최소한 1개 이상의 Thread(스레드)로 구성된다.
- 애플리케이션을 실행할 때, 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는 것
- 프로그램을 실행시키기 위해서는 OS로부터 자원(resource)를 할당 받아야 한다.
- 리소스(Code, Data, Stack, Heap) + Thread(여러 개) // Thread는 각각 Exception Stack을 별도로 가지고 있는 실행 흐름
프로세스 구성 요소 4가지
1. 코드(Code) 영역 : 프로그램의 코드
2. 데이터(Data) 영역 : 전역 변수 or 정적 변수의 할당 공간
3. 힙(Heap) 영역 : 메모리 동적 할당 공간
4. 스택(Stack) 영역 : 지역 변수 할당
Thread(스레드)
- 프로그램 내에서 실행되는 프로그램 제어 흐름(실행 단위)을 말한다.
- 스레드는 프로그램 코드를 한 줄씩 실행해준다.
- 스레드마다 독립적인 Stack을 따로 갖는다.
- Single Thread Process(싱글 스레드) : 스레드 1개
- Multi Thread Process(멀티 스레드) : 스레드 2개 이상
- Main Thread(메인 스레드)
싱글 스레드 vs 멀티 스레드
- 멀티 스레드는 싱글 스레드보다 효율적이다.
- 스레드의 개수는 제한이 없다.
- 스레드가 많을수록 좋은 것은 아니다.
-> 각각 스레드마다 스택이 할당되어야 하기 때문에
-> 스택 영역이 메소드를 호출할 때마다 모든 스레드에도 resource를 주어야 한다.
-> 자원이 부족하기 때문에 효율성 문제가 발생한다.
CPU Core(CPU 코어)
- 코어 : CPU 안에서 물리적인 연산(데이터 처리)를 담당하는 곳
- 코어는 한 가지 일만 한다.
- 과거의 코어 개수 1개 -> 최근 코어 개수 2개 이상
멀티 스레딩(Multi Threading)
- 장점 : 효율적인 처리 , 응답 속도 빠름
- 단점 : 어려운 프로그램, 공유 작업을 위한 동기화 필요 -> 교착상태(DeadLock)
- 동시성(Concurrency), 병렬성(Parallelism)
- 코어보다 스레드 개수가 더 많을 경우, 우선순위 방식의 영향이 크지 않다.
동시성
- 단일 코어 내 멀티 스레드가 교차하면서 여러 Task를 수행함으로써, 동시에 실행되는 것 처럼 보인다.
- 많은 클라이언트의 요청을 처리할 수 있다.
병렬성
- 멀티코어 + 멀티 스레드
- 같은 시간의 2개 이상의 일을 여러 프로세스가 동시에 수행하는 것
- 병렬적 수행을 빠르게 끝낼 수 있다.
동시성(Concurrency) | 병렬성(Parallelism) |
Single Core + 멀티 스레드 + Time-Slicing(시분할) | Multi Core + 멀티 스레드 |
동시에 실행되는 것 처럼 보인다. | 실제로 동시에 처리된다. |
Context-Switching | |
스레드 스케줄링 사용 |
- 스레드 스케줄링 : 스레드를 어떤 순서에 의해 동시성으로 실행할 것인지 결정하는 것
- 스레드 스케줄링에 의해, 스레드는 번갈아가면서 run() 메소드 실행
- Java에서 우선순위(Priority), 순환 할당(Round-Robin) 스케줄링 사용
- Priority Scheduling : 우선순위가 높은 스레드 부터, 개발자가 코드로 제어 가능 // setPriority() 메소드로 우선순위 변경 가능
- Round-Robin Scheduling : Time Slice(시간 할당량)을 정해진 시간만큼 실행, JVM에 의해 제어
멀티 태스킹(Multi Tasking)
- 2가지 이상의 작업을 동시에 처리하는 것
- 멀티 태스킹 != 멀티 프로세스
- 하나의 프로세스도 멀티 태스킹이 가능하다 -> 멀티 스레드 이용
프로세스와 스레드의 개념
- 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향 X
- 멀티 스레드에서 하나의 스레드에 오류가 발생하면 -> 프로세스가 종료될 수 있어 다른 스레드에 영향을 끼칠 수 있다.
- 스레드는 메소드를 실행하면서 JVM에 의해 생성된다.
- 자바에서 작업 스레드는 객체로 생성되기 때문에, Class가 필요하다.
- Thread class : main() 이외의 메소드. 메소드를 이용하여 Thread의 흐름을 제어하기 위한 클래스
- main() 메소드를 수행하기 위한 목적으로 제공되고, main Thread(또는 Daemon Thread)라고 불린다.
메인 스레드(Main Thread)
- main() 메소드를 실행하면서 시작된다.
- 작업 스레드들을 만들어서 병렬로 코드 실행 가능-> 멀티 스레드 생성 -> 멀티 태스킹 수행
Daemon Thread(데몬 스레드)
- 다른 일반 스레드의 보조적인 작업을 위해 사용
- 데몬 스레드는 (데몬)스레드를 파생시킨 일반 Thread가 모두 종료되면 같이 종료된다.
- 사용 예시 : 가비지 컬렉터(GC), 자동 저장 기능..
- Thread.setDeamon(true) // 데몬 스레드 지정
- start() 호출 후에, setDeamon(true)를 호출하면 -> IllegalThreadStateException 발생
멀티 코어 프로세스 문제점
- 항상 메모리에 접근해서 값을 가져오는 것 보다, Core마다 독립적인 캐시 공간에 값을 저장해 두고 사용해서 접근 속도 최적화
- 하지만, 메모리 공간에 있는 값(실제 값)이 바뀌어도 캐시를 통해서 변경 전 값들을 가져오는 문제가 발생할 수 있다.
- volatile 키워드 사용 : 캐시에 저장된 값 X -> main memory 값 사용
스레드 그룹(Thread Group)
- JVM 실행 시, system 스레드 그룹을 만들고 JVM 운영에 필요한 스레드들을 생성해서 system 스레드 그룹에 포함시킨다.
- 기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 된다.
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 스레드 풀(ThreadPool) (0) | 2022.07.17 |
---|---|
[Java] 스레드의 동기화 synchronized (0) | 2022.07.17 |
[JAVA] 스택 프레임(Stack Frame) (0) | 2022.06.28 |
[자바의 정석] 연습문제 2. 연산자 (0) | 2022.06.23 |
[자바의 정석] 연습문제 1.변수와 타입 (0) | 2022.06.23 |