자바 병렬 프로 그래 밍 의 가시 성,질서 성,원자 성
5767 단어 자바병렬 프로 그래 밍가시 성질서 성원자 성
이 칼럼 에서 왕 자 는 가능 한 한 백화 와 그림 의 방식 으로 프로 그래 밍 의 본질 을 분석 하고 병행 하여 여러분 들 이 쉽게 이해 할 수 있 기 를 바 랍 니 다.
오늘 우 리 는 가시 성,질서 성,원자 성 이 모두 무엇 인지 이야기 하 자.
동시 프로 그래 밍 의 막후
주제 에 들 어가 기 전에 병행 프로 그래 밍 의 배 후 를 알 아 보 자.
CPU,메모리,I/O 장치 가 계속 업그레이드 되면 서 그들 사이 에는 속도 가 일치 하지 않 는 문제 가 존재 해 왔 다.CPU 의 속 도 는 메모리 보다 높 고 메모리 의 속 도 는 I/O 장치 보다 높다.
저희 가 쓴 코드 의 대부분 내용 은 메모리 처 리 를 거 칩 니 다.어떤 내용 은 I/O 장 치 를 읽 고 씁 니 다.나무통 이론 에 따 르 면 전체적인 성능 은 가장 느 린 조작 에 달 려 있 습 니 다.바로 I/O 장치 이기 때문에 CPU 의 성능 을 향상 시 키 는 것 만 으로 는 부족 합 니 다.
CPU 의 성능 을 최대 화하 기 위해 컴퓨터 의 밑바닥 은 주로 세 부분 을 최적화 시 켰 다.
1.CPU 는 캐 시 를 추가 하여 메모리 속도 보다 빠 르 고 메모리 의 속 도 를 균형 있 게 합 니 다.
2.운영 체제 에 프로 세 스 와 스 레 드 가 추가 되 었 습 니 다.CPU 를 시간 별로 재 활용 할 수 있 습 니 다.
3.컴 파 일 러 는 명령 을 다시 배열 하여 캐 시 성능 을 더욱 잘 발휘 하도록 한다.
우 리 는 평소에 이런 최 적 화 된 성 과 를 누 려 왔 지만 동시에 그들 은 원인 을 찾기 어 려 운 BUG 를 초래 할 수 있다.
무엇이 가시 성 입 니까?
우선 가시 성 이 무엇 인지 살 펴 보 자.
하나의 스 레 드 가 공유 변수 에 대한 수정,다른 스 레 드 는 감지 할 수 있 습 니 다.우 리 는 이 를 가시 성 이 라 고 부 릅 니 다.
단 핵 시대 에 사실은 가시 적 인 문제 가 존재 하지 않 았 다.모든 라인 이 하나의 CPU 에서 작 동 하기 때문에 하나의 라인 의 쓰기 동작 은 다른 라인 에 대해 반드시 볼 수 있 기 때문이다.
그러나 다 핵 CPU 가 나타 나 면 CPU 마다 자체 캐 시가 있 고 여러 스 레 드 가 서로 다른 CPU 에서 데 이 터 를 처리 하면 보이 지 않 는 문제 가 발생 할 수 있 습 니 다.
변수 v 의 값 이 1 이 라 고 가정 하면 두 스 레 드 가 v++작업 을 동시에 실 행 했 습 니 다.먼저 메모리 에서 변수 v 의 데 이 터 를 읽 고 각자 의 CPU 캐 시 로 갑 니 다.이때 두 개의 CPU 캐 시 에 있 는 v 는 모두 1 입 니 다.v++를 실행 한 후에 두 개의 변수 v 는 모두 2 가 되 었 습 니 다.그리고 메모리 에 있 는 변수 v 는 2 가 됩 니 다.
하지만 사실 우리 가 보고 싶 은 결 과 는 v 가 결국 3 이 어야 한다.
CPU 1 캐 시 에서 v++를 실행 하면 CPU 2 캐 시가 감지 되 지 않 습 니 다.이것 이 바로 가시 적 인 문제 입 니 다.그러나 가시 성 문제 로 인 한 최종 데이터 가 정확 하지 않 은 것 은 바로 라인 안전 문제 이다.
무엇이 원자 성 입 니까?
I/O 의 속도 가 너무 느 려 서 초기 운영 체제 에서 여러 프로 세 스 를 발 명 했 습 니 다.즉,특정한 프로 세 스 가 짧 은 시간 동안 실 행 된 후에 프로 세 스 를 다시 선택 하여 실행 할 수 있 도록 하 는 것 입 니 다.이 과정 을 작업 전환 이 라 고 하 는데 이 짧 은 시간 을 우 리 는 시간 영화 라 고 부 릅 니 다.
현재 운영 체제 의 작업 전환 은 일반적으로 더 가 벼 운 스 레 드 전환 을 말 합 니 다.자바 의 병행 프로 그래 밍 은 다 중 스 레 드 를 바탕 으로 하 는 것 이 고 자 연 스 럽 게 스 레 드 전환 도 존재 합 니 다.
보통 시간 영화 가 끝 날 때 스 레 드 전환 을 합 니 다.자바 언어 에서 실 행 된 간단 한 코드 는 여러 개의 CPU 명령 이 필요 합 니 다.예 를 들 어 count+이 부분 코드 는 적어도 세 개의 CPU 명령 이 필요 합 니 다.
1.먼저 count 를 메모리 에서 CPU 레지스터 로 읽 기
2.레지스터 에서+1 동작 수행
3.마지막 으로 count 의 값 을 메모리 에 기록 합 니 다(CPU 캐 시 에 기록 할 수 있 습 니 다)
한편,스 레 드 전환 은 임의의 CPU 명령 이 실 행 된 후에 발생 할 수 있 습 니 다.여기 서 말 하 는 것 은 자바 언어 에서 의 명령 이 아니 라 CPU 의 명령 입 니 다.위의 세 가지 명령 에 있어 서 우 리 는 count=0 을 가정 합 니 다.만약 에 스 레 드 A 가 명령 을 실행 한 후에 스 레 드 를 바 꾸 면 스 레 드 A 와 스 레 드 B 는 다음 그림 의 순서에 따라 실 행 됩 니 다.그러면 우 리 는 두 스 레 드 가 모두 count++의 조작 을 실 행 했 음 을 발견 할 수 있 습 니 다.그러나 얻 은 결 과 는 우리 가 기대 하 는 2 가 아니 라 1 입 니 다.
이것 이 바로 스 레 드 전환 으로 인 한 데이터 오류 문제 입 니 다.우 리 는 하나 이상 의 조작 을 CPU 가 실행 하 는 과정 에서 중단 되 지 않 는 특성 을 원자 성 이 라 고 부 릅 니 다.CPU 가 보장 할 수 있 는 원자 조작 은 CPU 명령 등급 이지 고급 언어의 조작 문자 가 아 닙 니 다.이것 은 우리 의 직감 에 어 긋 나 는 부분 입 니 다.그래서 우 리 는 고급 언어 차원 에서 조작 의 원자 성 을 확보 해 야 할 때 가 많다.
질서 성 이란 무엇 인가
질서 성 이란 프로그램 이 코드 의 선착순 으로 실행 되 는 것 을 말한다.컴 파일 러 는 성능 을 최적화 하기 위해 프로그램 에서 문장의 선후 순 서 를 바 꿀 때 가 있다.예 를 들 어 프로그램 에서'x=1'이다.y=2;”컴 파일 러 가 최적화 되면'y=2'가 될 수 있 습 니 다.x=1;”。
이 예 에서 컴 파 일 러 는 문장의 순 서 를 조 정 했 지만 프로그램의 최종 결과 에 영향 을 주지 않 았 다.하지만 문장의 순 서 를 조정 하면 예상 치 못 한 버그 를 초래 할 수도 있다.
자바 분야 에서 전형 적 인 사례 는 이중 검 사 를 이용 하여 단일 대상 을 만 드 는 것 입 니 다.코드 는 다음 과 같 습 니 다.
public class Singleton {
static Singleton instance;
static Singleton getInstance(){
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
두 개의 스 레 드 A,B 가 getInstance()방법 을 동시에 호출 한다 고 가정 하면 그들 은 동시에 발견 할 것 이다. instance == null ,따라서 Singleton.class 에 자 물 쇠 를 추가 합 니 다.이때 JVM 은 하나의 스 레 드 만 자 물 쇠 를 추가 할 수 있 도록 보장 합 니 다(스 레 드 A 라 고 가정 합 니 다).다른 스 레 드 는 대기 상태 에 있 습 니 다(스 레 드 B 라 고 가정 합 니 다).스 레 드 A 는 싱글 톤 인 스 턴 스 를 만 든 다음 에 자 물 쇠 를 풀 고 자 물 쇠 를 풀 면 스 레 드 B 가 깨 어 납 니 다.스 레 드 B 는 다시 자 물 쇠 를 추가 하려 고 시도 합 니 다.이때 자 물 쇠 를 추가 하 는 데 성공 할 수 있 습 니 다.자 물 쇠 를 추가 하 는 데 성공 한 후에 스 레 드 B 검 사 를 할 수 있 습 니 다. instance == null 싱글 톤 인 스 턴 스 를 만 들 었 기 때문에 스 레 드 B 는 싱글 톤 인 스 턴 스 를 만 들 지 않 습 니 다.이 과정 은 빈틈 이 없 는 것 처럼 보이 지 않 습 니까?
답 은 부정 적 이다.문 제 는 new 조작 에 있다.우리 가 생각 하 는 new 조작 은 이렇다.
1.메모리 공간 할당
2.이 메모리 공간 에서 Singleton 인 스 턴 스 대상 을 초기 화 합 니 다.
3.이 대상 의 메모리 주 소 를 instance 변수 에 할당 합 니 다.
그러나 실제 명령 의 재배 치 로 인해 최 적 화 된 과정 은 다음 과 같다.
1.메모리 공간 할당
2.이 빠 른 메모리 공간의 메모리 주 소 를 instance 변수 에 할당 합 니 다.
3.이 메모리 공간 에서 Singleton 인 스 턴 스 대상 을 초기 화 합 니 다.
그러면 이렇게 순 서 를 바 꾸 면 무슨 일이 일어 날 까요?
우 리 는 스 레 드 A 가 먼저 getInstance()방법 을 실행 하고 명령 2 를 실 행 했 을 때 마침 스 레 드 전환 이 발생 하여 스 레 드 B 로 전환 했다 고 가정 합 니 다.이때 스 레 드 B 도 getInstance()방법 을 실행 하면 스 레 드 B 는 첫 번 째 판단 을 수행 할 때 발견 할 수 있 습 니 다. instance != null ,그래서 인 스 턴 스 를 직접 되 돌려 줍 니 다.이때 인 스 턴 스 는 초기 화 되 지 않 았 습 니 다.인 스 턴 스 를 방문 하 는 구성원 변 수 는 빈 포인터 이상 을 일 으 킬 수 있 습 니 다.
총결산
병발 프로 그래 밍 개발 을 사용 하면 원인 을 찾기 어 려 운 BUG 가 많이 발생 한다.가시 성,질서 성과 원자 성에 대한 분석 을 통 해 병발 로 인 한 BUG 를 조사 하 는 데 방향 을 제시 할 수 있다.
CPU 캐 시 는 가시 성 을 가 져 옵 니 다.
명령 정렬 은 질서 성 을 가 져 올 수 있다.
스 레 드 전환 은 원자 성 을 가 져 올 수 있다.
이상 이 이 글 의 세 가지 핵심 내용 이 니 다음 글 은 계속 하 겠 습 니 다.
이상 은 자바 병발 프로 그래 밍 의 가시 성,질서 성과 원자 성에 대한 상세 한 내용 입 니 다.자바 병발 프로 그래 밍 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.