2008-09-23 5 views
11

테스트 세트 Wikipedia entry을 읽은 후에도 "테스트 및 설정은 무엇이 사용 되나요?"라는 질문이 남아 있습니다.테스트 - 앤 - 세트 란 무엇입니까?

위키 백과에서 설명한 뮤텍스를 구현하는 데 사용할 수 있다는 것을 알고 있지만 다른 용도는 무엇입니까?

답변

8

작업을 수행 한 후 메모리에 데이터를 쓰고 시작할 때 다른 스레드가 대상을 덮어 쓰지 않았 으면 할 때마다이 코드를 사용하십시오. lock/mutex-free algorithms가 많으면이 양식을 작성하십시오.

1

기본적으로, 그 용도는 정확하게 원 자성의 엄청난 중요성을 고려할 때 뮤텍스를위한 것입니다. 그게 전부 야.

테스트 - 앤 - 세트는 비 원자력과 더 빠른 두 가지 다른 명령어 (멀티 프로세서 시스템에서는 원자력이 하드웨어 오버 헤드를 부담 함)로 수행 할 수있는 연산이므로 일반적으로 다른 이유로 사용할 수 없습니다.

13

"증분"의 좋은 예입니다.

두 스레드가 a = a + 1을 실행한다고 가정하면 값 100으로 시작하는 a이라고 말하십시오. 두 스레드가 동시에 실행중인 경우 (멀티 코어) 모두 a100으로로드하고 101으로 증가시켜 다시 a에 저장합니다. 잘못된!

테스트 설정을 사용하면 "을 101으로 설정하십시오. 단, 현재 값이 100 인 경우에만 설정하십시오." 이 경우 한 스레드는 해당 테스트를 통과하지만 다른 스레드는 실패합니다. 실패한 경우 스레드는 전체 명령문을 다시 시도 할 수 있습니다. 이번에는 a101으로로드합니다. 성공.

이것은 일반적으로하기 때문에 뮤텍스를 사용하는 것보다 빠르다 : 경쟁 조건이없는 대부분의 시간

  1. 때문에 업데이트가 뮤텍스의 일종을 취득 할 필요없이 발생합니다.
  2. 충돌 중에도 한 스레드는 전혀 차단되지 않으며 다른 스레드가 스핀하고 재 시도하는 것이 더 빠릅니다. 일부 뮤텍스를 위해 줄을 서서히 일시 중단하는 것보다 빠릅니다.
+0

+1 방금 작업 한 문제를 해결하는 데 도움이되었습니다. –

+9

@ jason-cohen : 실제로 [Compare and Swap] (https://en.wikipedia.org/wiki/Compare-and-swap)에 대한 설명입니다. 테스트 및 설정은 일반적으로 값 0 및 1 만 포함합니다. ** set ** 부분은 지정된 메모리 위치의 값을 1로 설정하는 것을 가리 킵니다. 이전 값인 1 또는 0을 반환하고이 모든 작업을 수행합니다 단일 원자 조작으로. –

+2

@ GregSlepak이 맞습니다. 이것은 compare_and_swap입니다. test_and_set()은 부울 포인터를 대상으로 가져 와서 TRUE로 설정하고 포인터의 원래 값을 반환합니다. test_and_set (& lock)의 반환 값 (& lock의 원래 값)이 참이면 핵심 섹션을 입력합니다. – mateor

0

다른 스레드가 이미 변경하지 않았다면 공유 값을 가져 와서 변경하고 값을 변경해야 할 때 사용됩니다.

실용적인 용도로는 동시 대기열 (세마포 또는 뮤텍스를 필요로하지 않고 여러 스레드로 푸시/팝 될 수있는 대기열)의 구현에있는 것을 본 마지막 때입니다.

왜 뮤텍스가 아닌 TestAndSet을 사용합니까? 일반적으로 뮤텍스보다 오버 헤드가 적기 때문입니다. 뮤텍스가 OS 개입을 필요로하는 곳에서는 TestAndSet을 CPU에서 단일 원자 명령어로 구현할 수 있습니다. 100 개의 스레드가있는 병렬 환경에서 실행될 때 코드의 중요한 부분에 하나의 뮤텍스가 심각한 병목 현상을 일으킬 수 있습니다.

+0

mutex는 내부적으로 test & set을 사용할 수 있습니다. TestAndSet과 뮤텍스를 어떻게 비교합니까? 나는 그것이 맞은 비교라고 생각하지 않는다. – user1762571

+0

파이썬에서 뮤텍스 객체는 명시 적으로 "testandset"메소드를 가지고있다. 이 문서는 그것을 "원자 적"으로 인용하여 인용문을 사용하여 자신감을 고취시키지 않지만 두 개념이 상호 배타적이지 않음을 나타냅니다. –

5

은행 계좌 신청서를 작성하고 신청서에 계좌에서 10 파운드 (예 : 영어)를 인출하도록 요청했다고 가정 해보십시오. 따라서 현재 계좌 잔액을 지역 변수로 읽고 인출액을 뺀 다음 잔액을 메모리에 다시 써야합니다.

하지만 값을 읽고 쓰는 중에 또 다른 동시 요청이 발생하면 어떻게해야합니까? 해당 요청의 결과가 첫 번째 계정으로 완전히 덮어 쓸 수 있고 계정 잔액이 잘못 될 가능성이 있습니다.

테스트 및 설정을 사용하면 덮어 쓰기가 있어야한다고 생각하는 값을 확인하여 문제를 해결하는 데 도움이됩니다. 이 경우 저울이 원래 값 이었는지를 확인할 수 있습니다. 원자이기 때문에 방해 할 수 없으므로 아무도 읽기와 쓰기 사이에서 당신 밑에서 양탄자를 꺼낼 수 없습니다.

같은 문제를 해결할 수있는 또 다른 방법은 메모리 위치를 잠그는 것입니다. 불행하게도, 잠금 장치는 옳고, 추론하기가 어렵고, 확장 성 문제가 있으며, 실패 상황에서 나쁘게 작동하기 때문에 엄청나게 어렵 기 때문에 이상적인 (그러나 실용적인) 해결책은 아닙니다. 테스트 - 앤 - 세트 방식은 일부 소프트웨어 트랜잭션 메모리의 기초를 형성하며, 충돌시 모든 트랜잭션을 동시에 실행할 수 있도록 모든 트랜잭션을 동시에 실행할 수 있습니다.

관련 문제