2010-03-04 5 views
10

뮤텍스 구현을 테스트하는 가장 좋은 방법은 무엇입니까? (뮤텍스를 구현할 필요가있다. 재사용은 실행 가능한 옵션이 아니다.)뮤텍스 구현을 테스트하는 가장 좋은 방법은 무엇입니까?

최선의 방법은 많은 (N) 개의 동시 스레드가 반복적으로 보호 된 영역 (I)에 액세스하려고 시도하는 것이다. 전역에 대한 업데이트 횟수가 정확히 (N) * (I)인지 확인하기 위해 액세스 수 + 쓰기 수를 계산할 수 있도록 부작용 (예 : 전역 업데이트).

다른 제안 사항이 있으십니까?

+1

뮤텍스 (및 유사한 구조)를 테스트하는 것은 매우 어렵습니다. 기존의 테스트되고 입증 된 솔루션을 사용할 수없는 이유를 알고 싶습니다. –

+0

"사장이 나에게 말했기 때문에" –

답변

3

이 질문은이 질문에 대해 FIFO semaphore test을 생각 나게합니다. 간단히 말해서 내 대답했다 :

  • 는 사양을 경우에도, 어쩌면 (D.을 코드를 정확하게
  • 당신은 알고리즘이 사양을 충족 있음을 증명할 수있는 당신의 의도를 전달,하지만하지 않습니다크 누스)
  • 테스트하지 그들의 부재 (다 익스트라)

그래서 당신의 제안이 합리적으로 할 수있는 최선의 것, 버그의 존재를 알 수있다. 자신감을 높이고 싶다면 퍼징을 사용하여 일정과 입력을 무작위로 지정하십시오.

8

형식 증명은 이런 종류의 테스트보다 낫습니다.

테스트 결과 불만이없는 한 모든 것이 효과가 있음을 보여줍니다. 그러나 테스트는 무딘 도구입니다. 정확한 원인을 찾기 위해 정확한 순서를 실행하지 못할 수 있습니다.

뮤텍스가 모든 상황에서 작동하는지 하드웨어에서 가능한 모든 동작 순서를 테스트하는 것은 너무 어렵습니다.

테스트에는 가치가 없습니다. 그것은 당신이 명백한 코딩 오류를 만들지 않았 음을 보여줍니다.

하지만 적절한 시간에 올바른 일을 수행한다는 것을 입증하기 위해서는보다 공식적인 코드 검사가 필요합니다. 따라서 한 클라이언트가 적절한 뮤텍스에 필요한 잠금 리소스를 원자 적으로 점유하게됩니다. 많은 플랫폼에서이 기능을 구현하는 특별한 지침이 있으며, 그 중 하나를 사용하는 경우 올바른 결과를 얻을 수있는 싸울 기회가 있습니다.

마찬가지로, 릴리스가 원자적임을 보여줘야합니다.

7

뮤텍스와 같은 것으로, 테스트는 버그의 존재만을 보여줄 수있는 오래된 규칙으로 되돌아갑니다. 테스트의 1 년은 단순히 검사를 위해 코드를 작성하고 누군가가 문제를 겪고 있는지 묻는 것보다 간단합니다.

1

증명 자료가 문제가 해결되지 않으면 테스트 결과와 함께 진행하십시오. 가능한 모든 유스 케이스를 테스트하십시오. 이 물건이 얼마나 정확하게 사용될 것인지, 누가 그것을 사용할 것인지, 어떻게 다시 사용할 것인지 알아보십시오. 테스트 루트를 통과 할 때마다 각 시나리오마다 각 테스트를 여러 번 실행해야합니다 (수백만, 수십억 개, 테스트 시간으로 얻을 수있는만큼).

임의성은 제한된 수의 테스트에서 모든 시나리오를 포괄 할 수있는 최상의 기회를 제공하기 때문에 무작위로 시도하십시오. 사용되는 데이터와 사용되지는 않지만 사용할 수있는 데이터를 사용해야하며 데이터가 잠금을 엉망으로 만들지는 않았는지 확인하십시오.

실제로 수학과 공식 방법에 대한 지식이 없으면 실제로 증명할 수있는 기회가 없습니다.

4

나는 다른 사람들과 함께 이것이 결정적으로 증명하기가 엄청나게 어렵다는 것을 알고 있으며, 어떻게하는지 잘 모른다 - 나는 도움이되지 않는다!

뮤텍스를 구현한다고 말하면 재사용은 옵션이 아닙니다. 사용중인 플랫폼/OS에 뮤텍스가 구현되지 않았거나 다른 이유로 인해 기술적 이유가 있습니까? OS 레벨 '잠금'의 일부 양식을 포장하고 Mutex 구현 옵션 (예 : windoze의 CriticalSection, posix 조건 변수)을 호출하고 있습니까? 당신이 낮은 수준의 OS 잠금 장치를 감쌀 수 있다면, 제대로 작동 할 확률은 훨씬 높습니다.

아직 작성하지 않았다면 Herb Sutter's Effective Concurrency 개의 기사를 읽으십시오. 이러한 가치가있는 물건이 있어야합니다.

어쨌든, 몇 가지 당신의 검사 결과에 고려 :

  • 를 뮤텍스는 재귀의 경우, 일부 참조 카운팅 테스트를 할 수 있도록 (즉 동일한 스레드는 여러 번 잠글 수 있습니다).
  • 글로벌 변수가 인 경우이 변수가 가변 변수 인 경우 에 직접 기록 할 수없는 것이 가장 좋을 것입니다. 예를 들어, 8 비트 플랫폼에서 인 경우 다중 어셈블리 명령어로 작성해야하는 16 비트 또는 32 비트 변수를 사용하십시오.
  • 조심스럽게 어셈블리 목록을 검사하십시오. 어셈블리가 코드가 최적화 될 수있는 방법으로 직접 변환되지 않지만 하드웨어 플랫폼에 따라 다릅니다 ...
  • 코드를 작성하지 않은 다른 사람에게도 일부 테스트를 작성하십시오.
  • 다른 사양과 많은 다른 기계에 대한 테스트는

행운 (이 '범용'이 아닌 특정 하드웨어 설정을위한라고 가정) 수!

+0

쓰고있는 값의 크기에 관해 좋은 지적. 내 주요 쟁점은 컴파일러 내장 함수를 통해 액세스 한 프로세서 작업의 조합이 이론적으로나 논리적으로 (알고리즘 적으로 정확한지) 정확하고 실제적으로 올바른지 확인하는 것입니다 (논리적으로 올바른 알고리즘에 충실하게 컴파일 된 구현 임) – grrussel