1. 높은 동시성에 대한 몇 가지 중요한 개념
1.1 동기 및 비동기
우선, 여기에 언급 된 동기화 및 비동기식은 기능/방법 호출 측면을 나타냅니다.
분명히, 동기식 호출은 메소드가 돌아올 때까지 기다릴 것이고, 비동기 호출이 즉시 돌아 오지만, 비동기 호출이 즉시 반환되면 작업이 완료되었음을 의미하지는 않습니다. 작업을 계속하기 위해 백그라운드에서 스레드를 설정합니다.
1.2 동시성 및 평행주의
동시성과 병렬성은 외관에서 유사합니다. 그림에서 볼 수 있듯이 병렬 처리는 두 작업이 동시에 수행 될 때이며 동시성은 한 번에 하나의 작업을 수행 한 다음 다른 작업으로 전환하는 것입니다. 따라서 단일 CPU는 평행 할 수 없으며 동시성 만 가능합니다.
1.3 중요 영역
임계 영역은 공공 자원 또는 공유 데이터를 나타내는 데 사용됩니다. 여러 스레드에서 사용할 수 있지만 한 번에 하나의 스레드 만 사용할 수 있습니다. 임계 영역 자원이 점유되면 다른 스레드는이 리소스를 사용하려는 경우 대기해야합니다.
1.4 차단 및 비 블로킹
차단 및 비 블로킹은 일반적으로 여러 스레드 사이의 상호 영향을 설명합니다. 예를 들어, 스레드가 임계 영역 자원을 차지하는 경우이 리소스가 필요한 다른 모든 스레드는이 임계 영역에서 기다려야하며 대기는 스레드가 매달려 야합니다. 이것은 차단입니다. 현재 자원을 차지하는 스레드가 리소스를 공개하지 않으려는 경우이 중요한 영역에서 차단하는 다른 모든 스레드는 작동 할 수 없습니다.
비 블로킹은 여러 스레드가 동시에 임계 영역에 들어갈 수 있도록합니다.
따라서 차단의 성능은 일반적으로 좋지 않습니다. 일반 통계에 따르면, 스레드가 운영 체제 수준에서 중단되고 컨텍스트 스위치를 만들면 일반적으로 80,000 시간 사이클이 필요합니다.
1.5 교착 상태, 굶주림, 라이브 잠금 장치
소위 교착 상태는 경쟁 자원이나 두 개 이상의 프로세스의 실행 프로세스 중에 서로 통신하여 발생하는 막힘을 말합니다. 외부 세력이 없으면 전진 할 수 없습니다. 현재 시스템을 교착 상태라고하거나 시스템에는 교착 상태가 있습니다. 항상 서로를 기다리는 이러한 프로세스를 교착 상태 프로세스라고합니다. 아래 그림의 차가 앞으로 나아가고 싶어하지만 아무도 앞으로 나아갈 수는 없습니다.
그러나 교착 상태는 나쁜 현상이지만 정적 문제입니다. 교착 상태가 발생하면 프로세스가 고정되고 CPU 점유율도 0입니다. CPU를 점유하지 않으면 호출됩니다. 비교적 말하면, 발견하고 분석하는 것은 비교적 쉽습니다.
교착 상태에 해당하는 것은 라이브 잠금 장치입니다.
Live Lock은 사물이 리소스를 사용할 수 있지만 다른 것들은 자원을 먼저 사용할 수 있음을 의미합니다. Things 2는 자원을 사용할 수 있지만 다른 것들은 먼저 자원을 사용할 수 있으므로 겸손하고 자원을 사용할 수 없습니다.
예를 들어, 길거리에서 누군가를 만나서 반대 방향으로 걷고 정면으로 만나는 것과 같습니다. 당신은 왼쪽으로 이사했고, 그는 왼쪽으로 이사했지만 두 사람은 여전히 거기에 갈 수 없었습니다. 현재, 당신은 오른쪽으로 이동하여 오른쪽으로 이동하여 이런 식으로 계속합니다.
스레드가 리소스를 얻을 때 다른 스레드는 모든 리소스를 얻지 못했기 때문에이 자원을 생각한다는 것을 알게되므로 교착 상태를 피하기 위해 모든 리소스를 포기합니다. 다른 스레드에서 동일한 작업을 수행하면 A RESS를 보유하는 것과 같은 동일한 리소스가 필요하고 B 리소스를 보유하고 자원을 포기한 후 A는 B 리소스를 얻고 B 리소스를 얻고이를 반복하면 라이브 잠금이 발생합니다.
라이브 자물쇠는 역동적 인 프로세스이기 때문에 라이브 자물쇠는 교착 상태보다 감지하기가 더 어렵습니다.
기아는 하나 이상의 스레드가 여러 가지 이유로 필요한 리소스를 얻을 수 없으므로 실행할 수 없다는 것을 의미합니다.
1.6 동시성 수준
동시성 레벨 : 차단 및 비 블로킹 (비 블로킹은 배리어 프리, 잠금 장치 및 대기자로 나뉩니다)
1.6.1 차단
한 스레드가 임계 섹션에 들어가면 다른 스레드가 대기해야합니다.
1.6.2 접근성
차단 스케줄링과 비교할 때 차단 스케줄링은 비관적 전략이며, 이는 데이터를 함께 수정하는 것이 데이터가 나빠질 수 있다고 생각합니다. 스케줄링을 차단하는 대신 낙관적 인 전략으로, 데이터 수정이 반드시 데이터가 나빠질 필요는 없다고 생각합니다. 그러나 그것은 광범위한 진입과 엄격한 출구 전략입니다. 프로세스에 중요한 영역에서 데이터 경쟁과 충돌이 있음을 발견하면 장벽없는 스케줄링 방법이 데이터를 롤백합니다.
이 장벽없는 스케줄링 방법에서 모든 스레드는 시스템의 스냅 샷을 취하는 것과 같습니다. 그들은 유효 할 때까지 스냅 샷을 계속 받으려고 노력할 것입니다.
1.6.3 잠금
접근 가능합니다
이길 수있는 스레드가 있는지 확인하십시오
접근성과 비교할 때 접근성이 경쟁이있을 때 운영이 완료 될 수 있다고 보장하지는 않습니다. 각 작업에서 충돌을 발견하면 계속 노력할 것입니다. 임계 영역의 스레드가 서로를 방해하면 모든 스레드가 임계 영역에 갇히게되면 시스템 성능이 큰 영향을 미칩니다.
Lockless는 하나의 스레드가 각 경쟁에서 이길 수 있도록 새로운 조건을 추가하여 배리어 프리즈의 문제를 해결합니다. 적어도 모든 스레드가 부드럽게 실행되도록합니다.
다음 코드는 Java의 일반적인 잠금없는 계산 코드입니다.
잠금은 자바에서 일반적입니다
while (! atomicvar.compareAndset (localvar, localvar+1)) {localvar = atomicvar.get (); }1.6.4 대기하지 않습니다
잠금
모든 스레드는 제한된 단계 내에서 완료해야합니다
굶주림이 없습니다
우선, 대기중인 전제는 잠금 장치를 기준으로합니다. 잠금 장치만으로는 임계 영역에 진입 및 종료가 있어야합니다. 그러나 진입의 우선 순위가 매우 높으면 임계 영역에서 우선 순위가 낮은 일부 스레드는 배가 고프고 임계 영역을 떠날 수 없습니다. 그런 다음 대기하지 않으면이 문제가 해결되지 않아 모든 스레드가 제한된 단계 내에서 완료되어야하며 당연히 굶주림이 없습니다.
대기 시간은 가장 높은 수준의 병렬성 이므로이 시스템이 최적의 상태에 도달 할 수 있습니다.
대기하지 않고 일반적인 경우 :
읽기 스레드와 스레드 스레드가없는 경우 대기하지 않아야합니다.
읽기 스레드와 쓰기 스레드가 모두 있고 각각의 쓰기 스레드 전에 데이터를 복사 한 다음 원본 데이터를 수정하는 대신 사본을 수정하는 경우 사본 수정에 충돌이 없기 때문에 수정 프로세스도 대기하지 않습니다. 최종 동기화는 서면 데이터를 덮어 쓰는 것입니다.
대기중인 요구 사항이 상대적으로 높고 구현하기가 어렵 기 때문에 잠금 장치가 더 널리 사용됩니다.
2. 병렬성에 관한 두 가지 중요한 법률
두 법률 모두 가속 비율과 관련이 있습니다
2.1 Amdahl 's Law
직렬 시스템의 병렬화 후 가속 비율의 계산 공식 및 이론적 상한을 정의하십시오.
가속 비율 정의 : 가속 비율 = 최적화 후에 소비하기 전에 소비 된 시스템 시간 최적화 후 소비 시간
예를 들어:
가속도 비율 = 최적화 전 / 시스템 시간에 소비 된 시스템 시간 최적화 후 소비 시간 = 500 / 400 = 1.25
이 정리는 CPU 프로세서의 수를 증가시키는 것이 시스템에서 병렬 모듈의 비율을 증가시키는 데 효과적인 역할을 할 필요는 없음을 보여줍니다. 병렬 프로세서의 수를 합리적으로 늘리면 최대 투자로 최대 가속 비율을 얻을 수 있습니다.
2.2 구스타프 슨의 법칙
프로세서 수, 직렬 비율 및 가속 비율 간의 관계를 설명하십시오.
그런 다음 가속 비율 = NF (N-1) // 파생 프로세스가 생략됩니다.
평행이 충분한 한, 가속 비율은 CPU 수에 비례합니다.