경기조건

Race condition
논리 회로의 레이스 상태.여기서 ∆t1t2 논리 원소의 전파 지연을 나타낸다.입력 값 A가 로우에서 하이로 변경되면 회로는 짧은 시간 스파이크(∆t1 + ∆t2) - ∆t2 = ∆t1 출력한다.

경주 조건 또는 경주 위험은 시스템의 실질적인 행동이 통제할 수 없는 다른 이벤트의 순서 또는 타이밍에 따라 좌우되는 전자, 소프트웨어 또는 기타 시스템의 상태를 말한다.그것은 하나 이상의 가능한 행동이 바람직하지 않을 때 버그가 된다.

를 들어 1954년경에는 인종 조건이라는 용어가 이미 사용되어 있었다. 허프먼 박사학위 논문 "순차 스위칭 회로의 합성"[1]

경주 조건은 특히 논리 회로, 다중 스레드 또는 분산 소프트웨어 프로그램에서 발생할 수 있다.

전자제품에서

일반적인 경기 조건의 예는 논리 게이트가 동일한 출처로부터 다른 경로를 따라 이동한 신호를 결합할 때 발생할 수 있다.게이트에 대한 입력은 소스 신호의 변화에 대응하여 약간 다른 시간에 변경될 수 있다.출력은 잠시 동안 설계 상태로 다시 안정화되기 전에 원하지 않는 상태로 변경될 수 있다.특정 시스템은 그러한 결함을 허용할 수 있지만, 만약 이 출력이 메모리를 포함하는 추가 시스템의 클럭 신호로 기능한다면, 예를 들어 시스템은 설계된 동작으로부터 빠르게 벗어날 수 있다(실제로, 임시 결함은 영구 결함으로 된다).

예를 들어 다음과 같은 논리로 제공되는 2입력 AND 게이트를 생각해 보십시오.

한 입력과 그 부정에 대한 논리 신호 {\ A A {\ A (는 부울 부정임)는 이론상 다른 입력에 대한 로직 신호는 결코 참 값을 출력하지 않는다. If, however, changes in the value of take longer to propagate to the second input than the first when changes from false to true then a brief period will ensue during which both inputs are true, and so the gate's output wil나 또한 진실이다.[2]

중요 및 비중요 양식

내부 변수가 변경되는 순서에 따라 상태 기계가 종료될 최종 상태가 결정될 때 심각한 경기 상태가 발생한다.

비임계 경주 조건은 내부 변수가 변경되는 순서가 상태 기계가 종료될 최종 상태를 결정하지 못할 때 발생한다.

정적, 동적 및 필수 형식

정적 경주 조건은 신호와 그 보완물이 결합될 때 발생한다.

동적 경주 조건은 하나만 의도했을 때 여러 전환이 발생할 때 발생한다.그들은 관문 사이의 상호작용 때문이다.그것은 두 단계 이하의 탕구 사용으로 제거할 수 있다.

기본 레이스 조건은 입력에 총 피드백 전파 시간보다 짧은 두 번의 전환이 있을 때 발생한다.때때로 그것들은 효과적으로 입력 신호의 지속시간을 증가시키기 위해 유도 지연요소를 사용하여 경화된다.

해결책

Karnaugh 지도와 같은 설계 기법은 설계자들이 문제를 일으키기 전에 인종 조건을 인식하고 제거하도록 장려한다.종종 어떤 종류의 인종을 제거하기 위해 논리 중복을 추가할 수 있다.

이러한 문제뿐만 아니라 일부 논리 요소는 측정 가능한 상태로 진입할 수 있으며, 이는 회로 설계자에게 추가적인 문제를 야기한다.

소프트웨어에서

경합 조건은 컴퓨터 프로그램이 제대로 작동하기 위해 프로그램의 프로세스스레드의 순서나 타이밍에 따라 달라질 때 소프트웨어에서 발생한다.중요한 경주 조건은 잘못된 실행과 소프트웨어 버그를 야기한다.중요한 경기 조건은 종종 프로세스나 스레드가 일부 공유 상태에 의존할 때 발생한다.공유 상태에 대한 운영은 상호 배타적이어야 하는 중요한 부분에서 수행된다.이 규칙을 지키지 않으면 공유 상태를 손상시킬 수 있다.

데이터 경주는 일종의 경기 조건이다.데이터 레이스는 다양한 형식 메모리 모델의 중요한 부분이다.C11C++11 표준에 정의된 메모리 모델은 데이터 레이스를 포함하는 C 또는 C++ 프로그램이 정의되지 않은 동작을 가지고 있음을 명시한다.[3][4]

레이스 조건은 최종 결과가 비계수적이며 간섭 나사산 사이의 상대적 타이밍에 따라 달라지기 때문에 재생산 및 디버깅이 어려울 수 있다.따라서 디버그 모드에서 실행하거나 추가 로깅을 추가하거나 디버거를 연결할 때 이러한 성격의 문제가 사라질 수 있다.디버깅 시도 중에 이렇게 사라지는 버그를 흔히 "하이젠버그"라고 부른다.따라서 조심스러운 소프트웨어 설계로 레이스 상황을 피하는 것이 좋다.

두 개의 스레드가 각각 전역 정수 변수의 값을 1씩 증가시킨다고 가정합시다.이상적으로는 다음과 같은 작업 순서가 수행될 것이다.

나사산 1 나사산2길 정수값
0
가치를 읽다 0
가치를 높이다 0
답장을 쓰다 1
가치를 읽다 1
가치를 높이다 1
답장을 쓰다 2

위와 같은 경우에는 예상대로 최종 값이 2이다.그러나 두 개의 스레드가 잠금이나 동기화 없이 동시에 실행될 경우 작업 결과가 잘못될 수 있다.아래의 대안적 운영 순서는 이 시나리오를 보여준다.

나사산 1 나사산2길 정수값
0
가치를 읽다 0
가치를 읽다 0
가치를 높이다 0
가치를 높이다 0
답장을 쓰다 1
답장을 쓰다 1

이 경우 최종 값은 2의 예상 결과 대신 1이다.이것은 여기서 증분 연산이 상호 배타적이지 않기 때문에 발생한다.상호 배타적 운영은 메모리 위치와 같은 일부 리소스에 액세스하는 동안 중단될 수 없는 운영이다.

데이터 레이스

모든 것이 데이터 레이스를 레이스 조건의 하위 집합으로 간주하는 것은 아니다.[5]데이터 레이스의 정확한 정의는 사용 중인 공식적인 동시성 모델에 한정되지만, 일반적으로 한 스레드의 메모리 연산이 이것이 단인 상황에서 다른 스레드의 메모리 연산이 그 메모리 위치에 쓰임과 동시에 메모리 위치에 대한 접근을 잠재적으로 시도할 수 있는 상황을 가리킨다.이것은 데이터 레이스가 없는 프로그램에서도 타이밍에 의한 비결정론(noneterminism)을 가질 수 있기 때문에, 예를 들어, 모든 메모리가 원자 연산만을 사용하는 프로그램에서도 데이터 레이스가 가능하다는 것을 암시한다.

이는 많은 플랫폼에서 두 개의 스레드가 동시에 메모리 위치에 쓰일 경우 메모리 위치가 각 스레드가 쓰려고 했던 값을 나타내는 비트의 임의적이고 의미 없는 조합의 값을 결국 보유할 수 있기 때문에 위험할 수 있다. 이는 메모리 손상을 초래할 수 있다.그 결과 값은 어느 실도 쓰려고 시도하지 않은 값이다(때로는 이것을 '철저한 쓰기'라고 한다).마찬가지로, 한 스레드가 어떤 위치에서 읽히는 동안 다른 스레드가 그 스레드에 쓰이면, 읽기가 쓰기 전에 메모리 위치가 가지고 있던 값과 쓰고 있는 값을 나타내는 비트들의 어떤 임의적이고 무의미한 조합인 값을 반환하는 것이 가능할 수 있다.

많은 플랫폼에서, 동시 접속을 위해 특별한 메모리 조작이 제공된다. 그러한 경우, 일반적으로 이러한 특별한 조작을 이용한 동시 접속은 안전하지만, 다른 메모리 조작을 이용한 동시 접속은 위험하다.때로는 그러한 특수 작업(동시에 접근하기에 안전한 작업)을 원자 또는 동기화 작업이라고 하는 반면, 일반 작업(동시에 접근하기에 안전하지 않은 작업)은 데이터 작업이라고 한다.이러한 이유로 인해 데이터 레이스가 용어일 것이다. 동기화 운영만을 포함하는 레이스 조건이 있는 많은 플랫폼에서 그러한 레이스는 비결정론적일 수 있지만 그렇지 않으면 안전할 수 있다. 그러나 데이터 레이스는 메모리 손상이나 정의되지 않은 행동을 초래할 수 있다.

데이터 경주의 정의 예, 특히 동시성 모델

데이터 경쟁의 정확한 정의는 공식적인 동시성 모델에 따라 다르다.이는 동시행동이 종종 비직관적이기 때문에 때때로 공식적인 추론을 적용하기 때문이다.

N4296 초안(2014-11-19)의 C++ 표준은 1.10.23 (14페이지)[6]의 데이터 레이스를 다음과 같이 정의한다.

다음과 같은 경우 두 작업이 동시에 수행될 수 있음

  • 다른 스레드에 의해 수행된다.
  • 그것들은 순서가 없고, 적어도 하나는 신호 핸들러에 의해 수행된다.

프로그램 실행은 아래에 기술된 신호 핸들러에 대한 특별한 경우를 제외하고 최소한 원자적이 아닌 두 개의 동시 충돌 가능한 액션을 포함하는 경우 데이터 레이스를 포함한다.그러한 데이터 경합은 정의되지 않은 동작으로 귀결된다.

신호 핸들러와 관련된 이 정의의 부분은 C++에 대해 특이하며 데이터 경주의 정의에는 일반적이지 않다.

취약한 메모리 시스템에서[7] 데이터 레이스를 탐지하는 논문은 다른 정의를 제공한다.

"두 개의 메모리 작업이 동일한 위치에 액세스하고 그 중 적어도 하나가 쓰기 작업일 경우 충돌..."x와 y라는 두 개의 메모리 연산은 순차적으로 일관된 실행 형태로 레이스 〈x,y〉, iff x와 y가 충돌하며, 실행의 hb1 관계에 의해 명령되지 않는다.레이스 〈x,y〉는 적어도 x 또는 y 중 하나가 데이터 연산이라면 데이터 레이스다.

여기 같은 위치에 접속하는 두 개의 메모리 작업이 있는데, 그 중 하나는 쓰기입니다.

hb1 관계는 논문의 다른 곳에 정의되어 있으며, 전형적인 "해펜스-이전" 관계의 한 예로서, 직관적으로 우리가 하나의 메모리 조작 X가 다른 메모리 조작 Y가 시작되기 전에 실행되어 완성되도록 보장되는 상황에 있다는 것을 증명할 수 있다면, 우리는 "X는 Y 전에 일어난다"라고 말한다.만약 "X가 Y보다 먼저"나 "Y가 X보다 먼저"가 없다면, 우리는 X와 Y가 "hb1 관계에 의해 주문되지 않는다"라고 말한다.따라서 "...그리고 그것들은 집행의 hb1 관계에 의해 명령되지 않는다"라는 조항은 직관적으로 "..."로 번역될 수 있으며 X와 Y는 잠재적으로 동시적이다"라고 해석할 수 있다.

이 논문은 적어도 하나의 메모리 조작이 "데이터 조작"인 상황만 위험하다고 간주하고, 본 논문의 다른 부분에서는 "데이터 조작"과 대조적으로, 잠재적으로 동시 사용이 안전한 "동기화 작업"의 종류도 정의한다.

Java 언어 규격[8] 다른 정의를 제공한다.

적어도 하나 이상의 액세스가 쓰기인 경우 동일한 변수에 대한 두 개의 액세스(읽기 또는 쓰기 대상)가 충돌한다고 한다...프로그램에 두 개의 충돌하는 액세스(제17.4.1조)가 포함되어 있을 때, 그 이전의 관계에 의해 명령되지 않은 경우, 데이터 레이스는 데이터 레이스를 포함한다고 한다...데이터 레이스는 배열을 위해 잘못된 길이를 반환하는 것과 같은 잘못된 동작을 야기할 수 없다.

C++ 접근방식과 자바 접근방식의 중요한 차이점은 C++에서 데이터 경주는 정의되지 않은 동작인 반면, 자바에서는 데이터 경주가 단지 "스레드간 동작"[8]에 영향을 미친다는 것이다.즉, C++에서 데이터 레이스를 포함하는 프로그램을 실행하려는 시도가 (규격을 준수하는 동안) 충돌하거나 불안정하거나 기이한 동작을 나타낼 수 있는 반면, 자바에서 데이터 레이스를 포함하는 프로그램을 실행하려는 시도는 원치 않는 동시성 동작을 만들 수 있지만 그렇지 않은 경우(실행은 구현을 준수한다고 가정)규격) 금고

DRF용 SC

데이터 경주의 중요한 측면은 어떤 맥락에서 데이터 경주가 자유로운 프로그램이 순차적으로 일관성 있게 실행될 수 있도록 보장되어 프로그램의 동시 동작에 대한 추론을 크게 완화하는 것이다.그러한 보증을 제공하는 공식적인 메모리 모델은 "DRF(Data Race Freedomy를 위한 후속 일관성)" 특성을 나타낸다고 한다.이 접근방식은 최근의 합의를 달성했다고 한다(모든 경우에 순차적인 일관성을 보장하는 접근방식 또는 전혀 보장하지 않는 접근방식과 비교된다).[9]

예를 들어, Java에서는 이 보증을 직접 다음과 같이 명시한다.[8]

프로그램은 모든 순차적으로 일관된 실행이 데이터 경합에서 자유로워지는 경우에만 올바르게 동기화된다.

프로그램이 올바르게 동기화되면 프로그램의 모든 실행은 순차적으로 일관되는 것으로 나타날 것이다(제17.4.3조).

이것은 프로그래머들에게 매우 강력한 보증이다.프로그래머들은 그들의 코드에 데이터 레이스가 포함되어 있다고 판단하기 위해 재정렬에 대해 논할 필요가 없다.따라서 그들은 코드가 올바르게 동기화되었는지 여부를 판단할 때 재순서에 대해 논할 필요가 없다.코드가 올바르게 동기화되었다는 결정이 내려지면 프로그래머는 재주문이 코드에 영향을 미칠 것을 걱정할 필요가 없다.

프로그램을 올바르게 동기화하여 코드를 다시 정렬할 때 관찰할 수 있는 직관적인 행동의 종류를 피해야 한다.올바른 동기화를 사용한다고 해서 프로그램의 전반적인 동작이 올바른 것은 아니다.그러나, 그것의 사용은 프로그래머가 프로그램의 가능한 행동에 대해 간단한 방법으로 추론할 수 있게 한다; 정확히 동기화된 프로그램의 행동은 가능한 재순서에 훨씬 덜 의존한다.정확한 동기화 없이 매우 이상하고 혼란스럽고 직관에 반하는 행동이 가능하다.

대조적으로, 초안 C++ 규격은 DRF 속성에 직접적으로 SC를 필요로 하지 않고, 단지 다음과 같은 것을 제공하는 정리가 존재한다고 관측할 뿐이다.

[참고:모든 데이터 경주를 방지하기 위해 mutexes와 memory_order_seq_cst 연산을 올바르게 사용하고 다른 동기화 연산을 사용하지 않는 프로그램은 단순히 구성 스레드에 의해 실행된 연산이 인터리브된 것처럼 동작하며, 오브젝트의 각 값 계산은 해당 오브제에 대한 마지막 부작용에서 취해진다는 것을 알 수 있다.그 인터리빙에 끼어들다이것은 보통 "순차적 일관성"이라고 불린다.그러나 이는 데이터 레이스가 없는 프로그램에만 적용되며, 데이터 레이스가 없는 프로그램은 단일 스레드 프로그램 의미론을 변경하지 않는 대부분의 프로그램 변환을 관찰할 수 없다.실제로, 결과적으로 다르게 동작하는 프로그램은 정의되지 않은 연산을 수행해야 하기 때문에 대부분의 단일 스레드 프로그램 변환은 계속 허용된다.— 끝 노트

C++ 초안 사양은 유효하지만 memory_order_seq_cst가 아닌 memory_order와 동기화 작업을 사용하는 프로그램의 가능성을 인정한다는 점에 유의하십시오. 이 경우 결과는 정확하지만 순차적으로 일관성을 보장하지 않는 프로그램일 수 있다.즉, C++에서 일부 올바른 프로그램은 순차적으로 일관되지 않는다.이러한 접근방식은 C++ 프로그래머들에게 그들의 프로그램에 대한 쉬운 추론을 포기하는 비용으로 더 빠른 프로그램 실행을 선택할 수 있는 자유를 주는 것으로 생각된다.[9]

다양한 맥락에서 주어진 DRF 보증을 위해 SC를 제공하는 다양한 이론들이 종종 메모리 모델의 형태로 제공된다.이러한 이론의 전제는 일반적으로 기억 모델(따라서 구현 시)과 프로그래머에게 모두 제약을 가한다. 즉, 일반적으로 정리의 전제를 충족하지 못하며 순차적으로 일관된 방식으로 실행할 수 있는 프로그램이 보장되지 않는 경우가 있다.

DRF1 메모리 모델은[10] DRF를 위해 SC를 제공하며 WO(취약 주문), RSC(순차적으로 일관된 특수 작동으로 릴리스 일관성), VAX 메모리 모델 및 데이터 레이스가 없는 0 메모리 모델의 최적화가 가능하다.PLPC 메모리 모델은[11] DRF용 SC를 제공하며 TSO(Total Store Order), PSO, PC(Processor Consistency), RCPC(Processor Consistency Special Operation과의 Release Consistance) 모델의 최적화가 가능하다.DRFrlx는[12] 완화된 원자력이 존재하는 상태에서 DRF 정리를 위한 SC의 스케치를 제공한다.

컴퓨터 보안

많은 소프트웨어 경쟁 조건은 컴퓨터 보안과 관련이 있다.경기 조건은 공격자가 공유 리소스에 액세스할 수 있도록 하여 해당 자원을 이용하는 다른 행위자가 오작동을 일으켜 서비스[13] 거부권한 상승 등의 효과를 발생시킨다.[14][15]

특정한 종류의 경기 조건에는 술어(: 인증)를 확인한 다음 술어에 따라 행동하는 것이 포함되며, 국가는 점검 시간사용 시간 사이에 변할 수 있다.이러한 종류의 버그가 보안에 민감한 코드에 존재할 경우 TOCTTOU(Time-of-Time-to-use) 버그라는 보안 취약성이 생성된다.

레이스 조건도 하드웨어 난수 생성기물리적으로 클론 불가능한 기능을 만들기 위해 의도적으로 사용된다.[16][citation needed]PUF는 노드에 대한 경로가 동일한 회로 토폴로지를 설계하고 제조 변동에 의존하여 어떤 경로가 먼저 완료되는지 무작위로 결정함으로써 생성될 수 있다.제조된 각 회로의 특정 레이스 상태 결과 집합을 측정하여 각 회로에 대한 프로필을 수집하고 나중에 회로의 ID를 확인하기 위해 기밀을 유지할 수 있다.

파일 시스템

파일 시스템을 수정하거나 액세스하려는 시도에서 두 개 이상의 프로그램이 충돌하여 데이터 손상 또는 권한 상승이 발생할 수 있다.[14]파일 잠금은 일반적으로 사용되는 솔루션을 제공한다.보다 번거로운 해결책은 하나의 고유한 프로세스(데몬 등을 실행)가 파일에 독점적으로 액세스하도록 시스템을 구성하는 것과, 그 파일의 데이터에 액세스해야 하는 다른 모든 프로세스는 그 한 프로세스와의 프로세스 간 통신을 통해서만 그렇게 하는 것을 포함한다.이를 위해서는 프로세스 수준에서 동기화가 필요하다.

디스크 공간, 메모리 공간 또는 프로세서 사이클과 같은 사용 가능한 리소스를 갑자기 소모하여 관련이 없는 프로그램이 서로 영향을 미칠 수 있는 파일 시스템에는 다른 형태의 경쟁 조건이 존재한다.이 경주 상황을 예측하고 다루기 위해 주의 깊게 설계되지 않은 소프트웨어는 그러면 예측할 수 없게 될 수 있다.그러한 위험은 매우 신뢰할 수 있는 것으로 보이는 시스템에서 오랫동안 간과될 수 있다.그러나 결국 충분한 데이터가 축적되거나 시스템의 많은 부분을 심각하게 불안정하게 하기 위해 다른 소프트웨어가 추가될 수 있다.착륙 후 얼마 지나지 않아 화성탐사선 '스피릿'이 거의 유실될 뻔했던 것이 그 예다.해결책은 소프트웨어가 작업을 시작하기 전에 필요한 모든 리소스를 요청하고 예약하는 것이다. 이 요청이 실패하면 작업이 연기되어 장애가 발생할 수 있는 많은 지점을 피한다.또는 이러한 각 지점에는 오류 처리 기능을 갖추거나 전체 작업의 성공 여부를 나중에 확인한 후 계속할 수 있다.보다 일반적인 접근방식은 작업을 시작하기 전에 시스템 자원이 충분한지 간단히 확인하는 것이지만, 복잡한 시스템에서는 실행 중인 다른 프로그램의 동작을 예측할 수 없기 때문에 적절하지 않을 수 있다.

네트워킹

네트워킹에서 채널을 시작하는 사용자가 채널 운영자 권한을 자동으로 획득하는 IRC와 같은 분산 채팅 네트워크를 고려하십시오.동일한 네트워크의 다른 끝에서 서로 다른 서버에 있는 두 사용자가 동일한 이름의 채널을 동시에 시작하려고 시도할 경우, 각 사용자의 서버는 각 사용자에게 채널 운영자 권한을 부여하는데, 두 서버 모두 해당 채널을 할당했다는 다른 서버의 신호를 아직 수신하지 못할 것이기 때문이다.(이 문제는 다양한 IRC 서버 구현에 의해 주로 해결되었다.)

이 경기 조건의 경우, "공유 자원"의 개념은 네트워크 상태(어떤 채널이 존재하는가, 어떤 사용자가 어떤 채널을 시작했는가, 따라서 어떤 특권을 가지는가)를 포괄하는데, 각 서버는 네트워크상의 다른 서버에 변경에 대해 신호를 보내면 자유롭게 변경될 수 있어, 그 개념을 갱신할 수 있다.네트워크 상태그러나, 네트워크 전체의 지연은 설명한 경기 조건의 종류를 가능하게 한다.이 경우, 공유 자원에 대한 접근에 대한 통제 형태(예: 어떤 특권을 가지고 있는 서버를 제어하도록 한 서버)를 부과함으로써 경쟁 조건을 차단하는 것은 분산 네트워크를 중앙 집중식 네트워크(적어도 네트워크 운영의 그 한 부분에 대해)로 바꾸는 것을 의미한다.

컴퓨터 프로그램이 비차단 소켓으로 작성될 때 레이스 조건도 존재할 수 있으며, 이 경우 프로그램의 성능이 네트워크 링크의 속도에 좌우될 수 있다.

생명-중요 시스템

생명에 중요한 시스템의 소프트웨어 결함은 재앙이 될 수 있다.인종 조건은 테라크-25 방사선 치료기의 결함으로 인해 적어도 3명의 환자가 사망하고 몇 명이 더 부상을 입었다.[17]

또 다른 예는 GE Energy가 제공하고 오하이오에 본사를 둔 First Energy Corp(다른 전력 설비 중)에서 사용하는 에너지 관리 시스템이다.경보 하위 시스템에는 레이스 상태가 존재했다. 3개의 처진 전력선이 동시에 트립되었을 때, 그 상태로 인해 모니터링 기술자에게 경고가 전달되지 않아 문제에 대한 인식이 지연되었다.이 소프트웨어 결함은 결국 2003년의 북미 정전으로 이어졌다.[18]GE Energy는 나중에 이전에 발견되지 않은 오류를 수정하기 위한 소프트웨어 패치를 개발했다.

도구들

많은 소프트웨어 도구들이 소프트웨어에서 경주 조건을 감지하는 것을 돕기 위해 존재한다.그들은 크게 정적 분석 도구와 동적 분석 도구라는 두 그룹으로 분류될 수 있다.

스레드 안전 분석은 주석 기반 절차 내 정적 분석을 위한 정적 분석 도구로, 원래 gcc의 분기로 구현되었으며, 현재는 클랑에서 재구현되어 PThread를 지원한다.[19][non-primary source needed]

동적 분석 툴:

  • Intel Inspector(Intel Inspector), C/C++ 및 Fortran 애플리케이션의 안정성, 보안성 및 정확성을 높이기 위한 메모리 및 스레드 검사 및 디버깅 도구, Intel Advisor(시료 채취 기반, SIMD 벡터화 최적화 및 C# 및 Fortran 소프트웨어 개발자와 설계자를 위한 공유 메모리 스레딩 지원 도구)
  • 이진(Valgrind-based)[21][non-primary source needed] 또는 소스를 사용하는 ThreadSanitizer, LLVM 기반 계측, PThread 지원)[20][non-primary source needed] 및 POSIX pthreds 스레드 스레딩 프라이머를 사용하는 C, C++ 및 Fortran 프로그램의 동기화 오류를 탐지하는 Valgrind 도구인 Helgrind.
  • 데이터 레이스 디텍터는[22] Go Programming 언어로 데이터 레이스를 찾도록 설계되어 있다.

데이터 레이스 탐지 도구의 효과를 평가하기 위해 설계된 몇 가지 벤치마크가 있다.

  • DataRaceBench는[23] OpenMP로 작성된 다중 스레드 애플리케이션을 분석하는 데이터 레이스 탐지 도구를 체계적이고 정량적으로 평가하기 위해 설계된 벤치마크 제품군이다.

다른 영역에서는

신경과학은 인종 조건이 포유류(랫드) 뇌에서도 발생할 수 있다는 것을 입증하고 있다.[24][25]

영국의 철도 신호 전달에서, 규칙 55를 이행할 때 인종 조건이 발생할 수 있다.이 규칙에 따르면 기차가 신호에 의해 운행선에 정차하면 기관차 소방관이 신호수에게 기차가 있음을 상기시키기 위해 신호함까지 걸어가게 된다.적어도 1934년 윈윅에서는 소방관이 도착하기 전에 신호수가 다른 열차를 받아들었기 때문에 사고가 발생했다.현대적인 신호 전달 관행은 운전자가 무선으로 신호 박스와 순간적으로 접촉할 수 있게 함으로써 경주 조건을 제거한다.

참고 항목

참조

  1. ^ 허프먼, 데이비드 A. "순차 스위칭 회로의 합성."(1954년).
  2. ^ Unger, S.H. (June 1995). "Hazards, Critical Races, and Metastability". IEEE Transactions on Computers. 44 (6): 754–768. doi:10.1109/12.391185.
  3. ^ "ISO/IEC 9899:2011 - Information technology - Programming languages - C". Iso.org. Retrieved 2018-01-30.
  4. ^ "ISO/IEC 14882:2011". ISO. 2 September 2011. Retrieved 3 September 2011.
  5. ^ Regehr, John (2011-03-13). "Race Condition vs. Data Race". Embedded in Academia.
  6. ^ "Working Draft, Standard for Programming Language C++" (PDF). 2014-11-19.
  7. ^ Adve, Sarita & Hill, Mark & Miller, Barton & H. B. Netzer, Robert. (1991)취약한 메모리 시스템에서 데이터 레이싱 탐지.ACM SIGARCH 컴퓨터 아키텍처 뉴스. 19. 234-243. 10.1109/ISCA.191.1021616.
  8. ^ a b c "Chapter 17. Threads and Locks". docs.oracle.com.
  9. ^ a b Adve, Sarita V.; Boehm, Hans-J. (2010). "Semantics of Shared Variables & Synchronization (a.k.a. Memory Models)" (PDF).
  10. ^ Adve, Sarita (December 1993). Designing Memory Consistency Models For Shared-Memory Multiprocessors (PDF) (PhD thesis). Archived (PDF) from the original on 2021-12-09. Retrieved 2021-12-09.
  11. ^ 쿠로시 가라초루와 사리타 5세애드브와 아누프 굽타, 존 L.헤네시와 마크 D.Hill, 병렬 및 분산 컴퓨팅 저널, 1992년, 제15권, 399페이지-407페이지의 다양한 메모리 일관성 모델 프로그래밍
  12. ^ Sinclair, Matthew David (2017). "Chapter 3: Efficient Support for and Evaluation of Relaxed Atomics" (PDF). Efficient Coherence and Consistency for Specialized Memory Hierarchies (PhD). University of Illinois at Urbana-Champaign.
  13. ^ "CVE-2015-8461: A race condition when handling socket errors can lead to an assertion failure in resolver.c". Internet Systems Consortium. Retrieved 5 June 2017.
  14. ^ a b "Vulnerability in rmtree() and remove_tree(): CVE-2017-6512". CPAN. Retrieved 5 June 2017.
  15. ^ "security: stat cache *very large* race condition if caching when follow_symlink disabled". lighttpd. Retrieved 5 June 2017.
  16. ^ Colesa, Adrian; Tudoran, Radu; Banescu, Sebastian (2008). "Software Random Number Generation Based on Race Conditions". 2008 10th International Symposium on Symbolic and Numeric Algorithms for Scientific Computing: 439–444. doi:10.1109/synasc.2008.36. ISBN 978-0-7695-3523-4. S2CID 1586029.
  17. ^ Leveson, Nancy; Turner, Clark S. "An Investigation of Therac-25 Accidents – I". Courses.cs.vt.edu. Archived from the original on 2017-12-15.
  18. ^ Poulsen, Kevin (2004-04-07). "Tracking the blackout bug". SecurityFocus. Retrieved 2011-09-19.
  19. ^ "Thread Safety Analysis – Clang 10 documentation". clang.llvm.org.
  20. ^ "ThreadSanitizer – Clang 10 documentation". clang.llvm.org.
  21. ^ "Helgrind: a thread error detector". Valgrind.
  22. ^ "Data Race Detector". Golang.
  23. ^ "Data race benchmark suite". July 25, 2019 – via GitHub.
  24. ^ "How Brains Race to Cancel Errant Movements". Neuroskeptic. Discover Magazine. 2013-08-03.
  25. ^ Schmidt, Robert; Leventhal, Daniel K; Mallet, Nicolas; Chen, Fujun; Berke, Joshua D (2013). "Canceling actions involves a race between basal ganglia pathways". Nature Neuroscience. 16 (8): 1118–24. doi:10.1038/nn.3456. PMC 3733500. PMID 23852117.

외부 링크