자바 의 메모리 장벽 을 자세히 설명 하 다.
이것 은 cpu,고속 캐 시,메 인 메모리 가 발생 했 을 때 발생 하 는 가시 성과 재 구성 문 제 를 해결 하기 위해 서 입 니 다.어떤 문제 입 니까?아래 를 보십시오.
우 리 는 모두 컴퓨터 연산 임 무 는 CPU 와 메모리 가 서로 협조 하여 공동으로 완성 해 야 한 다 는 것 을 알 고 있다.그 중에서 CPU 는 논리 적 계산 을 책임 지고 메모 리 는 데이터 저장 을 책임 진다.CPU 는 연산 데이터 읽 기,연산 결과 저장 등 메모리 와 상호작용 을 해 야 한다.메모리 와 CPU 의 계산 속 도 는 몇 개의 수량 급 차이 가 있 기 때문에 CPU 의 이 용 률 을 높이 기 위해 현대 프로세서 구 조 는 읽 기와 쓰기 속도 가 가능 한 한 CPU 연산 속도 에 가 까 운 고속 캐 시 를 추가 하여 메모리 와 CPU 간 의 버퍼 로 사용 합 니 다.연산 에 필요 한 수 거 를 캐 시 에 복사 하여 CPU 연산 을 빠르게 진행 할 수 있 도록 합 니 다.계산 이 끝 난 후에 계산 결 과 를 캐 시 에서 메 인 메모리 로 동기 화하 면 프로세서 가 느 린 메모리 읽 기와 쓰 기 를 기다 릴 필요 가 없다.아래 처럼 이렇게.
캐 시 도입 은 CPU 와 메모리 사이 의 속도 갈등 을 해 결 했 지만 다 중 CPU 시스템 에서 도 새로운 문 제 를 가 져 왔 습 니 다.시각 적 문제 와 정렬 문제 입 니 다.
먼저 가시 적 인 문제 입 니 다.두 개의 라인 A,B 가 각각 두 개의 서로 다른 CPU 에서 실행 된다 고 가정 하면 같은 변수 X 를 공유 합 니 다.스 레 드 A 가 X 를 수정 한 후에 X 업데이트 후의 결 과 를 메 인 메모리 에 동기 화하 지 않 으 면 변수 X 의 수정 은 B 스 레 드 에 보이 지 않 습 니 다.이렇게 하면 가시 적 인 문 제 를 일 으 킬 수 있다
그 다음 에 정렬 을 다시 하 는 문제 입 니 다.A,B 두 라인 이 두 변수 X,Y 를 공유 하고 A 와 B 가 각각 다른 CPU 에서 실행 된다 고 가정 합 니 다.A 에서 변수 X 의 값 을 고속 캐 시 구역 에 변경 한 다음 변수 Y 의 값 을 고속 캐 시 구역 에 변경 합 니 다.이 때 Y 의 값 이 메 인 메모리 에 동기 화 되 고 X 의 값 이 메 인 메모리 에 동기 화 되 지 않 은 경우 가 발생 할 수 있 습 니 다.이 때 B 스 레 드 에 서 는 X 변수 가 수정 되 는 것 을 감지 할 수 없 거나 B 스 레 드 에 있어 Y 변수의 수정 이 X 변수 가 수정 한 앞 에 다시 정렬 되 었 다 고 볼 수 있 습 니 다.
바로 위의 다 중 스 레 드 안의 가시 성과 순서 성 문 제 를 해결 하기 위해 아래 의 메모리 장벽 기술 이 생 겼 다.
메모리 장벽 의 주요 구성
우선 하드웨어 위의 메모리 장벽 입 니 다.
자바 에는 4 가지 가 있 는데 로드 로드 로드,스토어 스토어,로드 스토어,스토어 로드 입 니 다.실제로 도 알 수 있 듯 이 이 네 가 지 는 모두 위의 두 가지 조합 으로 만들어 진 것 입 니 다.
Load Load 장벽:
예 를 들 어 Load 1;LoadLoad; Load 2(이 문장 에 있 는 Load Load 의 첫 번 째 Load 는 Load 1 로 딩 코드 에 대응 하고 Load 1 로 딩 코드 에 있 는 두 번 째 Load 는 Load 2 로 딩 코드 에 대응 합 니 다).이 때 는 Load 2 로 딩 코드 가 읽 을 데 이 터 를 불 러 오기 전에 Load 1 로 딩 코드 가 메 인 메모리 에서 읽 을 데 이 터 를 읽 어야 한 다 는 뜻 입 니 다.
StoreStore 장벽:
예시 문 구 는 Store 1 이다.StoreStore; Store 2(이 문장 안의 Store Store 안의 첫 번 째 Store 는 Store 1 저장 코드 에 대응 하고 Store Store 안의 두 번 째 Store 는 Store 2 저장 코드 에 대응 합 니 다).이 때 는 Store 2 저장 코드 를 기록 하기 전에 Store 1 의 기록 작업 이 메 인 메모리 에 데 이 터 를 기록 하고 Store 1 의 기록 작업 이 다른 프로세서 에 보 이 는 지 확인 하 라 는 뜻 이다.
Loadstore 장벽:
예 를 들 어 Load 1;LoadStore; Store 2(이 문장 에 있 는 Load Store 안의 Load 는 Load 1 로 딩 코드 에 대응 하고 Load Store 안의 Store 는 Store 2 로 저장 코드 에 대응 합 니 다).이 때 는 Store 2 저장 코드 를 쓰기 전에 Load 1 로 딩 코드 가 메 인 메모리 에서 읽 은 데 이 터 를 읽 어야 한 다 는 뜻 입 니 다.
예 를 들 어 Load 1;LoadStore; Store 2(이 문장 에 있 는 Load Store 안의 Load 는 Load 1 로 딩 코드 에 대응 하고 Load Store 안의 Store 는 Store 2 로 저장 코드 에 대응 합 니 다).이 때 는 Store 2 저장 코드 를 쓰기 전에 Load 1 로 딩 코드 가 메 인 메모리 에서 읽 은 데 이 터 를 읽 어야 한 다 는 뜻 입 니 다.
StoreLoad 장벽:
예시 문 구 는 Store 1 이다.StoreLoad; Load 2(이 문장 안의 StoreLoad 안의 Store 는 Store 1 저장 코드 에 대응 하고 StoreLoad 안의 Load 는 Load 2 로드 코드 에 대응 합 니 다).Load 2 로드 코드 가 메 인 메모리 에서 읽 은 데 이 터 를 불 러 오기 전에 Store 1 의 기록 작업 이 메 인 메모리 에 데 이 터 를 기록 하고 Store 1 의 기록 작업 이 다른 프로세서 에 보 이 는 지 확인 합 니 다.
Volatile 키워드 안에 있 는 메모리 장벽 이 작용 합 니 다.
모든 volatile 쓰기 작업 전에 StoreStore 장벽 을 삽입 하면 다른 스 레 드 가 A 변 수 를 수정 한 후에 수 정 된 값 을 현재 스 레 드 에 볼 수 있 습 니 다.쓰기 작업 후에 StoreLoad 장벽 을 삽입 하면 다른 스 레 드 가 A 변 수 를 가 져 올 때 현재 스 레 드 에 수 정 된 값 을 가 져 올 수 있 습 니 다.
모든 volatile 읽 기 작업 전에 LoadLoad 장벽 을 삽입 하면 현재 스 레 드 가 A 변 수 를 가 져 올 때 다른 스 레 드 도 같은 값 을 가 져 올 수 있 도록 합 니 다.그러면 모든 스 레 드 가 읽 은 데 이 터 는 똑 같 습 니 다.읽 기 작업 후에 Loadstore 장벽 을 삽입 합 니 다.이렇게 하면 현재 스 레 드 가 다른 스 레 드 에서 A 변수의 값 을 수정 하기 전에 메 인 메모리 에 있 는 A 변수의 값 을 가 져 올 수 있 습 니 다.
이상 은 자바 의 메모리 장벽 에 대한 상세 한 내용 입 니 다.자바 메모리 장벽 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.