[꼼꼼한 개발자] 꼼코더
11. 스프링 입문을 위한 자바 객체 지향의 원리와 이해 - [자바와 절차적/구조적 프로그래밍] - 멀티 스레드 / 멀티 프로세스의 이해 본문
Spring/스프링 입문을 위한 자바 객체 지향의 원리와 이해
11. 스프링 입문을 위한 자바 객체 지향의 원리와 이해 - [자바와 절차적/구조적 프로그래밍] - 멀티 스레드 / 멀티 프로세스의 이해
꼼코더 2022. 12. 27. 02:07반응형
👀 멀티 스레드(Multi Thread)
- 멀티 스레드의 T 메모리 모델은 스택 영역을 스레드 개수만큼 분할해서 쓰는 것이다.
- 멀티 스레드는 하나의 T 메모리만 사용하는데 스택 영역만 분할해서 사용하는 구조이다.
- 멀티 스레드는 하나의 스레드에서 다른 스레드의 스택 영역에는 접근할 수 없지만 스태틱 영역과 힙 영역은 공유해서 사용하는 구조이다. 따라서 멀티 프로레스 대비 메모리를 적게 사용할 수 있는 구조이다.
👀 멀티 프로세스(Multi Process)
- 멀티 프로세스는 다수의 데이터 저장 영역, 즉 다수의 T 메모리를 갖는 구조다.
- 멀티 프로세스는 각 프로세스 마다 각자의 T 메모리가 있고 각자 공유의 공간이므로 서로 참조할 수 없다.
- 멀티 프로세스는 하나의 프로세스가 다른 프로레스의 T 메모리 영역을 절대 침범할 수 없는 메모리 안전한 구조이지만 메모리 사용량은 그만큼 크다.
- 따라서 멀티 프로레스 대비 메모리를 적게 사용할 수 있는 구조이다.
자바 웹 프로그래밍을 공부했다면.
“서블릿은 요청당 프로레스가 아닌 요청당 스레드를 생성한다.”를 알 것이다.
이제는 요청당 스레드(Servler)가 요청당 프로세스(CGI) 보다 왜 더 효율적인지 이해할 수 있을 것이다.
🔎 멀티 스레드에서 전역 변수 사용의 문제점
- 두개의 스레드로 구성된 프로그램이 있다.
- 스레드 1이 공유 영역(스태틱과 힙)에 있는 전역 변수에 A에 10을 할당했다.
- 그런데 CPU 사용권이 스레드 2로 넘어가고 스레드 2가 전역 변수 A에 20을 할당하고 다시 CPU 사용권이 스레드 1로 넘어가서 A의 값을 출력해 보면 어떻게 될까?
- 스레드 1의 입장에서는 갑자기 20이라는 값이 출력되는 문제가 발생한다.
이러한 이유 때문에 전역 변수를 사용하게 되면 안정성이 깨진다고 표현한다.
물론 보완 방법으로는 락(Lock)을 거는 방법이 있지만 이 순간 멀티 스레드의 장점을 버린 것과 같다.
👨🏻💻 멀티 스레드 예제
멀티 스레드는 웹 프로그래밍에서 참 열심히 쓰는 기술이다.
따라서 아래 예제를 보면서 낭패의 사례를 알아보도록 하자.
실행 결과를 보면 깜짝 놀라게 될 것이다.
혹시 놀라지 않았다면 16번째 줄의 sleep() 메서드의 인자값을 100000 이상 인으로 변경하고 재실행해 보자.
💁🏻♂️결과
값이 2줄씩 동시에 딜레이 되어 일정한 간격(sleep()에 인자 값 만틈)으로 출력된다.
> 1 3(쉬고)…2 4(쉬고)…
🔎 툴을 (STS 또는 Eclipse) 이용해 T 메모리 영역 엿보기
- 코드 영역 왼쪽에 원하는 숫자 줄을 더블 클릭하면 브레이크 포인트가 걸린다.(파란 원 표시)
- 코드영역 마우스 우클릭 → Debug As → Java Application 클릭
- F5(Step into)를 누를 때마다 한 줄씩 순차적으로 실행하면서 스택 프레임의 변화를 확인할 수 있다.
💁🏻♂️ 결과
좌측하단 브레이크에 멈춰있는 것이 확인된다.
스택 메모리 현황, 스택 프레임 현황 정보가 화면 상단에 나타난다.
좌측 상단 : 스택 메모리 현황
우측 상단 : 스택 프레임 내부의 지역 변수 현황
위 내용은 스프링 입문을 위한 자바 객체 지향의 원리와 이해 교재를 참고하여 작성되었습니다.
'Spring > 스프링 입문을 위한 자바 객체 지향의 원리와 이해' 카테고리의 다른 글
Comments