프로세스와 쓰레드
프로세스
- 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받는다
- 최소 1개의 스레드(메인 스레드)를 가지고 있다.
쓰레드
- 프로그램(프로세스) 내에서 실행되는 흐름의 단위
- 운영체제에 의해 관리되는 하나의 작업 혹은 테스크
- JVM에 의해 하나의 프로세스가 발생하고 main()안의 실행문들이 하나의 쓰레드
- thread 만들기 → thread상속 or Runnable 인터페이스 구현
- 다중쓰레드 작업 시 각 쓰레드 끼리 정보를 주고 받을 수 있어 과정의 오류 줄어든다
- 프로세스는 완벽히 독립적 - 메모리영역(code, data, heap, stack)을 다른 프로세스와 공유를 하지 않지만 쓰레드는 해당 쓰레드를 위한 스택을 생성할 뿐 이외의 영역을 공유
스택을 독립적으로 할당하는 이유
- 호출시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간
코드 영역을 공유
데이터 영역과 힙 영역을 공유
- 전역 변수와 동적 할당된 메모리 공간을 공유할 수 있고, 쓰레드 간 통신을 할 수 있지만 동시에 메모리에 접근하기 때문에 주의 해야한다.
멀티 프로세스, 멀티 테스킹
멀티 프로세싱
- 멀티 프로세싱: 다수의 프로세서가 다수의 프로세스를 동시에 처리하는 것
- 멀티 프로그래밍: 다수의 프로세스를 메모리에 적재하여 프로세스를 번갈아가면서 처리하는 것
- 멀티 태스킹: 다수의 작업을 운영체제 스케줄링에 의해 번갈아가면서 처리하는 것
프로세서는 cpu, 프로세스는 하나의 작업
각 프로세서는 다수의 프로세스를 처리하며, 각 프로세스는 다수의 프로세서에 의해 처리된다.
각 프로세서가 자원을 공유하면서 프로세스를 처리하기 때문에 하나의 프로세서가 고장 나더라도 작업은 정지되지 않는다.
멀티 태스킹
task가 하나의 프로세서 상에서 운영체제의 스케줄링 방식에 따라 조금씩 번갈아가면서 수행되는 것이 멀티태스킹 - '동시에 처리되는 것처럼' 보인다.
스레드 풀
쓰레드가 생성 될 때 컴퓨터 내부적으로 운영체제가 요청을 받아들여서 메모리 공간을 확보해
그 메모리를 쓰레드에게 할당해준다.
하지만 쓰레드는 동일한 메모리영역에서 관리되지만 생성/수거에 드는 비용이 많이든다.
---> 쓰레드를 미리 만들어 놓음
스레드 풀은 작업 처리에 사용되는 스레드를 제한된 개수만큼 정해 놓고 작업 큐에 들어오는 작업들을 하나씩 스레드가 맡아 처리한다. 작업 처리가 끝난 스레드는 다시 작업 큐에서 새로운 작업을 가져와 처리한다. 그렇기 때문에 작업 처리 요청이 폭증되어도 스레드의 전체 개수가 늘어나지 않으므로 애플리케이션의 성능이 급격히 저하되지 않는다.
ExecutorService 구현 객체는 Executors 클래스의 다음 메소드를 사용해서 생성할 수 있다.
- 초기 스레드 수는 ExecutorService 객체가 생성될 때 기본적으로 생성되는 스레드 수
- 코어 스레드 수는 스레드 수가 증가된 후 사용하지 않는 스레드를 스레드 풀에서 제거할 때 최소한 유지해야 할 스레드 수
1. newCachedTheadPool()
- 초기 스레드 수: 0
- 코어 스레드 수: 0
- 최대 스레드 수: Integer.MAX_VALUE
- newCachedTheadPool()로 생성된 스레드 풀의 특징은 초기 스레드 개수와 코어 스레드 개수는 0개이고,
스레드 개수보다 작업 개수가 많으면 새 스레드를 생성시켜 작업을 처리한다.
1개 이상의 스레드가 추가되었을 경우 60초 동안 추가된 스레드가 아무 작업을 하지 않으면 추가된 스레드를 종료하고 풀에서 제거한다.
2. newFixedThreadPool(int nThreads)
- 초기 스레드 수: 0
- 코어 스레드 수: nThreads
- 최대 스레드 수: nThreads
초기 스레드 개수는 0개, 코어 스레드 수는 nThreads
스레드 개수보다 작업 개수가 많으면 새 스레드를 생성시키고 작업처리를 한다.
작업을 처리하지 않고 놀고 있더라도 스레드 개수가 줄지 않는다.
스레드 풀 종료
- main 스레드가 종료되어도 작업을 처리하기 위해 계속 실행 상태로 남아있음
- 스레드 풀을 강제로 종료시켜 스레드 해체시켜야한다.
1. excutorService.shutdown();
2. excutorService.shoutdownNow();
3. excutorService.awaitTermination(long timeout, TimeUnit unit);
'언어 > 자바' 카테고리의 다른 글
자바 - 제네릭(Generic) (0) | 2021.09.13 |
---|---|
직렬화 (Serialization) 와 역직렬화(Deserialization) (0) | 2021.09.13 |
자바 컬렉션(List, Map, Set) (0) | 2021.09.10 |
동시성(Concurrency)과 병렬성(Parallelism) (0) | 2021.09.08 |
java의 스트림이란?? (0) | 2021.09.06 |