이러한 변수를 수정하는 변수와 명령어로 구성된 프로그램과 동기화 기본 요소 (모니터, 뮤텍스, 자바의 동기화 또는 C #의 잠금)를 고려할 때 그러한 프로그램이 스레드로부터 안전하다는 것을 증명할 수 있습니까?
스레드 안전 또는 레이싱 조건과 같은 것을 설명하기위한 공식적인 모델이 있습니까?
이러한 변수를 수정하는 변수와 명령어로 구성된 프로그램과 동기화 기본 요소 (모니터, 뮤텍스, 자바의 동기화 또는 C #의 잠금)를 고려할 때 그러한 프로그램이 스레드로부터 안전하다는 것을 증명할 수 있습니까?
스레드 안전 또는 레이싱 조건과 같은 것을 설명하기위한 공식적인 모델이 있습니까?
답변:
프로그램이 "스레드 안전"이라는 것을 증명하는 것은 어렵습니다. 그러나 용어 "데이터 레이스"를 구체적이고 공식적으로 정의 할 수 있습니다. 또한 프로그램의 특정 실행에 대한 실행 추적이 추적 크기에 비례하여 시간에 따라 데이터 레이스를 갖는지 여부를 판별 할 수 있습니다. 이러한 유형의 분석은 최소한 1988 년으로 거슬러 올라갑니다. Barton P. Miller, 최종덕, "병렬 프로그램의 효율적인 디버깅 메커니즘", Conf. Prog. 랭 Dsgn. 및 Impl. (PLDI-1988) : 135-144 .
실행 추적이 주어지면 먼저 추적의 이벤트간에 발생하는 부분 순서를 정의합니다 . 주어진 두 이벤트 과 같은 스레드에서 발생합니다 또는 . (동일한 스레드의 이벤트는 프로그래밍 언어의 순차적 의미론에 의해 주어진 총 순서를 형성합니다.) 동기화 이벤트 (예 : 뮤텍스 획득 및 릴리스 일 수 있음)는 부분 순서 이전에 추가 스레드 간을 제공합니다. (나사 뮤텍스를 해제 한 다음 스레드 뮤텍스를 획득 한 후 획득하기 전에 릴리스가 발생한다고 말합니다.)
그런 다음 두 번의 데이터 액세스 ( 동기화 변수 가 아닌 변수에 대한 읽기 또는 쓰기 ) 과 동일한 메모리 위치에 있지만 다른 스레드와 또는 우리가 사이에 데이터 레이스가 있다고 말하는 쓰기 작업입니다 과 아니면 ...도 아니다 .
C ++ 11 표준은 좋은 예이다. C ++ 11은 동기화 객체 (뮤텍스 및 atomic<>
유형으로 선언 된 변수 )와 다른 모든 데이터를 구분합니다. C ++ 11 스펙에 따르면 프로그래머는 다중 스레드 프로그램의 트레이스에서 데이터 액세스에 대해 데이터 액세스가 모두 데이터 레이스가없는 경우 순차적으로 일관성이있는 것처럼 추론 할 수 있다고합니다.
Helgrind 도구 (Valgrind의 일부)는 여러 상용 도구 (예 : Intel Inspector XE)와 마찬가지로 이러한 종류의 데이터 기반 탐지를 수행합니다. 최신 도구의 알고리즘은 모든 스레드 및 동기화와 관련된 벡터 클록 유지를 기반으로합니다. 목적. 내가 생각 데이터 레이스 감지를위한 벡터 시계를 사용하는이 기술에 의해 개척되었다 미키 엘 Ronsse; Koen De Bosschere : "RecPlay : 완전 통합 된 실용적인 레코드 / 재생 시스템", ACM Trans. 계산. 시스. 17 (2) : 133-152, 1999에 기술되어있다 .
실질적 측면에서 C 프로그램의 스레드 안전성을 공식적으로 증명하는 데 사용할 수 있는 검증 시스템 VCC 가 있습니다.
이것은 웹 사이트에서 인용 한 것입니다.
VCC는 동시성을 지원합니다. VCC를 사용하여 거친 단위와 미세한 동시성을 모두 사용하는 프로그램을 확인할 수 있습니다. 이를 사용하여 동시성 제어 프리미티브를 검증 할 수도 있습니다. 기능을 검증하면 기능 및 데이터 구조에 대한 계약을 존중하는 동시 환경에서 스레드 안전성을 암시 적으로 보장합니다.
이것은 병렬 처리의 일종의 "아치 힐"인 경쟁 조건을 배제하는 한 프로그램 정확성을 보장하기가 매우 어려운 영역입니다. 프로그램 정확성을위한 최선의 방법은 일반적으로 저수준 프리미티브를 피하고 스레드 동기화를 보장하는 높은 수준의 디자인 패턴 (예 : 라이브러리)으로 작업하는 것입니다. Hoare의 순차적 프로세스 를 전달하는 하나의 CSP 모델이 있는데 , 개발자가 스스로 "프레임 워크"로 제한한다는 점을 감안하면 정확성에 대한 증거가 있습니다. 유닉스 "파이프와 필터"에 대한 개념적인 유사성 및 연대 기적 기원 / 중복이있다 .
디자인 패턴을 통해 병렬화 정확성을 향상 시키려고 시도하고이 목적을 위해 표준 / 알려진 알고리즘 / 디자인 패턴을 갖는 두 가지 다른 프레임 워크 :