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 스레드 그룹에 포함시킨다.

- 기본적으로 자신을 생성한 스레드와 같은 스레드 그룹에 속하게 된다.

+ Recent posts