
프로세스와 쓰레드
- 프로세스 : 운영체제로부터 자원을 할당받는 작업의 단위
- 쓰레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위
프로세스
-“실행 중인 프로그램”을 의미
프로세스 구조
-OS가 프로그램 실행을 위한 프로세스를 할당해줄때 프로세스안에 프로그램 Code,Data,메모리 영역(Stack, Heap)을 함께 할당
Code
main 메소드와 같은 코드를 의미
Data
프로그램이 실행 중 저장 할 수 있는 저장공간을 의미
Memory (동적 변수 저장)
Stack : 지역변수, 매개변수 리턴 변수를 저장하는 공간
Heap : 프로그램이 동적으로 필요한 변수를 저장하는 공간 (new(), mallock())
쓰레드
코드실행의 흐름
쓰레드의 생성
-프로세스가 작업중인 프로그램에서 "실행요청"이 들어오면 쓰레드(일꾼)을 만들어 명령을 처리
쓰레드 자원
-쓰레드들은 실행을 위한 프로세스 내 주소공간이나 메모리공간(Heap)을 공유한다.
-자신만의 메모리공간(Stack)도 할당받는다.
Java 쓰레드 (=일반 쓰레드와 동일)
-JVM 프로세스 위에서 실행
-Java Main 쓰레드부터 실행되며 JVM에 의해 실행
멀티 쓰레드
멀티 쓰레드 <-> 싱글 쓰레드
-Java는 멀티 쓰레드를 지원하며 병렬로 코드를 실행 시킬 수 있다
-걸리는 시간이나, 동작을 예측할수가 없다.
싱글 쓰레드
-프로세스 안에서 하나의 쓰레드만 실행
-main() 메서드만 실행시켰을때 이것을 싱글 쓰레드 -> main() 메서드의 쓰레드를 ‘메인 쓰레드’
-메인 쓰레드가 종료되면, JVM 도 같이 종료
멀티 쓰레드
-프로세스 안에서 여러개의 쓰레드가 실행되는 것
-메인 쓰레드외에 다른 작업 쓰레드들을 생성
장점
여러개의 쓰레드(실행 흐름)을 통해 여러개의 작업을 동시에 할 수 있어서 성능이 좋아짐
자원을 보다 효율적으로 사용
응답 쓰레드와 작업 쓰레드를 분리하여 빠르게 응답을 줄 수 있습니다. (비동기)
단점
동기화 문제가 발생 - 프로세스의 자원을 공유 하면서 작업을 처리하기 때문에 자원을 서로 사용하려고 하는 충돌이 발생
교착 상태(데드락)이 발생 - 둘 이상의 쓰레드가 서로의 자원을 원하는 상태가 되었을 때 서로 작업이 종료되기만을 기다리며 작업을 더 이상 진행하지 못하게 되는 상태
Threed와 Runnable
구현방법 3가지
-Thread - run() 메서드에 작성된 코드가 쓰레드가 수행할 작업, 다중 상속을 지원하지 않아서 Thread를 상속 받아 처리하는 방법은 확장성이 매우 떨어짐
-Runnable - run() 메서드도 쓰레드가 수행할 작업, Runnable은 인터페이스이기 때문에 다른 필요한 클래스를 상속 받을 수 있어 확장성에 유리하다.
-람다식 - run() 메서드에 작성했던 쓰레드가 수행할 작업을 실행 블록 { } 안에 작성, setName() 메서드는 쓰레드에 이름을 부여, Thread.currentThread().getName() 은 현재 실행 중인 쓰레드의 이름을 반환
📝오늘의 회고
컴퓨터의 CPU의 코어 갯수에 따라 성능이 달라지는 것 처럼 쓰레드도 싱글, 멀티 나누는 것으로 보인다.
오늘도! 쳐지지 말고 포기하지말고 힘내서 가보자고~~~