Language/Java
[Java] 멀티 스레드
깐니
2023. 1. 29. 21:40
프로세스와 스레드
프로세스
- 실행 중인 프로그램으로, OS로부터 시스템 자원을 할당받는 작업 단위.
- 프로세스가 할당받는 시스템 자원
ex.) CPU 시간, 주소공간, Stack, Code, Data, Heap 등의 독립된 메모리 영역 - 프로세스 당 최소 1개의 스레드 (메인 스레드)를 가지고 있음.
- 각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
만약, 다른 프로세스의 자원에 접근하려면 프로세스 간 통신 (IPC / 파이프, 파일, 소켓 등..)을 사용해야 한다.
스레드
- 프로세스 내 실제 작업을 수행하는 단위로, 프로세스가 할당받은 자원을 이용하는 실행의 단위.
- 스레드는 프로세스 내 주소공간, 힙 공간의 자원들을 같은 프로세스 내 스레드끼리 공유하면서 실행됨.
- 각각의 스레드는 별도의 레지스터와 스택을 갖고 있지만, 힙 메모리는 서로 읽고 쓸 수 있다.
- 한 스레드가 프로세스 자원을 변경하면, 다른 스레드도 그 변경 결과를 볼 수 있다.
- 병렬성과 동시성을 갖는다.
- 병렬성: 다수의 코어가 각각 할당된 스레드를 동시에 실행
- 동시성: 하나의 코어가 여러 개의 스레드를 동시에 실행
자바 스레드
- JVM 가 운영체제의 역할을 함. 따라서 자바에서 스레드 스케줄링은 JVM에 의해 이루어진다.
- 자바에는 프로세스가 존재하지 않고 스레드만 존재한다. 자바 스레드는 JVM에 의해 스케줄되는 실행 단위 코드 블록이다.
- JVM이 관리하는 스레드 정보
- 스레드 갯수, 상태, 우선순위
- 스레드로 실행되는 프로그램 코드의 메모리 위치 등
자바 스레드 프로그래밍
- [방법1] Thread 클래스 상속
- [방법2] Runnable 인터페이스 구현
차이: [방법1]의 경우 단일상속만 가능하기 때문에 다른 클래스를 상속받을 수 없다.
- 스레드의 우선순위
- 자바의 우선순위는 1부터~10까지 존재하며, 기본은 5이다.
- setPriority(): 우선순위를 변경할 수 있다.
- 스레드 실행 중에도 우선순위 바꿀 수 있음.
- getPriority(): 우선순위를 확인할 수 있다.
- setPriority(): 우선순위를 변경할 수 있다.
- 실제 작업 수행결과와 우선순위가 다를 수 있다. (우선순위는 JVM에서 정하는 것(희망사항)이고 실제 스레드를 시작하게 하는 것은 OS의 스케줄러이기 때문이다.)
- 우선 순위는 상대적임.
- 자바의 우선순위는 1부터~10까지 존재하며, 기본은 5이다.
- 스레드의 상태
- NEW : 스레드를 생성한 상태.
- RUNNABLE : start()를 호출 실행 중이거나 실행대기인 상태. 실행대기줄에서 자신의 차례를 기다리다가 자신의 차례가 되면 실행된다. 주어진 시간이 끝나면 다시 뒤로 가서 줄 섬.
- TERMINATED : 해야할 작업이 끝나거나 stop() 이 호출되면 소멸함.
- WAITING : join(), sleep(), suspend()에 의해 실행이 중지된 스레드가 대기하는 상태.
- 스레드의 동기화 방법
- 하나의 프로세스에 할당된 자원을 여러 스레드가 공유하기 때문이다. 따라서 진행중인 작업이 다른 스레드에게 간섭받지 않게 하려면 동기화를 함. ⇒ 임계영역으로 묶음
- lock을 얻은 하나의 스레드만 사용가능함.
- synchronized를 이용한 동기화
참고