자바 의 메모리 장벽 을 자세히 설명 하 다.

3896 단어 Java메모리장벽
왜 메모리 장벽 이 있어 야 합 니까?
이것 은 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 변수 가 수정 한 앞 에 다시 정렬 되 었 다 고 볼 수 있 습 니 다.
바로 위의 다 중 스 레 드 안의 가시 성과 순서 성 문 제 를 해결 하기 위해 아래 의 메모리 장벽 기술 이 생 겼 다.
메모리 장벽 의 주요 구성
우선 하드웨어 위의 메모리 장벽 입 니 다.
  • Load 장벽 은 x86 의'ifence'명령 입 니 다.다른 명령 전에 ifence 명령 을 삽입 하면 고속 캐 시 에 있 는 데 이 터 를 무효 화하 고 현재 스 레 드 가 메 인 메모리 에서 데 이 터 를 불 러 오도 록 강제 할 수 있 습 니 다
  • 4.567917.Store 장벽 은 x86 의'sfence'명령 입 니 다.다른 명령 후에 sfence 명령 을 삽입 하면 현재 스 레 드 를 고속 캐 시 에 기록 할 수 있 는 최신 데 이 터 를 메 인 메모리 에 업데이트 하여 다른 스 레 드 를 볼 수 있 습 니 다자바 의 메모리 장벽
    자바 에는 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 변수의 값 을 가 져 올 수 있 습 니 다.
    이상 은 자바 의 메모리 장벽 에 대한 상세 한 내용 입 니 다.자바 메모리 장벽 에 관 한 자 료 는 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기