문제

이론적으로,그것이 있어야 가능한 최소한 무력 검증의 잠금 알고리즘(만 있도록 다양한 조합의 함수 호출에 교차하).는 도구가 있습 또는 형식적인 추론 프로세스를 사용할 수 있는 실제로 증명되는 자물쇠-무료 알고리즘은 정확한(그것은 이상적으로도 확인할 수 있에 대한 경쟁 조건 및 ABA 문제 뿐만)?

참고:당신이 알고 있는 경우는 방법을 증명 하나의 포인트(예:만 있음을 증명에서 안전 ABA 문제)또는 문제가 나는 언급하지 않은 그 후 어쨌든 솔루션.에서 최악의 경우에,각 방법에서 수행 할 수 있습 돌을 완전히 확인합니다.

도움이 되었습니까?

해결책

당신은 확실히 시도해야합 회전 모델 검사.

당신이 쓰는 프로그램 같은 모델에서 간단한 C-언어라는 Promela,스핀을 내부적으로 변환 상태 기계입니다.모델가 포함될 수 있습 여러 개의 병렬 프로세스입니다.

What 회전 다음이 확인 가능한 모든의 인터리브 지침 에서 각 프로세스 어떤 조건을 테스트할 --일반적으로,부재의 경쟁 조건에서 자유로 교착 상태 등.대부분의 이러한 테스트를 수 있습니다 쉽게 사용하여 작성 assert() 문입니다.이 있는 경우는 모든 가능한 실행 시퀀스를 위반하는 주장을,순서를 인쇄,그렇지 않으면 당신은"모든 분명".

(물론,실제 사실이 그것을 사용하여 많은 애호가와 빠른 알고리즘 이것을 달성하기 위하여는,하지만 그 효과가 있습니다.기본적으로,모든 연결할 수 있는 프로그램 상태 확인합니다.)

놀라운 프로그램으로,그것은 2001 ACM 시스템 소프트웨어를 수상 (다른 수상자 포함한 유닉스,포스트스크립트,Apache,TeX).나는 그것을 사용하기 시작하고,매우 빠르게와 부부의 일이었을 구현할 수있는 모델의 MPI 기능 MPI_Isend()MPI_Irecv() 에 Promela.스핀의 까다로운 경쟁 조건에 하나의 세그먼트의 병렬 코드로 변환하 Promela 테스트합니다.

다른 팁

스핀은 실제로 우수하지만 고려하십시오 RACE RACE DETECTER Dmitriy v'jukov. 비 블로킹 (대기/잠금) 알고리즘을 포함한 동시 알고리즘을 검증하기위한 목적으로 제작되었습니다. 오픈 소스이며 자유롭게 라이센스가 부여됩니다.

RER REPACE 및 Windows Synchronization Primitives (Mutexes, 조건 변수, 세마포어, 크리 치어 서, Win32 이벤트, 인터 로크*등)를 제공하므로 실제 C ++ 구현을 검증을 위해 REPACE에 공급할 수 있습니다. Remela 및 Spin과 같이 알고리즘의 별도 모델을 개발할 필요가 없습니다.

Relacy는 C ++ 0x를 제공합니다 std::atomic (승리에 대한 명시 적 메모리 주문!) 따라서 사전 프로세서를 사용할 수 있습니다. #defines Relacy의 구현과 자체 플랫폼 특정 원자 구현을 선택하려면 (TBB :: Atomic, 부스트 :: 원자, 등).

스케줄링은 제어 가능합니다 : 무작위, 컨텍스트 바운드 및 전체 검색 (가능한 모든 인터 리핑)을 사용할 수 있습니다.

다음은 예제 Relacy 프로그램입니다. 주목해야 할 몇 가지 사항 :

  • 그만큼 $ 실행 정보를 기록하는 Relacy 매크로입니다.
  • rl::var<T> 검증의 일부로 고려해야하는 "정상"(비 원자) 변수.

코드:

#include <relacy/relacy_std.hpp>

// template parameter '2' is number of threads
struct race_test : rl::test_suite<race_test, 2>
{
    std::atomic<int> a;
    rl::var<int> x;

    // executed in single thread before main thread function
    void before()
    {
        a($) = 0;
        x($) = 0;
    }

    // main thread function
    void thread(unsigned thread_index)
    {
        if (0 == thread_index)
        {
            x($) = 1;
            a($).store(1, rl::memory_order_relaxed);
        }
        else
        {
            if (1 == a($).load(rl::memory_order_relaxed))
                x($) = 2;
        }
    }

    // executed in single thread after main thread function
    void after()
    {
    }

    // executed in single thread after every 'visible' action in main threads
    // disallowed to modify any state
    void invariant()
    {
    }
};

int main()
{
    rl::simulate<race_test>();
}

일반 컴파일러와 컴파일 (RERACY는 헤더 전용)과 실행 파일을 실행합니다.

struct race_test
DATA RACE
iteration: 8

execution history:
[0] 0:  atomic store, value=0, (prev value=0), order=seq_cst, in race_test::before, test.cpp(14)
[1] 0:  store, value=0, in race_test::before, test.cpp(15)
[2] 0:  store, value=1, in race_test::thread, test.cpp(23)
[3] 0:  atomic store, value=1, (prev value=0), order=relaxed, in race_test::thread, test.cpp(24)
[4] 1:  atomic load, value=1, order=relaxed, in race_test::thread, test.cpp(28)
[5] 1:  store, value=0, in race_test::thread, test.cpp(29)
[6] 1: data race detected, in race_test::thread, test.cpp(29)

thread 0:
[0] 0:  atomic store, value=0, (prev value=0), order=seq_cst, in race_test::before, test.cpp(14)
[1] 0:  store, value=0, in race_test::before, test.cpp(15)
[2] 0:  store, value=1, in race_test::thread, test.cpp(23)
[3] 0:  atomic store, value=1, (prev value=0), order=relaxed, in race_test::thread, test.cpp(24)

thread 1:
[4] 1:  atomic load, value=1, order=relaxed, in race_test::thread, test.cpp(28)
[5] 1:  store, value=0, in race_test::thread, test.cpp(29)
[6] 1: data race detected, in race_test::thread, test.cpp(29)

최근 버전의 Relacy는 이런 종류의 일이 있다면 Java 및 CLI 메모리 모델도 제공합니다.

데이터 레이스 탐지는 NP 어려운 문제입니다 [Netzer & Miller 1990

도구 Lockset과 DJIT+에 대해 들었습니다 ( 가르치십시오 CDP 과정에서). 슬라이드를 읽고 참조하는 것을 인터넷 검색하십시오. 흥미로운 정보가 포함되어 있습니다.

어떤 플랫폼이나 언어를 사용하고 있는지 모르겠지만 .NET 플랫폼에는 Microsoft Research 프로젝트가 있습니다. 체스 잠금 장치를 포함하여 멀티 스레드 구성 요소를 수행하는 사람들을 돕는 데 매우 유망한 것으로 보입니다.

나는 그것을 엄청나게 사용하지 않았습니다.

그것은 실제로 버그를 야생으로 강제로 강요 할 수있는 가장 긴밀한 방법으로 실을 명시 적으로 인터리브하여 작동합니다 (원유 설명). 또한 코드 분석과 유사한 일반적인 실수와 나쁜 패턴을 찾기 위해 코드를 분석합니다.

과거에는 추가 상태 추적 정보를 추가하는 해당 코드 (#IF 블록 등)의 특수 버전을 구축했습니다. 그런 다음 단위 테스트 내에 담을 수있는 수, 버전 등.

문제는 코드를 작성하는 데 시간이 훨씬 더 걸리며 이미 존재하는 코드의 기본 구조를 변경하지 않고는 항상 이런 종류의 물건을 추가 할 수는 없습니다.

작은 인스턴스를 철저히 테스트하는 것과는 달리 잠금 코드를 실제로 확인하려면 VCC를 사용할 수 있습니다.http://vcc.codeplex.com), 동시 C 코드를위한 연역 검증자인 흥미로운 잠금 알고리즘 (예 : 위험 포인터, 낙관적 다중 계산 처리, MMU 가상화, 다양한 동기화 프리미티브 등을 사용하여 잠금없는 목록 및 재개 가능한 해시블)을 검증했습니다. 모듈 식 검증을 수행하며 사소한 산업 코드 덩어리 (최대 약 20kloc)를 검증하는 데 사용되었습니다.

그러나 VCC는 버그 사냥 도구가 아니라 검증 자입니다. 검증하기 위해 코드에 상당한 주석을 달아야하며 학습 곡선이 약간 가파르게 될 수 있습니다. 또한 대부분의 도구와 마찬가지로 순차적 일관성을 가정합니다.

BTW, 피어 검토는 동시 알고리즘 (또는 순차적 알고리즘)을 확인하는 좋은 방법이 아닙니다. 중요한 저널에 동시 알고리즘을 출판하는 유명한 사람들의 오랜 역사가 있으며 몇 년 후에 버그를 발견했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top