병렬 프로그래밍 학습 - 다중 루틴 학습 절차

2148 단어 다중 스레드
카탈로그
  • 다중 스레드를 사용하는 이유
  • 다중 스레드 구현 방법
  • 멀티스레드 사용에 따른 문제점
  • 해결 방법
  • 기본 구현
  • 1.멀티스레드를 사용하는 이유
  • 네트워크, I/O 응답을 기다려야 하므로 많은 실행 시간이 소요되므로 비동기식 스레드로 차단을 줄일 수 있음
  • 멀티스레드를 통한 병렬 실행으로 효율성 향상
  • 2. 다중 스레드 구현 방법
  • 멀티스레드: Thread, Runable, Callable\Funture
  • 스레드 풀: Executor 프레임워크
  • 구체적 실현 참고 다선정의 실현 및 상태 설명
    3. 다중 스레드가 가져온 문제
  • 원자성
  • 가시성
  • 질서성
  • 3.1 원자성
    프로그램이 실행되는 동안 연산에 필요한 데이터를 메모리에서 CPU 캐시로 복사합니다. 그러면 CPU가 계산할 때 캐시에서 데이터를 읽고 쓰기 시작하며, 연산이 끝난 후에 캐시에서 메모리로 리셋할 수 있습니다
     i = i + 1
    

    이 문장을 실행할 때, 먼저 메모리에서 i의 값을 읽은 다음 캐시에 복사한 다음, CPU 실행 명령은 i에 1을 더한 다음 데이터를 캐시에 기록합니다. 마지막으로 캐시에서 i의 최신 값을 메모리로 리셋합니다.
    3.2 가시성
    각 스레드는 자신의 작업 메모리를 가지고 있다. 스레드의 작업 메모리에는 이 스레드가 사용한 변수의 메인 메모리 복사본이 저장되어 있다. 스레드는 변수에 대한 모든 작업(읽기, 값 부여 등)은 반드시 작업 메모리에서 진행해야 하며, 메인 메모리의 변수를 직접 읽거나 쓸 수 없고, 서로 다른 스레드 간에도 상대방의 작업 메모리에 있는 변수를 직접 접근할 수 없다.스레드 간 변수 값의 전달은 모두 메인 메모리를 통해 이루어져야 한다.자세한 내용은 JMM 및 메모리 작업 참조
    3.3 질서성
    프로그램 실행 결과를 바꾸지 않는 전제에서 컴파일러와 프로세서는 프로그램 성능을 최적화하기 위해 명령 서열을 다시 정렬한다.자세한 내용은 순서재정리 참조
    4. 해결 방법
  • 원자성은 자바에서 두 개의 고급 바이트 코드 지령 모니터와 모니터 exit를 제공했다. 자바에 대응하는 Synchronized는 코드 블록 내의 조작이 원자라는 것을 보장한다
  • 가시성volatile,synchronized,final
  • 질서성volatile,synchronized
  • 5. 밑바닥 실현
    5.1 모니터: 원자성 해결
    JVM은 Monitor 객체에 대한 액세스와 종료를 기반으로 메소드 동기화와 코드 블록 동기화를 구현하지만 두 가지 구현 세부 사항은 다릅니다.코드 블록 동기화는 모니터와 모니터 exit 명령을 사용하여 이루어진 것이고 방법 동기화는 다른 방식으로 이루어진 것이며 세부 사항은 JVM규범에 상세하게 설명되지 않았다.그러나 방법의 동기화 역시 이 두 지령을 사용하여 실현할 수 있다.
    모니터 명령은 컴파일한 후 동기화 코드 블록의 시작 위치에 삽입하고 모니터 exit는 방법의 끝과 이상에 삽입한다. JVM은 모든 모니터가 대응하는 모니터 exit와 짝을 지어야 한다.모든 대상은 하나의 모니터와 연결되어 있으며, 하나의 모니터가 보유되면 잠겨 있습니다.모니터 리터 명령을 실행할 때 대상에 대응하는 모니터의 소유권을 얻으려고 시도합니다. 즉, 대상의 자물쇠 참고 문서를 얻으려고 시도합니다: 자바 병렬 메커니즘의 밑바닥 실현 원리
    5.2 메모리 장벽: 가시성과 질서성 해결
    메모리 장벽(Memory Barrier, 또는 메모리 울타리, Memory Fence)은 특정 조건에서의 재배열 및 메모리 가시성 문제를 제어하는 CPU 명령어입니다.Java 컴파일러도 메모리 장벽 규칙에 따라 순서재정리를 금지합니다.주로 세 가지 종류가 있는데 그것이 바로 읽기 장벽, 쓰기 장벽, 전체 장벽이다.
    참조: 메모리 장벽

    좋은 웹페이지 즐겨찾기