티스토리 뷰
이번 글의 목적
thread, multithreading, critical section에 대한 어느 정도 이해가 있다는 가정하에 Thread-Safe를 JVM과 하드웨어 아키텍처 관점에서 풀어내보려고 합니다.
Thread
Thread는 [그림 1]과 같이 자신과 같은 프로세스 내부에 있는 Thread들과 heap, data, code 영역등을 공유합니다. stack 영역은 각 thread별로 다른 영역을 가지게 됩니다.
따라서, multithreading을 사용할 때는 heap, data, code 영역과 같은 공유자원의 접근에 유의하여 코딩을 진행해야 합니다.
JVM 메모리 구조
JVM 메모리 구조는 위와 조금 다르게 아래와 같이 이루어져있습니다. [그림 2]은 원래 JVM 메모리 구조 모습이고, [그림 3]은 설명하기 위해 간단하게 표현한 것입니다.
Java에서 mutithreading 개발을 진행할 때, Thread-Safe하게 하려면 어떤 것들이 stack에 저장되고, heap에 저장되는지 알 필요가 있습니다.
- stack : 기본형 지역변수(boolean, int, float), 매개변수 등이 저장
- heap : 모든 instance 변수(흔히 new로 선언한 객체들, wrapper class 등등)
뿐만 아니라 static 변수도 Thread 관점에서 공유 자원이다.
따라서, Thread-Safe하게 코딩하려면 모든 instance 변수와 static 변수의 접근에 대해 잘 생각하여 진행해야겠다.
하지만...!!!! JVM 관점에서 thread의 공유 자원만 생각했다고 thread-safe한 것은 아닙니다. 최근 하드웨어들은 멀티 코어 CPU를 가지게 되는데 이를 통해 Cache coherence로 인한 공유자원들의 데이터 불일치 문제가 발생할 수 있습니다. multithreading을 진행할 경우 시스템의 여러 CPU를 사용하기에 Thread-Safe하기 위해서는 Hardware Architecture도 고려해야 합니다.
Hardware Architecture
각각의 CPU에는 memory로부터 더 빠르게 데이터를 읽고 쓰기 위한 Cache가 존재하는데, Cache는 변경될때마다 매번 main memory를 변경하는 것이 아닙니다. 따라서, [그림4]와 같은 경우 각 CPU 간의 로컬 Cache가 불일치하는 Cache coherence가 발생하게 됩니다.
- [그림 4] 설명
(1) main memory로부터 block A에서 0을 읽어서 CPU 0 Cache에 저장하게 된다.
(2) main memory로부터 block A에서 0을 읽어서 CPU 1 Cache에 저장하게 된다.
(3) 이 때, CPU 0이 Local cache에 있는 block A 값을 1로 바꾼다면, CPU 1의 local cache와 값이 다르게 된다.
-> 이렇게 되면, multithreading을 사용할 때 의도하지 않은 동작을 하게 될 수 있습니다.
따라서, 공유 자원들은 main memory로 동기화하고 읽을 때도 메인 메모리로부터 가져올 필요가 있는데, 이를 할 수 있게 하는 것이 Java의 synchronized입니다. 뿐만 아니라, synchronized은 한 순간에 하나의 thread만 읽거나 수정할 수 있기에 완벽히 Thread-Safe하다고 할 수 있습니다.
따라서, Thread-Safe하려면 synchronized 매커니즘을 사용하면 됩니다. 사실 synchronized 매커니즘을 사용하기만 하면 위의 내용을 명확히 알 필요는 없습니다. 하지만 자신이 사용하는 라이브러리, 매커니즘을 파고 들어 분석해본다면, 상황에 따라 더 나은 코드를 만들고, 더 좋은 성능을 내며, 더 나은 개발자가 될 수 있을 것이라고 생각합니다.
끝으로 현재 지식이 부족하여 synchronized 외에는 다른 동기화 방식들이 어떻게 동작하는지 잘 모르지만, 추후에 volatile, semaphore, lock, fairlock은 어떤 방식으로 동기화를 하는지 분석하고 포스팅을 하겠습니다. 감사합니다.!!
참고 자료
https://parkcheolu.tistory.com/14?category=654619
자바 메모리 모델
이 글은 원 저자 Jakob Jenkov의 허가로 포스팅된 번역물이다. 원문 URL : http://tutorials.jenkov.com/java-concurrency/java-memory-model.html 자바 메모리 모델은 컴퓨터의 메모리를(RAM)을 통해 JVM이 어떻..
parkcheolu.tistory.com
http://tutorials.jenkov.com/java-concurrency/java-memory-model.html
Java Memory Model
The Java memory model specifies how the Java virtual machine and Java programs work with the memory in the computer your Java programs run on.
tutorials.jenkov.com
Runtime Data Areas의 구조
Runtime Data Areas는 Process로서의 JVM이 프로그램을 수행하기 위해 OS로부터 할당 받는 메모리 영역이다. Runtime Data Areas는 각각의 목적에 따라 5 개의 영역으로 나뉜다. PC Registers Java Virtual Machin..
www.hakawati.co.kr
https://wanzargen.tistory.com/17
JAVA :: 자바 메모리 구조 - 2. 힙 영역(Heap Area)과 스택 영역(Stack Area) 비교
자바 메모리 구조 이전 포스트에서 자바의 메모리 구조는 크게 메소드 영역, 힙 영역, 스택 영역으로 나뉘어 있다는 것과, 메소드 영역이 뭔지 살짝 알아봤다. 이번에는 힙 영역과 스택 영역은 뭔지, 각각 어떤 역..
wanzargen.tistory.com
https://goodgid.github.io/Cache-Coherence/
캐시 일관성(Cache Coherence)
Content
goodgid.github.io
'CS(ComputerScience)' 카테고리의 다른 글
[알고리즘] Insertion Sort의 고찰 (0) | 2020.01.11 |
---|
- Total
- Today
- Yesterday
- 개발자
- math
- locality of reference
- Insertion Sort
- divide and conquer
- codeforce
- computer science
- 운영체제
- Cache coherence
- 건강
- Quick Sort
- 운동
- java
- 컴퓨터구조
- JVM
- Thread-safe
- synchronized
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |