반응형
조금씩 업데이트하는 프로세스와 쓰레드 관련 메모장.
다음 추가할 주제는 데드락, 멀티 프로세스 vs 멀티 쓰레드 이다.
프로세스
- 프로그램의 실행 단위. (프로그램의 인스턴스)
- 메모리를 text, data, bss, stack, heap 5가지 공간으로 나눠서 가지고 있음
- text
- 실행 코드가 저장됨. 실행 중에 변경되지 않음(읽기 전용)
- data
- 초기화된 전역 변수, 정적 변수가 저장됨. 프로그램 시작 전에 할당되고, 실행 중에 변경 가능
- bss
- 선언은 됐지만 초기화되지 않은 전역 변수, 정적 변수가 저장됨.
- stack
- 함수 호출(함수의 지역 변수, 매개 변수, 호출 포인터), 지역 변수가 저장됨
- 함수 호출했을 때 할당되는 메모리 공간을 stack frame이라고 함
- 힙에 비해서 메모리 할당, 해제 속도가 빠름
- 힙에 비해 상대적으로 작은 메모리 공간
- 크기가 결정되어 있음. 정해진 크기를 초과할 수 없음
- 이 크기 이상으로 할당하면 어떻게 되나요? -> 스택 오버플로우가 발생해요~
- heap
- 메모리 할당, 해제 속도가 스택에 비해 상대적으로 느림
- 스택에 비해 상대적으로 큰 메모리 공간
- 런타임에 할당, 해제함
- 크기가 결정되어 있지 않음. 가능한 메모리 한도 내에서 확장 가능
- 최대 한도를 넘어서 할당하면 어떻게 되나요? -> 힙 오버플로우가 발생해요~
쓰레드
프로세스 내부의 작업 단위
싱글 쓰레드는 하나의 프로세스에서 하나의 쓰레드만 실행되는 것
멀티 쓰레드
- 프로세스 내부에 쓰레드(작업 단위)가 여러개임
- 쓰레드마다 독립적인 스택 메모리를 가지고 있음. 나머지 메모리는 공유함
- 장점
- 비동기 실행 가능
- 여러 작업 동시 실행 가능 -> 성능 향상. 그런데 이건 너무 단순한 설명이다.
- 그럼 모든 프로세스에서 쓰레드 최대한 많이 사용하지.
- 멀티 쓰레드를 사용해서 얻을 수 있는 성능 향상은 임계점이 있다. 왜냐면 쓰레드도 자원을 사용하기 때문이다.
- 단순하게 생각하자. 컴퓨터는 CPU랑 메모리가 제일 중요하다. 멀티쓰레드의 쓰레드가 CPU의 코어, 쓰레드보다 많아지면 실제로는 병렬 처리되지 않고 싱글 쓰레드로 스케쥴링 하는 것과 같다.
- 그리고 프로세스에 비해선 적지만, 컨텍스트 스위칭, 메모리, 동기화 각각의 오버헤드가 있다.
- 게다가 멀티쓰레드가 유리한 작업이 있고, 불리한 작업이 있다. 생각하고 상황에 맞게 잘 사용하자.
- 단점
- 동기화 문제
- 공유 자원에 어떻게 접근할 것인가?
- 락을 사용해서 접근 권한을 제어한다.
- 데드락 상태
- 동기화 문제를 해결하기 위해 락을 사용할 때 발생하는, 서로의 락이 해제되기를 기다리는 교착 상태
- 어떻게 해결할 것인가? -> 왜 발생하나?
- 데드락 발생이 발생하는 4가지 조건을 회피해야 한다.
- 데드락에 관해서 추후 더 자세히 정리.
- 동기화 문제
Java의 쓰레드
- 일반 쓰레드와 동일하다. JVM 프로세스 내부에서 동작함. (당연한 말)
- main 함수를 실행하는 쓰레드가 메인 쓰레드임
- 메인 쓰레드가 종료되면 JVM도 같이 종료됨.
- 멀티 쓰레드를 지원한다.
// 사용 예제
public class MyThread extends Thread {
@Override
public void run() {
System.out.println("MyThread run");
}
}
public static void main(String[] args){
MyThread myThread = new MyThread();
myThread.start();
}
반응형