자바 메모리 모델
Java memory modelJava 메모리 모델은 Java 프로그래밍 언어의 스레드가 메모리를 통해 어떻게 상호 작용하는지를 설명합니다.싱글 스레드 코드 실행에 대한 설명과 함께 메모리 모델은 Java 프로그래밍 언어의 의미론을 제공합니다.
1995년에 개발된 원래의 Java 메모리 모델은 [1]파손된 것으로 널리 인식되어 많은 런타임 최적화를 방지하고 코드 안전에 대한 충분한 보증을 제공하지 못했습니다.Java Community Process를 통해 업데이트되었으며, Java Specification Request 133(JSR-133)은 2004년부터 Tiger(Java 5.0)[2][3]에 대해 유효하게 되었습니다.
맥락
Java 프로그래밍 언어와 플랫폼은 스레드 기능을 제공합니다.스레드 간의 동기화는 개발자에게 어려운 것으로 악명이 높으며, Java 애플리케이션은 다양한 프로세서 및 운영 체제에서 실행될 수 있기 때문에 이러한 어려움은 더욱 가중됩니다.프로그램의 동작에 대한 결론을 도출하기 위해, Java의 설계자들은 모든 Java 프로그램의 가능한 동작을 명확하게 정의해야 한다고 결정했다.
최신 플랫폼에서는 코드가 작성된 순서대로 실행되지 않는 경우가 많습니다.퍼포먼스를 최대화하기 위해 컴파일러, 프로세서 및 메모리 서브시스템에 의해 순서가 변경됩니다.멀티프로세서 아키텍처에서는 메인 메모리와 동기화되지 않은 개별 프로세서가 자체 로컬 캐시를 가질 수 있습니다.퍼포먼스의 관점에서 보면 비용이 너무 많이 들기 때문에 일반적으로 스레드를 서로 완벽하게 동기화하도록 요구하는 것은 바람직하지 않습니다.즉, 항상 다른 스레드에서 동일한 공유 데이터에 대해 다른 값을 볼 수 있습니다.
단일 스레드 환경에서는 코드 실행에 대해 쉽게 추론할 수 있습니다.일반적인 접근방식에서는 시스템이 개별 스레드에 대해 개별적으로 as-if-serial semantics를 구현해야 합니다.개별 스레드가 실행되면 해당 스레드에 의해 수행된 모든 작업이 프로그램에 표시되는 순서대로 발생하는 것처럼 나타납니다. 작업 자체가 잘못된 순서로 발생하는 경우에도 마찬가지입니다.
1개의 스레드가 명령어를 순서대로 실행하지 않으면 다른 스레드는 첫 번째 스레드의 의미에 영향을 주지 않더라도 해당 명령어가 순서대로 실행되지 않았다는 사실을 인식할 수 있습니다.예를 들어, 변수 x와 y가 모두 0으로 초기화되어 있는 경우 다음 명령을 동시에 실행하는 두 개의 스레드를 고려합니다.
| 스레드 1 | 스레드 2 |
|---|---|
| x = 1; | int r1 = y; |
| y = 2; | int r2 = x; |
순서 변경이 실행되지 않고 스레드2의 y를 읽으면 값 2가 반환되는 경우 x에 쓰기가 y에 쓰기 전에 실행되었기 때문에 x의 후속 읽기에서 값 1이 반환됩니다.단, 2개의 쓰기의 순서를 변경할 경우 y의 판독치는 값 2를 반환하고 x의 판독치는 값 0을 반환할 수 있습니다.
Java Memory Model(JMM; Java 메모리 모델)은 멀티스레드 프로그램의 허용 동작을 정의하며, 따라서 이러한 정렬이 가능한 시기를 설명합니다.또한 일관성 있고 안정적인 Java 애플리케이션을 달성하기 위해 스레드와 메인 메모리 간의 관계에 실행 시간 제약을 가합니다.이것에 의해, 다이나믹 컴파일러, 프로세서, 및 캐시에 의해서 행해지는 최적화에 직면했을 경우에서도, 멀티 스레드 환경에서의 코드 실행을 추론할 수 있다.
메모리 모델
단일 스레드를 실행하는 경우 규칙은 간단합니다.Java 언어 규격을 사용하려면 Java 가상 시스템이 스레드 내 if 직렬 의미를 준수해야 합니다.런타임(이 경우 보통 동적 컴파일러, 프로세서 및 메모리 서브시스템을 참조함)은 스레드 격리 결과가 모든 스테이트먼트가 발생한 순서대로 실행되었을 때와 완전히 동일함을 보증하는 한 유용한 실행 최적화를 도입할 수 있습니다.프로그램의 빨간색(프로그램 [4]순서라고도 함)을 선택합니다.
여기서 가장 중요한 주의사항은 as-if-serial semantics가 다른 스레드의 데이터 보기를 방해하지 않는다는 것입니다.메모리 모델은 데이터를 읽을 때 반환할 수 있는 값에 대한 명확한 지침을 제공합니다.기본 규칙은 스레드의 as-if-serial semantics를 위반하지 않는 한 개별 액션을 정렬할 수 있음을 의미하며, 잠금 획득이나 해제 등 스레드 간의 통신을 암시하는 액션은 그 전에 발생한 액션이 그 효과를 보는 다른 스레드에 의해 확실하게 인식되도록 합니다.예를 들어, 잠금이 해제되기 전에 발생하는 모든 작업은 해당 [5]잠금이 나중에 획득된 후에 발생하는 모든 작업에 표시되도록 지시됩니다.
수학적으로 프로그램에 의해 수행된 모든 액션에 대해 open-before 순서라고 불리는 부분 순서가 있습니다.oper-before 순서는 프로그램 순서를 따릅니다.프로그램 순서에서 어떤 액션이 다른 액션보다 먼저 발생하면 oper-before 순서에서 다른 액션보다 먼저 발생합니다.또한 잠금 해제 및 후속 수집은 발생 전 그래프에서 가장자리를 형성합니다.읽기는 해당 쓰기가 발생-전 순서로 어떤 경로를 따라 읽기 전에 해당 변수에 대한 마지막 쓰기이거나 발생-전 순서로 읽혀진 쓰기 순서가 아닌 경우 쓰기 값을 반환하는 것이 허용된다.
영향
Java 메모리 모델은 인기 있는 프로그래밍 [6]언어에 포괄적인 메모리 모델을 제공하기 위한 첫 번째 시도였다.이는 동시 및 병렬 시스템의 보급이 증가하고 이러한 시스템에 명확한 의미론을 가진 도구와 기술을 제공할 필요성에 의해 정당화되었습니다.그 이후로 메모리 모델의 필요성이 더 널리 받아들여졌고, C++[7]와 같은 언어에도 유사한 의미론이 제공되었다.
「 」를 참조해 주세요.
레퍼런스
- ^ Pugh, William (2000). "The Java memory model is fatally flawed" (PDF). Concurrency: Practice and Experience. 12 (6): 445–455. doi:10.1002/1096-9128(200005)12:6<445::AID-CPE484>3.0.CO;2-A. Retrieved 15 July 2021.
- ^ Goetz, Brian (2004-02-24). "Fixing the Java Memory Model, Part 2" (PDF). Retrieved 2010-10-18.
- ^ Jeremy Manson and Brian Goetz (February 2004). "JSR 133 (Java Memory Model) FAQ". Retrieved 2010-10-18.
The Java Memory Model describes what behaviors are legal in multithreaded code, and how threads may interact through memory. It describes the relationship between variables in a program and the low-level details of storing and retrieving them to and from memory or registers in a real computer system. It does this in a way that can be implemented correctly using a wide variety of hardware and a wide variety of compiler optimizations.
- ^ Manson, Jeremy. "JSR-133 FAQ".
- ^ "JLS Happens-before Order".
- ^ Goetz, Brian (2004-02-24). "Fixing the Java Memory Model, Part 1" (PDF). Retrieved 2008-02-17.
- ^ Boehm, Hans. "Threads and memory model for C++". Retrieved 2014-08-08.
외부 링크
- Java 이론 및 실천: Java 메모리 모델 수정 파트 1 - 원래 Java 메모리 모델의 문제를 설명하는 문서입니다.
- Java 이론 및 실천: Java 메모리 모델 수정 파트 2 - Java 메모리 모델에 대한 JSR 133 변경에 대해 설명합니다.
- Java 메모리 모델 프래그매틱스(스크립트)
- Java 메모리 모델 링크
- 자바 내부 구조
- JSR-133 웹페이지
- JSR-133에 관한 FAQ
- JSR-133 구현 가이드