본 글은 📚 스프링 입문을 위한 자바 객체지향의 원리와 이해 를 읽고 정리한 내용입니다.
프로그램이 메모리를 사용하는 방식은 코드 실행 영역과 데이터 저장 영역으로 나뉘고, 객체 지향 프로그램에서는 위의 그림과 같이 데이터 저장영역을 다시 세 개의 영역으로 분할해서 사용한다.
멀티 스레드(Multi Thread)의 T 메모리 모델은 스택 영역을 스레드 개수만큼 분할해서 쓰는 것이다. 아래의 그림을 참고하자.
멀티 프로세스(Multi Process)는 다수의 데이터 저장 영역, 즉 다수의 T 메모리 모델을 갖는 구조이다. 아래의 그림을 참고하자.
멀티 프로세스
- 각 프로세스마다 각자의 T메모리가 있고 각자 고유의 공간이므로 서로 참조할 수 없다.
- 하나의 프로세스가 다른 프로세스의 T메모리 영역을 절대 침범할 수 없는 메모리 안전한 구조이지만 메모리 사용량은 그만큼 크다.
멀티 스레드
- 하나의 T메모리만 사용하고 스택 영역만 분할하여 사용하는 구조이다.
- 하나의 T메모리 안에서 스택 영역만 분할한 것이기 때문에 하나의 스레드에서 다른 스레드의 스택 영역에는 접근할 수 없지만 스태틱 영역과 힙 영역은 공유해서 사용하는 구조이다.
- 따라서 멀티 프로세스 대비 메모리를 적게 사용할 수 있는 구조이다.
- 즉, 요청당 스레드 생성이 요청당 프로세스보다 더 효율적이다.
멀티 스레드에서 전역 변수 사용의 문제점을 표로 살펴보자.
스레드 1 | 스레드 2 | |
전역 변수 A에 10을 할당 | 전역 변수 A는 10을 저장 | |
전역 변수 A에 20을 할당 | 전역 변수 A는 20을 저장 | |
전역 변수 A의 값을 출력 | 20이 출력된다. |
두 개의 스레드로 구성된 프로그램이 있다고 가정하자. 스레드 1이 공유영역(스태틱과 힙)에 있는 A에 10을 할당하고, 갑자기 CPU사용권이 스레드 2로 넘어가 스레드 2는 공유영역(스태틱과 힙)에 있는 A에 20을 할당했다. 그 뒤 CPU 사용권이 다시 스레드 1로 돌아와서 전역변수의 값을 출력하면 20이라는 값이 출력된다.
이처럼 쓰기 가능한 전역 변수를 사용하게 되면 스레드 안전성이 깨진다고 표현한다. 이를 보완하는 방법으로 락(lock)을 거는 방법이 있긴 하지만 락을 거는 순간 멀티 스레드의 장점을 버릴 것 과 같다.
참고
- 스프링 입문을 위한 자바 객체지향의 원리와 이해
'Language > Java' 카테고리의 다른 글
[Java] 객체 지향의 4대 특성 (캡슐화:정보 은닉) (0) | 2021.09.26 |
---|---|
[Java] 자바와 객체지향 (0) | 2021.09.26 |
[Java] JDK, JRE, JVM 에 대해 간단히 살펴보기 (0) | 2021.09.26 |
[Java] 멀티쓰레드 동기화 - synchronized (0) | 2021.09.11 |
[Java]Java 에서의 I/O(입출력)-Stream (0) | 2021.09.11 |
댓글